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。 

你可能感兴趣的:(垃圾回收)