JVM调优参数-程序员宅基地

技术标签: jvm  

JVM调优参数

一、配置方式

  • java [options] MainClass [arguments]

  • options - JVM启动参数。 配置多个参数的时候,参数之间使用空格分隔。

  • 参数命名: 常见为 -参数名

  • 参数赋值: 常见为 -参数名=参数值 | -参数名:参数值
    在这里插入图片描述

二、内存参数

  • -Xms:初始堆大小,JVM启动的时候,给定堆空间大小。
    -Xms3550m,设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

  • -Xmx:最大堆大小,JVM运行过程中,如果初始堆空间不足的时候,最大可以扩展到多少。
    -Xmx3550m:设置JVM最大可用内存为3550M。

  • -Xmn:设置年轻代大小。
    整个堆大小 = 年轻代大小 + 老年代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
    -Xmn2g:设置年轻代大小为2G。

  • -Xss: 设置每个线程的Java栈大小。
    JDK5.0以后每个线程Java栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
    -Xss128k:设置每个线程的堆栈大小为128k。

  • -XX:NewSize=n:设置年轻代大小。

  • -XX:NewRatio=n:设置年轻代(包括Eden和两个Survivor区)与年老代的比值
    比如设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

  • -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。
    注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5。

  • -XX:MaxPermSize=n:设置永久代大小
    -XX:MaxPermSize=16m:设置持久代大小为16m。

  • -XX:MaxTenuringThreshold=n:设置垃圾最大年龄。
    如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。


三、回收器参数

JVM给了三种选择:串行收集器、并行收集器、并发收集器。串行收集器只适用于小数据量的情况。

  • -XX:+UseSerialGC: 设置串行收集器。

  • -XX:+UseParallelGC: 设置并行收集器,表示年轻代使用并行收集器。

  • -XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。

  • -XX:+UseParallelOldGC: 设置并行年老代收集器,JDK6.0支持对年老代并行收集。

  • -XX:+UseConcMarkSweepGC: 设置年老代并发收集器CMS。

  • -XX:+UseG1GC: 设置G1收集器

  • -XX:ParallelGCThreads=n: 设置并行收集器收集时最大线程数使用的CPU数。并行收集线程数。

  • -XX:MaxGCPauseMillis=n: 设置并行收集最大暂停时间,单位毫秒。可以减少STW时间。

  • -XX:GCTimeRatio=n: 设置垃圾回收时间占程序运行时间的百分比。公式为 1/(1+n) 并发收集器设置

  • -XX:+CMSIncrementalMode: 设置为增量模式。适用于单CPU情况。

  • -XX:+UseAdaptiveSizePolicy: 设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

  • -XX:CMSFullGCsBeforeCompaction=n: 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。

  • -XX:+UseCMSCompactAtFullCollection: 打开对年老代的压缩。可能会影响性能,但是可以消除碎片。


四、辅助参数

JVM提供了大量命令行参数,打印信息,供调试使用。商业项目上线的时候,不允许使用。一定使用loggc。主要有以下一些:

  • -XX:+PrintGC
    输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]
    [Full GC 121376K->10414K(130112K), 0.0650971 secs]

  • -XX:+PrintGCDetails
    输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
    [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

  • -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用
    输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

  • -XX:+PrintGCApplicationConcurrentTime: 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
    输出形式:Application time: 0.5291524 seconds

  • -XX:+PrintGCApplicationStoppedTime: 打印垃圾回收期间程序暂停的时间。可与上面混合使用
    输出形式:Total time for which application threads were stopped: 0.0468229 seconds

  • -XX:PrintHeapAtGC: 打印GC前后的详细堆栈信息

  • -Xloggc:filename: 与上面几个配合使用,把相关日志信息记录到文件以便分析。


五、调优建议

5.1 年轻代大小选择

响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达老年代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

5.2 老年代大小选择

  • 响应时间优先的应用: 老年代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:

    • 并发垃圾收集信息
    • 持久代并发收集次数
    • 传统GC信息
    • 花在年轻代和年老代回收上的时间比例

    减少年轻代和老年代花费的时间,一般会提高应用的效率

  • 吞吐量优先的应用: 一般吞吐量优先的应用都有一个很大的年轻代和一个较小的老年代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而老年代尽存放长期存活对象。

5.3 较小堆引起的碎片问题

因为老年代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:

  • -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
  • -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对老年代进行压缩

参考文档:JVM系列三:JVM参数设置、分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44668898/article/details/121672377

智能推荐

注射器针头测试-程序员宅基地

文章浏览阅读331次,点赞11次,收藏5次。穿透力小于10牛,但对于所有其他测试,100牛的能力是合适的。为了规范到达医疗保健一线的产品,注射器针头的测试标准是必要的。穿透基板的选择对于从测试中收集有效数据至关重要,并且确保在测试之前教授基板层对于获得可重复的结果也非常重要。这包括针的拔出力和穿透力。对于与基于墨盒的笔式注射器一起使用的针头,如典型的胰岛素笔,针头组件和笔之间的相互作用也必须进行测试。ASTM F3014概述了特定于弯曲针头的针头穿透力评估,Instron提供了一种专门的弯曲针头系统,能够应用旋转运动而不是线性力来适应这种应用。

RuoYi-vue主要功能介绍_ruo-yi=vue-程序员宅基地

文章浏览阅读197次。RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。后端前端。_ruo-yi=vue

Qlearning和SARSA:基于值函数的强化学习方法-程序员宅基地

文章浏览阅读793次,点赞19次,收藏22次。1. 背景介绍1.1 强化学习简介强化学习(Reinforcement Learning,简称RL)是一种机器学习方法,它通过让智能体(Agent)在环境(Environment)中与环境进行交互,学习如何根据当前状态选择最优的行动,以达到最大化累积奖励的目标。强化学习的核心问题是学习一个策略(Po

如何利用tushare获得上市公司的日线行情_tushare怎么取一个股票的全部日k线-程序员宅基地

文章浏览阅读1.5k次。利用tushare获得上市公司的日线行情_tushare怎么取一个股票的全部日k线

linux命令行下读取u盘内容_Linux复制U盘文件(命令行)-程序员宅基地

文章浏览阅读1.7k次。某些Linux系统具有一个界面,并且某些不仅仅具有命令窗口,因此导入外部文件变得困难并且没有视觉上的便利。在这里,通过安装USB闪存驱动器来复制文件。首先安装USB闪存盘:这里以centos为例1、进入命令行模式并输入命令sudo -i以获得root特权。2、mkdir / usb //创建用于安装U盘的目录3、fdisk -l //检查安装在系统中的U盘。如果系统具有硬盘sdb1,则表示您的U盘..._麒麟下命令行访问u盘文件

基于C/C++的easyx图形库教程_c++ easyx-程序员宅基地

文章浏览阅读648次,点赞14次,收藏13次。easyx图形库_c++ easyx

随便推点

java学习-day04-程序员宅基地

文章浏览阅读29次。用户量、适用面、与时俱进、自身特点(面向对象、安全性、多线程、跨平台、简单易用、开源)2、记事本设置:设置-首选项-新建-windows-java-ANSI(设置后才可输入输出中文)2、记事本设置:设置-首选项-新建-windows-java-ANSI(设置后才可输入输出中文)开发工具:javac-编译工具,java-运行工具等等】------JDK:java开发工具包。3、java重点版本:java5、java8、java17。3、java重点版本:java5、java8、java17。

习题4-2 求幂级数展开的部分和 (20分)-程序员宅基地

文章浏览阅读3.3k次,点赞7次,收藏4次。习题4-2 求幂级数展开的部分和 (20分)题目描述已知函数 exe^xex 可以展开为幂级数 1 + xxx + x2/2!x^2/2!x2/2! + x3/3!x^3/3!x3/3! + ⋅⋅⋅···⋅⋅⋅ + xk/k!x^k/k!xk/k! + ⋅⋅⋅···⋅⋅⋅。现给定一个实数 xxx,要求利用此幂级数部分和求 exe^xex 的近似值,求和一直继续到最后一项的绝对值小于0.0000..._习题4-2 求幂级数展开的部分和

图论之~~~二分图匹配;_acm图论二分图-程序员宅基地

文章浏览阅读206次。 首先来了了解下二分图的定义::二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 估计大家看起来都不是太懂~~没事这里有简单版本::(转载于:https..._acm图论二分图

nagios在linux的部署_nagios linux部署-程序员宅基地

文章浏览阅读339次。系统环境:RedHat-5.4-linux-x86_64-DVD实验流程:1.搭建一个干净的环境(生产机就算了),nagios的运行需要apache和php的支持2.查看下nagios的源码包和nrpe的源码包的版本是否匹配(当nagios、nagios-plugin和nrpe的版本不匹配,会出现ERROR-could not complete SSL handshake)。在主机上安装这3个源码包。3.在监控的分机上安装nagios-plugin和nrpe两个源码包,不需要安装nagios的客户端。4.在_nagios linux部署

.NET WPF教程(16)——WPF中的数据绑定(②)_mode=twoway oneway 失去焦点-程序员宅基地

文章浏览阅读753次。三、绑定模式 通过上一文章中的示例,学习了简单的绑定方式。在这里的示例,要学习一下绑定的模式,和模式的使用效果。 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项,去改变TextBlock的背景色。将 TextBlock 的背景色绑定到在 ListBox 中选择的颜色。在下面的代码中针..._mode=twoway oneway 失去焦点

power bi数据分析_Power BI数据模型:使用关系-程序员宅基地

文章浏览阅读2.3k次。power bi数据清洗 In this article, we look at how to create different types of relationships between two or more tables in the Power BI data model. 在本文中,我们研究如何在Power BI数据模型中的两个或多个表之间创建不同类型的关系。 An..._power bi 不同的关联产生数据不同