高级java人员都用过的17个jvm参数

JVM调优篇 点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 基础概念 一般JVM调优,重点在于调整JVM堆大小、调整垃圾回收器 JVM调优常用参数 -Xmx1024m:最大堆内存,当物理内存不超过192m时最大堆内存为物理内存的一半,否则为物理内存的四分一 -Xms1024m:最小堆内存,一般设置为与-Xmx同等值 jcmd:专用于查看JVM状态,可以查看正在运行的进程,会显示出进程号 jmap -heap 10864:查看进程号为. 阅读详情

前言

大家都知道,jvm在启动的时候,会执行默认的一些参数。一般情况下,这些设置的默认参数应对一些平常的项目也够用了。

但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫明的挂掉,想查看下gc日志来排查一下错误的原因,都需要咱们手动设置这些参数。

各个参数介绍

1.verbose:gc

表示,启动jvm的时候,输出jvm里面的gc信息。格式如下:

[Full GC 178K->99K(1984K), 0.0253877 secs]

解读 :Full GC 就表示执行了一次Full GC的操作,178K 和99K 就表示执行GC前内存容量和执行GC后的内存容量。1984K就表示内存总容量。后面那个是执行本次GC所消耗的时间,单位是秒。

2.-XX:+printGC

这个打印的GC信息跟上个一样,就不做介绍了。

3.-XX:+PrintGCDetails

打印GC的详细信息。格式如下:

–Heap
– def new generation total 13824K, used 11223K [0x27e80000, 0x28d80000, 0x28d80000)
– eden space 12288K, 91% used [0x27e80000, 0x28975f20, 0x28a80000)
– from space 1536K, 0% used [0x28a80000, 0x28a80000, 0x28c00000)
– to space 1536K, 0% used [0x28c00000, 0x28c00000, 0x28d80000)
– tenured generation total 5120K, used 0K [0x28d80000, 0x29280000, 0x34680000)
– the space 5120K, 0% used [0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)
– compacting perm gen total 12288K, used 142K [0x34680000, 0x35280000, 0x38680000)
– the space 12288K, 1% used [0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)
– ro space 10240K, 44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
– rw space 12288K, 52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)

解读:new generation 就是堆内存里面的新生代。total的意思就是一共的,所以后面跟的就是新生代一共的内存大小。used也就是使用了多少内存大小。0x开头的那三个分别代表的是 底边界,当前边界,高边界。也就是新生代这片内存的起始点,当前使用到的地方和最大的内存地点。

eden space 这个通常被翻译成伊甸园区,是在新生代里面的,一些创建的对象都会先被放进这里。后面那个12288K就表示伊甸园区一共的内存大小,91% used,很明显,表示已经使用了百分之多少。后面的那个0x跟上一行的解释一样。

from space 和to space 是幸存者的两个区。也是属于新生代的。他两个区的大小必须是一样的。因为新生代的GC采用的是复制算法,每次只会用到一个幸存区,当一个幸存区满了的时候,把还是活的对象复制到另个幸存区,上个直接清空。这样做就不会产生内存碎片了。

tenured generation 就表示老年代。

compacting perm 表示永久代。由于这两个的格式跟前面我介绍的那个几乎一样,我就不必介绍了。

4.-XX:+PrintGCTimeStamps

打印GC发生的时间戳。格式如下:

289.556: [GC [PSYoungGen: 314113K->15937K(300928K)] 405513K-
>107901K(407680K), 0.0178568 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
293.271: [GC [PSYoungGen: 300865K->6577K(310720K)] 392829K-
>108873K(417472K), 0.0176464 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]

解读:289.556表示从jvm启动到发生垃圾回收所经历的的时间。GC表示这是新生代GC(Minor GC)。PSYoungGen表示新生代使用的是多线程垃圾回收器Parallel Scavenge。314113K->15937K(300928K)]这个跟上面那个GC格式一样。

只不过,这个是表示的是新生代,幸存者区。后面那个是整个堆的大小,GC前和GC后的情况。Times这个显而易见,代表GC的所消耗的时间,用户垃圾回收的时间和系统消耗的时间和最终真实的消耗时间。

5.-X:loggc:log/gc.log

这个就表示,指定输出gc.log的文件位置。(我这里写的log/gc.log就表示在当前log的目录里,把GC日志写到叫gc.log的文件里。)

6.-XX:+PrintHeapAtGC

表示每次GC后,都打印堆的信息。(这个打印的基本格式跟上面第二条的基本类似,我也就不比多说了。)

7.-XX:+TraceClassLoading

监控类的加载。格式如下:

•[Loaded java.lang.Object from shared objects file]
•[Loaded java.io.Serializable from shared objects file]
•[Loaded java.lang.Comparable from shared objects file]
•[Loaded java.lang.CharSequence from shared objects file]
•[Loaded java.lang.String from shared objects file]
•[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
•[Loaded java.lang.reflect.Type from shared objects file]

使用这个参数就能很清楚的看到那些类被加载的情况了。

8.-XX:+PrintClassHistogram

跟踪参数。这个按下Ctrl+Break后,就会打印一下信息:

num #instances #bytes class name
----------------------------------------------
 1: 890617 470266000 [B
 2: 890643 21375432 java.util.HashMap$Node
 3: 890608 14249728 java.lang.Long
 4: 13 8389712 [Ljava.util.HashMap$Node;
 5: 2062 371680 [C
 6: 463 41904 java.lang.Class

分别显示:序号、实例数量、总大小、类型。

这里面那个类型,B和C的其实就是byte和char类型。

9.-Xmx -Xms

这个就表示设置堆内存的最大值和最小值。这个设置了最大值和最小值后,jvm启动后,并不会直接让堆内存就扩大到指定的最大数值。而是会先开辟指定的最小堆内存,如果经过数次GC后,还不能,满足程序的运行,才会逐渐的扩容堆的大小,但也不是直接扩大到最大内存。

10.-Xmn

设置新生代的内存大小。

11.-XX:NewRatio

新生代和老年代的比例。比如:1:4,就是新生代占五分之一。

12.-XX:SurvivorRatio

设置两个Survivor区和eden区的比例。比如:2:8 ,就是一个Survivor区占十分之一。

13.-XX:+HeapDumpOnOutMemoryError

发生OOM时,导出堆的信息到文件。

14.-XX:+HeapDumpPath

表示,导出堆信息的文件路径。

15.-XX:OnOutOfMemoryError

当系统产生OOM时,执行一个指定的脚本,这个脚本可以是任意功能的。比如生成当前线程的dump文件,或者是发送邮件和重启系统。

16.-XX:PermSize -XX:MaxPermSize

设置永久区的内存大小和最大值。永久区内存用光也会导致OOM的发生。

17.-Xss

设置栈的大小。栈都是每个线程独有一个,所有一般都是几百k的大小。

喜欢的伙伴记得点个关注哦!

使用Gradle7.6+SpringBoot 3.0+java17创建微服务项目 gradle7.6 springboot3.0 SpringBoot3.0 java17 微服务 从头到尾创建项目 gradle多模块 阅读详情

相关推荐

告别启动失败:DBeaver EE破解后Java环境与ini配置的深度排错指南

本文详细解析了破解版DBeaver EE启动失败的常见问题,重点解决Java环境配置和dbeaver.ini文件参数错误。通过精准的版本选择、路径配置和参数调优,帮助用户彻底解决启动无反应或Java异常问题,提升数据库管理工具的使用体验。

weixin_33749131的博客 325

JVM——17.系统上线的JVM配置步骤

文章目录1. 预评估阶段2. JVM 参数模板3. 压力测试4. 上线后的监控 1. 预评估阶段 对于一个新系统面临上线,需要设置线上的jvm参数,最严谨的方法当然是: 评估系统中各个接口的一次请求大概会产生多少M的对象; 评估系统一秒大概会接收到多少个请求,这些请求分布在哪些接口,一共会产生多少M的对象; 根据每秒生成的对象大小,估计新生代需要给多少的内存,YGC发生的频率,进入老年代的频率; 再估计老年代应该给多少的内存,FGC发生的频率等; 最终得到需要选择什么样配置的机器,和大概的JVM配置参数

m0_52325992的博客 1276

Java领域JVM的启动参数配置指南

本文旨在为Java开发者提供全面的JVM启动参数配置指南,涵盖从基础到高级的各类参数配置技巧。我们将重点讨论影响性能、稳定性和可观测性的关键参数。文章首先介绍JVM参数的基本分类,然后深入解析内存管理、垃圾回收等核心参数的原理,最后通过实际案例展示调优方法。JVM: Java Virtual Machine,Java程序的运行环境Heap: 堆内存,存储对象实例的区域GC: Garbage Collection,垃圾回收机制新一代GC算法(ZGC/Shenandoah)减少调优需求。

Java大师兄的博客 1135

java JDK17 jvm参数配置示例及解读

包的访问权限,允许未命名模块(通常是那些没有声明属于任何模块的类路径上的类)访问这个包内的元素。指定使用Z Garbage Collector(ZGC),这是一个可伸缩、低延迟的垃圾收集器,特别适合大规模的多核系统,旨在实现暂停时间不超过10毫秒的目标。整体而言,这些配置旨在优化一个应用的内存管理、垃圾收集策略,以及提升在遇到内存问题时的诊断能力,特别是针对需要高性能、低延迟处理的应用场景。控制内存分配速率突增的容忍度,值越高,JVM越晚响应突增的内存需求,以避免不必要的垃圾回收。)和最大堆内存大小(

学亮编程手记 3643

JDK 17JVM调优 史诗级 教程

JDK 17JVM调优 史诗级 教程 1 调优层次 2 调优指标 3 JVM调优原则 3.1 优先原则 3.2 堆设置 3.3 年轻代设置 3.4 老年代设置 3.5 方法区设置 3.6 GC设置 3.6.1 GC发展阶段 3.6.2 G1的适用场景 3.6.3 其他收集器适用场景 4 JVM

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:CSDNWF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 1万+

第一章 JVMJava体系架构

文章目录1.jvm前言2.开发人员的病态3.架构师在想什么4.为什么学习jvm5.Java VS C++6.TIOBE 排行榜7.Java 生态圈8.Java的跨平台性9.字节码10.多语言混合编程11.自己写个jvm12.Java的重大事件13.虚拟机介绍13.1 虚拟机概念13.2 Java虚拟机14.jvm的位置15.jvm的整体结构16.Java代码执行流程17.JVM架构模型17.1 两种架构的举例17.2 反编译字节码文件17.3 总结18.jvm生命周期 1.jvm前言 作为Java工程师

JavaAlenboy 1万+

Java 11 到 Java 17 的最佳 HotSpot JVM 选项和开关

一、前言 在本文中,你将了解 OpenJDK HotSpot Java 虚拟机 (HotSpot JVM) 中的一些系统知识,以及如何调整它们以获得最佳状态适应你的程序和运行环境。HotSpot JVM 是一项了不起且灵活的技术。它作为二进制版本适用于每个主要操作系统和 CPU 架构,从微型 Raspberry Pi Zero 一直到包含数百个 CPU 内核和 TB 级 RAM 的“大型”服务器。由于 OpenJDK 是一个开源项目,HotSpot JVM 几乎可以针对任何其他系统进行编译,并且可以使用选项

hnjsjsac的博客 2094

java高级技术人员要掌握哪些技术

大厂对高级Java工程师的要求不仅是技术深度,更看重复杂场景的实战经验和技术判断力。建议通过开源项目贡献(如Apache项目)、技术博客输出、内部系统重构案例积累差异化竞争力。

g470641382的博客 1449

JVM笔记

作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。开发人员如何看待上层框架一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写

buaixuexideshuge的博客 1865

JVM17GUI工具

为此,JDK 提供了一些内存泄漏的分析工具,如 jconsole,jvisualvm 等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。jconsole:JDK 自带的可视化监控工具。查看 Java 应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等Visual VM:Visual VM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的应用程序的详细信息。

欧气满满大顺顺的博客 823

为什么JDK17Java开发者必须掌握的版本?

jdk17,谁升级谁知道,升级一次,性能提升多少?节省多少钱?自己算吧!

码农佩奇,一个热爱生活的程序猿! 4084

JVM启动参数详解与调优实战

Java虚拟机(JVM)的启动参数是控制其运行行为的关键配置手段,直接影响着程序的性能、稳定性与资源利用率。理解并合理使用这些参数,是Java开发与运维人员进行系统调优的基础技能之一。JVM启动参数主要分为三类:标准参数(-X):如-Xms-Xmx,这些参数在不同JDK版本之间保持兼容,推荐在生产环境中使用。非标准参数(-XX):如,用于更细粒度的控制,但可能在不同版本中行为不一致。系统属性参数(-D):用于设置系统属性,例如,常用于配置环境相关参数

weixin_42515392的博客 1196

JVM中-XX:+PrintCompilation参数

本文仅代表个人理解,如有不同意见欢迎交流。本文主要介绍JVM中的参数:-XX:+PrintCompilation的作用,以及该参数配置之后,如何分析该参数的结果。

m0_53140390的博客 926

【2022最新Java面试宝典】—— Java虚拟机(JVM)面试题(51道含答案)

目录一、Java内存模型1. 我们开发人员编写的Java代码是怎么让电脑认识的2. 为什么说java是跨平台语言3. Jdk和Jre和JVM的区别4. 说一下 JVM由那些部分组成,运行流程是什么?5. 说一下 JVM 运行时数据区6. 详细的介绍下程序计数器?(重点理解)7. 详细介绍下Java虚拟机栈?(重点理解)8. 你能给我详细的介绍Java堆吗?(重点理解)9. 能不能解释一下本地方法栈?10. 能不能解释一下方法区(重点理解)11. 什么是JVM字节码执行引擎12. 你听过直接内存吗?13. 知

记录各种Bug解决案例及日常学习内容 1万+

JVM详解(1)——JVMJava体系架构

JVMJava体系架构1.jvm前言2.开发人员的病态3.架构师在想什么4.为什么学习jvm5.Java VS C++6.TIOBE 排行榜7.Java 生态圈8.Java的跨平台性9.字节码10.多语言混合编程11.自己写个jvm12.Java的重大事件13.虚拟机介绍13.1 虚拟机概念13.2 Java虚拟机14.jvm的位置15.jvm的整体结构16.Java代码执行流程17.JVM架构模型17.1 两种架构的举例17.2 反编译字节码文件17.3 总结18.jvm生命周期 1.jvm前言 作

weixin_43912367的博客 716

Java 11 到 Java 17 的最佳 HotSpot JVM 选项和开关详解

一、前言 在本文中,你将了解 OpenJDK HotSpot Java 虚拟机 (HotSpot JVM) 中的一些系统知识,以及如何调整它们以获得最佳状态适应你的程序和运行环境。HotSpot JVM 是一项了不起且灵活的技术。它作为二进制版本适用于每个主要操作系统和 CPU 架构,从微型 Raspberry Pi Zero 一直到包含数百个 CPU 内核和 TB 级 RAM 的“大型”服务器。由于 OpenJDK 是一个开源项目,HotSpot JVM 几乎可以针对任何其他系统进行编译,并且可以使用选项

chenxuyuana的博客 1619

快速上手JVM系列(一)——进一步认识JavaJVM概述

进一步认识Java,Oracle JDK与Open JDKJava语言的地位,Java上层框架与JVM的关系,Java代码的执行流程,初识JVM——跨语言的平台,虚拟机是什么,JVM发展历程,JVM架构模型,初探JVM内存结构,JVM的生命周期,周志明老师深入理解Java虚拟机与尚硅谷JVM教程的整合

1726

Javajvm面试题】

程序计数器是一块较小的内存空间,它可以看作是:保存当前线程所正在执行的字节码指令的地址(行号)由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。称之为“线程私有”的内存。程序计数器内存区域是虚拟机中唯一没有规定OutOfMemoryError情况的区域。总结:也可以把它叫做线程计数器。

weixin_43394692的博客 1613
上一篇: 怎么理解java关键字volatile(附最新阿里面题)
下一篇: Mysql索引结构全维度比较
Formor_
博客等级 码龄7年 7粉丝 31原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值