JVM垃圾回收2
1.Heap分区
Young——保存刚实例化的对象,当该区被填满时,GC会将对象移至Old区。
Older
Permanent——负责保存反射对象
2.JVM有两个GC线程
第一个线程负责回收Heap的young区;
第二个线程在Heap不足时,遍历Heap,将young区升级为Older区。Older区大小等于-Xmx减去-Xmn,不能将-Xms设得过大,第二个GC线程被迫运行时会降低JVM性能。
3.为什么一些程序频繁调用GC?
程序调用了System.gc()或Runtime.gc()。
第三方程序调用了自己的GC()方法,此时需要参数来禁止这些GC;
Java默认的Heap太小。
频繁实例化对象,Release对象。尽量保存并重用对象。
4. GC类型——四种
第一种为单线程GC,也是默认的GC,适用于单CPU机器。
第二种为Throughput GC,是多线程GC,适用于多CPU,使用大量的线程的程序。与第一种相比,不同之处在于GC在收集Young区是多线程的,但在Older区仍采用单线程。-XX:+UseParallelGC参数启动该GC。
第三种为Concurrent Low Pause GC,类似第一种,适用于多cpu,并要求缩短因GC造成程序停滞的时间,这种GC在Older区回收的同时运行应用程序。 -XX:+UseConcMarkSweepGC参数启动该GC。
第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间,这种GC可以在Young区回收的同时,回收一部分Older区对象。
-Xincgc参数启动该GC。
5.注意事项
增大Heap大小虽会降低GC的频率,但会加大每次GC的时间,当GC运行时,所有的用户线程都被暂停,即在GC期间,Java应用程序不做任何工作。
Heap大小并不决定进程的内存使用量,因Java也为其它任务分配内存,如每个线程的Stack。