APP下载
报价宝  ›  科技  › 

详解JAVA的GC机制与JVM优化引数总结

报价宝 来源:baojiabao.com 发布时间:2019-09-19 18:11:00 11月15日更新
报价宝综合消息详解JAVA的GC机制与JVM优化引数总结

概述

JAVA提供了垃圾回收器(garbage collector)来自动检测物件的作用域),可自动把不再被使用的储存空间释放掉,也就是说,GC机制可以有效地防止内存泄露以及内存溢位。

GC任务

JAVA 垃圾回收器的主要任务是:

分配内存确保被引用物件的内存不被错误地回收回收不再被引用的物件的内存空间凡事都有两面性。垃圾回收器在把程序员从释放内存的复杂工作中解放出来的同时,为了实现垃圾回收,garbage collector必须跟踪内存的使用情况,释放没用的物件,在完成内存的释放之后还需要处理堆中的碎片, 这样做必定会增加JVM的负担。

JAVA 内存区域

先看看JAVA程式在执行的时候,内存究竟是如何划分的。

私有内存区的区域名称和相应的特性如下表所示:

这里主要说一下虚拟机器栈中的区域性变量表,里面存放了三个资讯:

各种基本资料型别(boolean、byte、char、short、int、float、long、double)物件引用(reference)returnAddress地址这个returnAddress和程式计数器有什么区别?前者是指示JVM的指令执行到哪一行,后者则是程式码执行到哪一行。

私有内存区伴随着执行绪的产生而产生,一旦执行绪中止,私有内存区也会自动消除。

JAVA堆

堆内存是由存活和死亡的物件组成的。存活的物件是应用可以访问的,不会被垃圾回收。死亡的物件是应用不可访问尚且还没有被垃圾收集器回收掉的物件。一直到垃圾收集器把这些物件回收掉之前,他们会一直占据堆内存空间。

堆是应用程序在执行期请求操作系统分配给自己的向高地址扩充套件的资料结构,是不连续的内存区域。用一句话总结堆的作用:程式执行时动态申请某个大小的内存空间。

新生代:刚刚新建的物件在Eden中,经历一次Minor GC,Eden中的存活物件就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活物件又会被复制送入第二块survivor space S1。S0和Eden被清空,然后下一轮S0与S1交换角色,如此循环往复。如果物件的复制次数达到16次,该物件就会被送到老年代中。

老年代:如果某个物件经历了几次垃圾回收之后还存活,就会被存放到老年代中。老年代的空间一般比新生代大。

不过实际执行中,Major GC会伴随至少一次 Minor GC,因此也不必过多纠结于到底是哪种GC(在有些资料中看到把full GC和Minor GC等价的说法)。

那么,当我们建立一个物件后,它会被放在堆内存的哪个部分呢?

如果Major GC之后还是老年代不足,那JVM就会丢掷内存不足的异常。

JVM优化引数

1. 与序列回收器相关的引数

-XX:+UseSerialGC:在新生代和老年代使用序列回收器。

-XX:+SuivivorRatio:设定 eden 区大小和 survivor 区大小的比例。

-XX:+PretenureSizeThreshold:设定大物件直接进入老年代的阈值。当物件的大小超过这个值时,将直接在老年代分配。

-XX:MaxTenuringThreshold:设定物件进入老年代的年龄的最大值。每一次 Minor GC 后,物件年龄就加 1。任何大于这个年龄的物件,一定会进入老年代。

2. 与并行 GC 相关的引数

-XX:+UseParNewGC: 在新生代使用并行收集器。

-XX:+UseParallelOldGC: 老年代使用并行回收收集器。

-XX:ParallelGCThreads:设定用于垃圾回收的执行绪数。通常情况下可以和 CPU 数量相等。但在 CPU 数量比较多的情况下,设定相对较小的数值也是合理的。

-XX:MaxGCPauseMills:设定最大垃圾收集停顿时间。它的值是一个大于 0 的整数。收集器在工作时,会调整 Java 堆大小或者其他一些引数,尽可能地把停顿时间控制在 MaxGCPauseMills 以内。

-XX:GCTimeRatio:设定吞吐量大小,它的值是一个 0-100 之间的整数。假设 GCTimeRatio 的值为 n,那么系统将花费不超过 1/(1+n) 的时间用于垃圾收集。

-XX:+UseAdaptiveSizePolicy:开启自适应 GC 策略。在这种模式下,新生代的大小,eden 和 survivor 的比例、晋升老年代的物件年龄等引数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。

3. 与 CMS 回收器相关的引数

-XX:+UseConcMarkSweepGC: 新生代使用并行收集器,老年代使用 CMS+序列收集器。

-XX:+ParallelCMSThreads: 设定 CMS 的执行绪数量。

-XX:+CMSInitiatingOccupancyFraction:设定 CMS 收集器在老年代空间被使用多少后触发,预设为 68%。

-XX:+UseFullGCsBeforeCompaction:设定进行多少次 CMS 垃圾回收后,进行一次内存压缩。

-XX:+CMSClassUnloadingEnabled:允许对类元资料进行回收。

-XX:+CMSParallelRemarkEndable:启用并行重标记。

-XX:CMSInitatingPermOccupancyFraction:当永久区占用率达到这一百分比后,启动 CMS 回收 (前提是-XX:+CMSClassUnloadingEnabled 激活了)。

-XX:UseCMSInitatingOccupancyOnly:表示只在到达阈值的时候,才进行 CMS 回收。

-XX:+CMSIncrementalMode:使用增量模式,比较适合单 CPU。

4. 与 G1 回收器相关的引数

-XX:+UseG1GC:使用 G1 回收器。

-XX:+UnlockExperimentalVMOptions:允许使用实验性引数。

-XX:+MaxGCPauseMills:设定最大垃圾收集停顿时间。

-XX:+GCPauseIntervalMills:设定停顿间隔时间。

5. 其他引数

-XX:+DisableExplicitGC: 禁用显示 GC。

常用引数如下

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 手机价格 汽车价格 电视机价格 耳机价格 降噪耳机价格