-
JVM 内存结构
需要用来调优的主要就是堆和垃圾回收器,基于两个方面调优,一个是Responsiveness, 一个是Throughput(例如一次做多执行多少次transaction)
-
自动垃圾回收
第一步标记已经使用过的内存
第二步删除unreferenced objects
第三步压缩
上述方法效率不高,原因就是随着越来越多的Object 被分配,导致越来越长时间的垃圾回收,实际情况是很多被分配的Object存在的时间很短。如下图
3.JVM Generations
堆被分布三个部分: Young Generation, Old or Tenured Generation, and Permanent Generation
Young Generation是新分配的objects被分配的地方。当它满了会产生一个
minor garbage collection。根据object存在时间少的特性,回收效率很高。同时minor garbage collection 会产生一个Stop the World Event,所有的应用线程都会停止,直至这个Event结束。
Old Generation 是用来存储活的长的Object的地方。阈值就是当Young Generation内某些达到一定的存活年龄。最终Old Generation也要被回收,这个回收事件就叫major garbage collection,它也是一个Stop the World Event,但是会很慢,因为涉及到所有的活的objects。
Permanent generation 包含一些Metadata,它产生于JVM的runtime。
-
Generational Garbage Collection Process
Object首先被分配到Eden, 两个survior space 都是空的。
当eden space 满了产生一个minor garbage collection
回收过程,Referenced objects移到第一个survivor space。其他的删除
下一个minor garbage collection 的时候如下发生Unreferenced objects 被删,referenced objects移到第二个survivor space,同时第一个survivor space内存活的Object年龄会加一,S0 和 eden被清空
再到达下一次minor garbage collection
当年龄达到一定程度,一些objects就会移到old generation,产生一个promotion
随着minor GCs继续,更多的objects就会移到old generation
最后就会产生major GC回收old generation
参考文献
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html