2019-07-11

垃圾回收


-XmsJVM启动的时候设置初始堆的大小

-Xmx设置最大堆的大小

-Xmn设置年轻代的大小

-XX:PermSize设置持久代的初始的大小

-XX:MaxPermSize设置持久代的最大值


堆被分成三个代:新生代,老年代,持久代

年轻代:所有创建的新对象都是在年轻代分配堆空间

老年代:老年代用于存储较长生命周期的对象,当年轻代被填满的时候,

随着时间的推移,老年代也会被填满,最终导致老年代也要进行垃圾回收。这个事件叫做大收集。

大收集也是全局暂停事件。通常大收集比较慢

全局暂停事件:所有的小收集都是一个个全局暂停事件。这意味着所有的应用线程都会停止,直到收集操作完成。小回收总会导致全局暂停事件。

持久代:持久代存储了描述应用程序类和方法的元数据。

回收方法:可达性分析算法

方法区中静态属性引用的对象;方法区中常量引用的对象,栈中变量引用的对象。

通过一系列称为“GC Roots”对象作为起点,从这些节点,向下搜索,搜索所走过的路径称为引用链,当一个对象到GCRoots没有任何引用链的时候,证明此对象不可达,也就证明对象没有引用,则会被回收。

java可以作为GCroots对象的有:虚拟机栈中本地变量表引用的对象;本地方法栈中native方法引用的对象;方法区中静态属性引用的对象;方法区中常量引用的对象;

JVM垃圾收集器的种类:

1:X:+UseSerialGC 串行收集器(使用单个的虚拟CPU)

2:X:+UseParallelGC

使用这个命令行参数,就会将年轻代设置为多线程的收集器,老年代使用单线程的收集器。该选项,还会在老年代进行单线程的压缩工作

3:X:+UseParallelOldGC使用该参数,年轻代和老年代都会使用多线程的收集器,同时,也使用多线程的压缩收集器

4::+UseConcMarkSweepGC

如果要使用CMS收集器,使用 -XX:+UseConcMarkSweepGC ,同时,可以设置并发的线程数目 -XX:ParallelCMSThreads=

5:X:+UseG1GC

设计的初衷是用于长期取代CMS收集器加入了整理

你可能感兴趣的:(2019-07-11)