JVM 使用参数

本文探讨了在Java应用中遇到性能问题时如何通过合理配置JVM参数来解决,重点介绍了-Xms、-Xmx、-Xmn、-Xss、-XX:MaxPermSize、-XX:NewRatio、-XX:SurvivorRatio、-XX:MaxTenuringThreshold等关键参数的作用,并详细阐述了如何利用堆内存快照技术进行问题定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    一般情况下,我们默认安装的JDK在运行一个java程序理想状态下是不会出现OOM等问题的。所以我没必要去配置一些JVM参数。但是当我们遇到OOM等一些性能问题时,配置JVM参数就成了我们制胜的法宝。

    最为大家熟知的想必就是-Xms与-Xmx(-XX:InitialHeadSize/-XX:MaxHeapSize)这俩个设置堆的初始和最大大小的参数。当然我们大多数时候我们为了避免每次垃圾回收之后jvm重新分配内存我们会将这俩个的值设置成一样的。

 eg. java -Xms3g -Xmx3g -Xmn2g -Xss128k -XX:MaxPermSize=256m -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=0 -verbose:gc -Xloggc:gc.log

  -Xms3g 设置jvm初始内存为3g

  -Xmx3g 设置jvm最大内存为3g

  -Xmn2g设置年轻代内存为1g

  -Xss128k设置每个线程分配的栈大小为128k

  -XX:MaxPermSize=256m设置永久代最大大小为256m

  -XX:NewRatio=4 设置年轻代(包括Eden区和两个Survivor区)与年老代(除去永久代)的比值。这里设置为4,表示年轻代与年老代的比值为1:4,则年轻代占年轻代和年老代的1/5.

  -XX:SurvivorRatio=4 设置Eden区和Survivor区的比值。这里设置为4.表示Eden区与Survivor区(注意这里有俩个Survivor区)的比为4:2,Survivor区占整个年轻代的1/6.

  -XX:MaxTenuringThreshold=0设置垃圾收集最大年龄。如果设置为0的话,对象在年轻代不经过Survivor区直接进入年老代。如果将这个值设置较大,将会增加对象在年轻代的停留时间,对象将会在Survivor区进行多次复制才能进入老年代。

  -verbose:gc:设置显示垃圾收集信息

  -Xloggc:gc.log:指定垃圾收集日志文件

     堆内存快照:解决各种OOM的良药

    假如我们将-Xmx设置成一个合适的值,那么我们将面对OOM的风险,而如果这个OOM发生在应用运行后几个礼拜才出现,那么就给我调试发现问题带来了不少的难度。幸运的是,如果在发生OOM时我们生成保留了Heap Dump,那么对与我们分析问题就事半功倍了。我们可以设置-XX:+HeapDumpOnOutOfMemoryError让jvm发生内存溢出时自动生成堆内存快照。默认这个对内存快照会保存在JVM启动目录下名为:java_pid<pid>.hprof的文件里(这里的<pid>就是JVM进程的进程号)。当然我们也可以通过设置-XX:HeapDumpPath=<path>来改变默认的堆内存快照存放的路径,这个<path>可以使绝对路径也可以是相对路径。

   -XX:OnOutOfMemoryError当内存发生溢出时我们可以执行一些指令或做一些相应的处理。

eg:java -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/headdump.hprof 

       -XX:OnOutOfMemoryError="sh ~/operate.sh"  HelloWorld

 

   待补充... ...

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值