当前位置: 首页 > news >正文

JVM 常见配置参数

JVM 配置常见参数
Java虚拟机的参数,在启动jar包的时候通过java 命令指定JVM参数
在这里插入图片描述

-options表示Java虚拟机的启动参数,class为带有main()函数的Java类,args表示传递给主函数main()的参数。

一、系统查看参数:

-XX:+PrintVMOptions可以在程序运行时打印虚拟机接收到
-XX:+PrintCommandLineFlags可以打印传递给虚拟机的显式和隐式参数,打印出包括配置文件在内的配置
-XX:+PrintFlagsFinal,它会打印所有的系统参数的值

1.1.1 查看当前系统的垃圾回收器使用的是哪种

jinfo -flags [进程pid]

找到-useXXXX这样的参数,参数后即为所使用的GC回收器
在这里插入图片描述
在这里插入图片描述

[xxx@localhost vpdm]$  jinfo -flags 17049
Attaching to process ID 17049, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.341-b10
Non-default VM flags: -XX:CICompilerCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=null -XX:InitialHeapSize=805306368 -XX:MaxHeapSize=805306368 -XX:MaxNewSize=268435456 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=268435456 -XX:OldSize=536870912 -XX:+PrintFlagsFinal -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:  -Xms768m -Xmx768m -XX:+PrintFlagsFinal -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dumplog/dumplog.log

1.1 堆的配置参数

最大堆和初始堆的设置 参数 -Xms -Xmx
新生代的配置 参数-Xmn 参数-XX:SurvivorRatio用来设置新生代中eden区和from/to区的比例
-XX:SurvivorRatio可以设置eden区与survivor的比例。-
-XX:NewRatio可以设置老年代与新生代的比例。
参数-Xmn可以用于设置新生代的大小。设置一个较大的新生代会减小老年代的大小,这个参数对系统性能及GC行为有很大的影响。新生代的大小一般设置为整个堆空间的1/3到1/4。
参数-XX:SurvivorRatio用来设置新生代中eden区和from/to区的比例,它的含义如下

在这里插入图片描述
在JDK 1.6、JDK 1.7中,方法区可以理解为永久区(Perm)。在JDK 1.8、JDK1.9、JDK1.10中,永久区已经被彻底移除。取而代之的是元数据区,元数据区大小可以使用参数-XX:MaxMetaspaceSize指定(一个大的元数据区可以使系统支持更多的类),这是一块堆外的直接内存

Perm区域的参数配置由-XX:MaxMetaspaceSize 替换

1.2 堆OOM 导出堆的参数配置

参数-XX: +HeapDumpOnOutOfMemoryError 配置堆异常时导出
-XX:HeapDumpPath=./dumplog/dumplog.log 配置都出 堆 dump文件的路径

nohup java -Xms768m -Xmx768m  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dumplog/dumplog.log    -jar xxxxxx.jar > logs/xxxxxx.log 2>&1 &

1.3非堆内存的参数配置

1.3.1方法区配置

-XX:MaxMetaspaceSize指定永久区的最大可用值
在JDK1.6和JDK1.7等版本中,可以使用-XX:PermSize和-XX:MaxPermSize配置永久区大小

1.3.2 栈配置

-Xss参数指定线程的栈大小

1.3.2 直接内存配置

参数 -XX:MaxDirectMemorySize

1.4 GC 垃圾回收器常见参数

1.4.1 与串行回收器相关的参数

·-XX:+UseSerialGC:在新生代和老年代使用串行回收器。
·-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例。
·-XX:PretenureSizeThreshold:设置大对象直接进入老年代的阈值。当对象的大小超过这个值时,将直接被分配在老年代。
·-XX:MaxTenuringThreshold:设置对象进入老年代的年龄的最大值。每一次 Minor GC后,对象年龄就加1。任何大于这个年龄的对象,一定会进入老年代。

1.4.2.与并行GC相关的参数

·-XX:+UseParNewGC(考虑到兼容性问题,JDK 9、JDK 10已经删除):在新生代使用并行回收器。
·-XX:+UseParallelOldGC:老年代使用并行回收器。
·-XX:ParallelGCThreads:设置用于垃圾回收的线程数。通常情况下可以和CPU数量相等,但在CPU数量比较多的情况下,设置相对较小的数值也是合理的。
·-XX:MaxGCPauseMillis:设置最大垃圾回收停顿时间。它的值是一个大于0的整数。回收器在工作时,会调整 Java 堆大小或者其他一些参数,尽可能地把停顿时间控制在MaxGCPauseMillis以内。
·-XX:GCTimeRatio:设置吞吐量大小。它的值是一个 0 到 100之间的整数。假设GCTimeRatio的值为n ,那么系统将花费不超过1/(1+n )的时间用于垃圾回收。
·-XX:+UseAdaptiveSizePolicy:打开自适应GC策略。在这种模式下,新生代的大小、eden区和survivior区的比例、晋升老年代的对象年龄等参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡。

1.4.3.与CMS回收器相关的参数(JDK9、JDK10已经开始废弃CMS回收器,建议使用G1回收器)

·-XX:+UseConcMarkSweepGC:新生代使用并行回收器,老年代使用CMS+串行回收器。
·-XX:ParallelCMSThreads:设定CMS的线程数量。
·-XX:CMSInitiatingOccupancyFraction:设置 CMS 回收器在老年代空间被使用多少后触发,默认为68%。
·-XX:+UseCMSCompactAtFullCollection:设置 CMS 回收器在完成垃圾回收后是否要进行一次内存碎片的整理。
·-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩。
·-XX:+CMSClassUnloadingEnabled:允许对类元数据区进行回收。
·-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收(前提是激活了-XX:+CMSClassUnloadingEnabled)。
·-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阈值的时候才进行CMS回收。
·-XX:+CMSIncrementalMode:使用增量模式,比较适合单CPU。增量模式在JDK8中标记为废弃,并且将在JDK9中彻底移除。

1.4.4.与G1回收器相关的参数

·-XX:+UseG1GC:使用G1回收器。
·-XX:MaxGCPauseMillis:设置最大垃圾回收停顿时间。
·-XX:GCPauseIntervalMillis:设置停顿间隔时间。

1.4.5.TLAB相关

·-XX:+UseTLAB:开启TLAB分配。
·-XX:+PrintTLAB(考虑到兼容性问题,JDK 9、JDK 10不再支持此参数):打印TLAB相关分配信息。
·-XX:TLABSize:设置TLAB区域大小。
·-XX:+ResizeTLAB:自动调整TLAB区域大小。

1.4.6.其他参数

·-XX:+DisableExplicitGC:禁用显式GC。
·-XX:+ExplicitGCInvokesConcurrent:使用并发方式处理显式GC。

1.5 GC 日志打印

1.5.1 JDK8 GC 日志打印参数

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseSerialGC -Xmx1m -Xloggc:./gc-serial.log
参数	功能
-XX:+PrintGC	使用这个参数启动Java虚拟机后,只要遇到GC,就会打印日志
-XX:+PrintGCDetails	输出GC的详细日志,参数-XX:+PrintGCDetails还会使虚拟机在退出前打印堆的详细信息,详细信息描述了当前堆的各个区间的使用情况
-XX:+PrintGCTimeStamps	输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps	输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC		在进行GC的前后打印出堆的信息。还可以使用参数-XX:+PrintHeapAtGC(考虑到兼容性,从JDK9开始已经删除此参数,查看堆信息可以使用VisualVM,第6章将会讲述)
-Xloggc:gc.log	日志文件的输出路径

在这里插入图片描述
该日志显示,一共进行了4次GC,每次GC占用一行,在GC前,堆空间使用量约为4MB,在GC后,堆空间使用量为377KB,当前可用的堆空间总和约为16MB(15936KB)。最后,显示的是本次GC所
花的时间。

1.5.2 JDK9、JDK10 GC日志参数

.-XX:+PrintGC(在JDK9、JDK10中建议使用-Xlog:gc),使用这个参数启动Java虚拟机后,只要遇到GC,就会打印日志,JDK9、JDK10默认使用G1作为垃圾回收器,使用参数-Xlog:gc来打印GC日志

-Xlog:gc* 打印GC 日志详情,JDK9、JDK10建议使用-Xlog:gc*

-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息。还可以使用参数-XX:+PrintHeapAtGC(考虑到兼容性,从JDK9开始已经删除此参数,查看堆信息可以使用VisualVM,第6章将会讲述)

在这里插入图片描述
从这个输出中可以看到,系统经历了3次GC,第1次仅为新生代GC,回收的效果是新生代从回收前的8MB左右降低到1MB。整个堆从22MB左右降低到17MB。
第2次(加粗部分)为Full GC,它同时回收了新生代、老年代和永久区。日志显示,新生代在这次GC中没有释放空间(严格来说,这是GC日志的一个小bug,事实上,在这次FullGC完成后,新生代被清空,由于GC日志输出时机的关系,各个版本JDK的日志多少有些不太精确的地方,读者需要留意),老年代从16MB降低到13MB。整个堆大小从26MB左右降低为13MB左右(这个大小完全与老年代
实际大小相等,因此也可以推断,新生代实际上已被清空)。永久区的大小没有变化。日志的最后显示了GC所花的时间,其中user表示用户态CPU耗时,sys表示系统CPU耗时,real表示GC实际经历的时间。

透过日志看垃圾收集器

Serial收集器:新生代显示 “[DefNew”,即 Default New Generation
ParNew收集器:新生代显示“[ParNew”,即 Parallel New Generation Parallel
Scavenge收集器:新生代显示"[PSYoungGen",JDK1.7使用的即PSYoungGen Parallel
Old收集器:老年代显示"[ParoldGen" G1收集器:显示”garbage-first heap“

1.6 GC 日志分析

参考 https://www.cnblogs.com/dtyy/p/15873735.html
参考 https://blog.csdn.net/xyz9353/article/details/119190661

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 汇聚荣科技有限公司怎么样?
  • 人工智能应用层岗位—AI项目经理/AI产品经理
  • 【MySQL】MySQL的安装和基本概念
  • 亚马逊云科技专家分享 | OPENAIGC开发者大赛能量加油站6月5日场预约开启~
  • 文化设计“All in AI”,第二十届文博会中芬设计园分会场盛大开幕
  • 顺序表实现通讯录项目
  • HackTheBox-Machines--Cronos
  • vue使用EventBus进行跨组件通信
  • Android刮刮卡自定义控件
  • Oracle按照主键排序分页sql
  • 2.Redis之Redis的背景知识
  • 可选链与空值合并运算符的妙用
  • C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
  • python:大文件分批/块导入数据库方式记录
  • 富格林:可信方法防备暗箱操作
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular 响应式表单 基础例子
  • ComponentOne 2017 V2版本正式发布
  • CSS实用技巧干货
  • Django 博客开发教程 8 - 博客文章详情页
  • js正则,这点儿就够用了
  • Kibana配置logstash,报表一体化
  • k个最大的数及变种小结
  • oldjun 检测网站的经验
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Redis在Web项目中的应用与实践
  • 关于for循环的简单归纳
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聚簇索引和非聚簇索引
  • 看域名解析域名安全对SEO的影响
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端面试之CSS3新特性
  • 前端学习笔记之观察者模式
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 数组的操作
  • ​【已解决】npm install​卡主不动的情况
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​数据结构之初始二叉树(3)
  • ## 基础知识
  • #HarmonyOS:Web组件的使用
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)appium-desktop定位元素原理
  • (一一四)第九章编程练习
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (总结)Linux下的暴力密码在线破解工具Hydra详解