常用JVM参数参考


一、前言

1、这里有几个比较重要的指标:

  • 内存占用:程序正常运行需要的内存大小。
  • 延迟:由于垃圾收集而引起的程序停顿时间。
  • 吞吐量:用户程序运行时间占用户程序和垃圾收集占用总时间的比值。

和CAP原则一样,同时满足一个程序内存占用小、延迟低、高吞吐量是不可能的,程序的目标不同,调优时所考虑的方向也不同,在调优之前,必须要结合实际场景,有明确的的优化目标,找到性能瓶颈,对瓶颈有针对性的优化,最后进行测试,通过各种监控工具确认调优后的结果是否符合目标。

2、调优原则

GC的时间足够的小

GC的次数足够的少

发生Full GC的周期足够的长

针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值。

年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代,比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小。

年轻代和年老代设置多大才算合理? 如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。Full GC尽量少,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理。通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间。

3、优化程序的内存使用

除了选择合适的垃圾回收器和调整垃圾回收器的参数外,还可以通过优化程序的内存使用来提高垃圾回收性能。

1、尽量避免创建过多的临时对象
临时对象是指在程序执行过程中创建的、只使用一次的对象。创建过多的临时对象会增加垃圾回收的压力。可以通过重用对象、使用对象池等方式来减少临时对象的创建。

2、及时释放不再使用的对象
在程序中,如果有一些对象不再使用,应该及时将其置为null,以方便垃圾回收器回收这些对象。不及时释放不再使用的对象,会导致垃圾回收器扫描更多的对象,从而降低程序的性能。

3、减少内存泄漏
内存泄漏是指程序中存在一些对象引用没有被释放,使得这些对象无法被垃圾回收器回收。虽然Java的垃圾回收器可以处理一些内存泄漏的情况,但最好是在编写程序时避免内存泄漏的产生,以提高垃圾回收性能。

4、案例

public class GCDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            String str = new String("String " + i);
            list.add(str);
        }

        // 释放不再使用的对象
        list.clear();
        list = null;

        System.gc(); // 显式触发垃圾回收
    }
}

5、常用JVM参数参考

参数说明实例
-Xms初始堆大小,默认物理内存的1/64-Xms512M
-Xmx最大堆大小,默认物理内存的1/4-Xms2G
-Xmn新生代内存大小,官方推荐为整个堆的3/8-Xmn512M
-Xss线程堆栈大小,jdk1.5及之后默认1M,之前默认256k-Xss512k
-XX:NewRatio=n设置新生代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:NewRatio=3
-XX:SurvivorRatio=n年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:8,表示Eden:Survivor=8:1:1,一个Survivor区占整个年轻代的1/8-XX:SurvivorRatio=8
-XX:PermSize=n永久代初始值,默认为物理内存的1/64-XX:PermSize=128M
-XX:MaxPermSize=n永久代最大值,默认为物理内存的1/4-XX:MaxPermSize=256M
-verbose:class在控制台打印类加载信息
-verbose:gc在控制台打印垃圾回收日志
-XX:+PrintGC打印GC日志,内容简单
-XX:+PrintGCDetails打印GC日志,内容详细
-XX:+PrintGCDateStamps在GC日志中添加时间戳
-Xloggc:filename指定gc日志路径-Xloggc:/data/jvm/gc.log
-XX:+UseG1GC年轻代设置G1垃圾收集器
-XX:MetaspaceSize初始元空间内存大小(个人认为不需要配置,因为用不了这么多)
-XX:MaxMetaspaceSize最大元空间内存大小(个人认为不需要配置,因为用不了这么多)
-XX:+UseSerialGC年轻代设置串行收集器Serial
-XX:+UseParallelGC年轻代设置并行收集器Parallel Scavenge
-XX:ParallelGCThreads=n设置Parallel Scavenge收集时使用的CPU数。并行收集线程数。-XX:ParallelGCThreads=4
-XX:MaxGCPauseMillis=n设置Parallel Scavenge回收的最大时间(毫秒)-XX:MaxGCPauseMillis=100
-XX:GCTimeRatio=n设置Parallel Scavenge垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)-XX:GCTimeRatio=19
-XX:+UseParallelOldGC设置老年代为并行收集器ParallelOld收集器
-XX:+UseConcMarkSweepGC设置老年代并发收集器CMS
-XX:+CMSIncrementalMode设置CMS收集器为增量模式,适用于单CPU情况。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java8中的JVM参数有很多种,这里列出一些常用的: - -server: 指定JVM运行在服务器模式,在服务器环境下性能会更好 - -Xmx: 设置JVM最大可用内存 - -Xms: 设置JVM初始内存 - -XX:PermSize: 设置持久代(Perm Gen)的初始空间大小 - -XX:MaxPermSize: 设置持久代(Perm Gen)的最大空间大小 - -XX:NewSize: 设置新生代(Young Generation)的初始空间大小 - -XX:MaxNewSize: 设置新生代(Young Generation)的最大空间大小 还有很多其他的JVM参数,如果需要了解更多,可以查看Java官方文档或者网上的资料. ### 回答2: Java 8引入了一些新的JVM参数,以下是其中一些常用参数: 1. -XX:MaxHeapSize:指定Java堆的最大大小。可以使用数值后缀(例如G、M)来表示大小。例如,-XX:MaxHeapSize=2G表示最大堆大小为2GB。 2. -XX:InitialHeapSize:指定Java堆的初始大小。同样可以使用数值后缀来表示大小。 3. -XX:PermSize和-XX:MaxPermSize:用于指定永久代的初始大小和最大大小。在Java 8中,永久代被元数据空间(Metaspace)所取代,所以这两个参数在Java 8中已经失效。 4. -Xms和-Xmx:分别指定Java堆的初始大小和最大大小,相当于-XX:InitialHeapSize和-XX:MaxHeapSize的简写形式。 5. -Xss:指定每个线程的栈大小。默认值在不同平台上可能有所不同。 6. -XX:+UseParallelGC:启用并行垃圾收集器。在Java 8中,G1垃圾收集器已成为默认的垃圾收集器,所以这个参数在大多数情况下已不再使用。 7. -XX:+AggressiveOpts:启用一些针对特定体系结构的性能优化选项。 8. -XX:+UseConcMarkSweepGC:启用并发标记-清除垃圾收集器。这是Java 8中常用的垃圾收集器之一。 请注意,这只是一小部分Java 8中的JVM参数,还有很多其他参数可以根据特定需求进行配置。了解更多参数以及其作用可以参考官方文档或其他相关资源。 ### 回答3: Java 8引入了一些新的JVM参数,用于调优和提升性能。以下是一些常见的Java 8的JVM参数: 1. -XX:+UseG1GC:这个参数启用了G1垃圾收集器。G1是在Java 8中引入的一种全新的垃圾收集器,它通过将堆分成多个区域进行垃圾回收,以提供更稳定的垃圾收集性能。 2. -XX:+UseConcMarkSweepGC:此参数启用了CMS垃圾收集器。CMS垃圾收集器在Java 8之前就存在,但在Java 8中仍然可以使用。它是一种并发标记清除垃圾收集器,可用于减少垃圾收集停顿时间。 3. -XX:MaxGCPauseMillis:此参数用于设置期望的最大垃圾收集停顿时间(以毫秒为单位)。可以根据具体需求调整该值,以平衡垃圾收集的性能和停顿时间。 4. -XX:MetaspaceSize和-XX:MaxMetaspaceSize:这些参数用于设置元空间的初始大小和最大大小。元空间是在Java 8中引入的一种用于存储类元数据的新空间,取代了永久代,因此在Java 8中不再使用-XX:PermSize和-XX:MaxPermSize参数。 5. -XX:+UseStringDeduplication:此参数用于启用字符串去重。它可以降低内存消耗,避免相同字符串的重复存储。 6. -XX:ParallelGCThreads和-XX:ConcGCThreads:这些参数用于设置并行垃圾收集器和并发垃圾收集器的线程数。可以根据计算机的硬件资源和应用程序的需求来调整这些参数,以达到最佳性能。 总之,Java 8引入了一些新的JVM参数,可以根据应用程序的需求来调整这些参数,以获得更好的性能和吞吐量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值