Daniel-Journey Weekly Dose –2011/1/8
Architecture
Java
使maven2在下载依赖包的同时下载其源代码包
1. 使用maven命令:mvn dependency:sources 下载依赖包的源代码。
2. 使用参数: -DdownloadSources=true 下载源代码jar。 -DdownloadJavadocs=true 下载javadoc包。
Protocol Buffers, Avro, Thrift & MessagePacks
Thread-Local Allocation Buffers
快速分配
从下文对垃圾收集器的描述中可以看出,在许多情况下,内存中都有大块的连续空闲空间用以满足对象的分配请求。这种情形下的分配操作使用简单的“bump-the-pointer”技术,效率很高。按照这种技术,JVM内部维护一个指针(allocatedTail),它始终指向先前已分配对象的尾部,当新的对象分配请求到来时,只需检查代中剩余空间(从allocatedTail到代尾geneTail)是否足以容纳该对象,并在“是”的情况下更新allocatedTail指针并初始化对象。下面的伪代码具体展示了从连续内存块中分配对象时分配操作的简洁性和高效性:
void * malloc(int n){
if( geneTail – allocatedTail < n )doGarbageCollection();
void * wasAllocatedTail = allocatedTail;
allocatedTail += n;
return wasAllocatedTail;
}
对于多线程应用,分配操作必须是线程安全的。如果使用全局锁为此提供保证,则分配操作必定成为一个性能瓶颈。基于此,HotSport JVM采用了一种被称为“线程局部分配缓冲区”(Thread-Local Allocation Buffers,TLAB)的技术。该项技术为每个线程提供一个独立的分配缓冲区(伊甸区的一小部分),借此来提高分配操作的吞吐量。因为针对每个TLAB,只有一个线程从中分配对象,故而分配操作可以使用“bump-the-pointer”技术快速完成,而不必使用任何锁机制;只有当线程将其已有TLAB填满并且需要获取一个新的TLAB时,同步才是必须的。同时,为了减少TLAB所带来的空间消耗,还使用了一些其他技术,例如,分配器能够把TLAB的平均大小限制在伊甸区的1%以下。
“bump-the-pointer”和TLAB技术的组合保证了分配操作的高效性,类似new Object()这样的操作在大部分时间内只需要大约10条机器指令即可完成
NEW
至今尚未启动的线程处于这种状态。
RUNNABLE
正在 Java 虚拟机中执行的线程处于这种状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。
BLOCKED
受阻塞并且正在等待监视器锁的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Object.wait 之后再次进入同步的块/方法。
WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。某一线程因为调用下列方法之一而处于等待状态:
1、不带超时值的 Object.wait
2、不带超时值的 Thread.join
3、LockSupport.park
处于等待状态的线程正等待另一个线程,以执行特定操作。 例如,已经在某一对象上调用了 Object.wait() 的线程正等待另一个线程,以便在该对象上调用 Object.notify() 或 Object.notifyAll()。已经调用了 Thread.join() 的线程正在等待指定线程终止。
TIMED_WAITING
具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:
1、Thread.sleep
2、带有超时值的 Object.wait
3、带有超时值的 Thread.join
4、LockSupport.parkNanos
5、LockSupport.parkUntil
TERMINATED
已终止线程的线程状态。线程已经结束执行。
关于Lazy-UnLocking(Reservation Lock)对Java锁的性能优化
关于JVM的Thin Lock, Fat Lock, SPIN Lock与Tasuki Lock
TLAB全称叫 Thread Local Allocation Buffer),Sun JDK为了提高对象生成的效率,在Eden哪里为每一个新创建的线程创造一个这么样的空间。TLAB的大小一般都是由JVM 运行计算得出的,但是可以通过-XX:TLABWasteTargetPercent来设置TLAB可占用的Eden Space
的百分比,默认值为1%。
在TLAB分配内存时不需要加锁,因为在堆上分配内存时候要加锁,所以在TLAB分配时效率快很多。当然 这只是适合小对象分配。其分配细节取决于具体的GC。
Windows
Windows 性能监控
perfmon.msc 性能监视器
Windows uses the term “Privileged Time” to represent kernel or system CPU Utilization.
typeperf
LINUX
user 在internal时间段里,用户态的CPU时间(%) ,不包含 nice值为负 进程 usr/total*100
nice 在internal时间段里,nice值为负进程的CPU时间(%) nice/total*100
system 在internal时间段里,核心时间(%) system/total*100
iowait 在internal时间段里,硬盘IO等待时间(%) iowait/total*100
irq 在internal时间段里,软中断时间(%) irq/total*100
soft 在internal时间段里,软中断时间(%) softirq/total*100
idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%) idle/total*100
intr/s 在internal时间段里,每秒CPU接收的中断的次数 intr/total*100
CPU总的工作时间=total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点。
