当前位置:首页 > 数码 > 调优常用参数-JVM (调优常用参数是什么)

调优常用参数-JVM (调优常用参数是什么)

admin7个月前 (05-01)数码54

调优目的

JVM 调优的目的是为了提高应用程序的性能和稳定性。通过优化 JVM 的配置和参数设置,可以减少内存占用、提高废品回收效率、优化线程管理等,从而提升应用程序的响应速度、降低内存泄漏的风险,并且减少应用程序的崩溃和停顿现象。调优可以根据具体的应用场景和需求进行,以达到最佳的性能和稳定性。

常见的一些行为方法

GC 事件调优:调整废品回收相关参数,以提高 GC 效率,减少 GC 暂停时间。 堆内存调优:调整堆内存大小和分代比例,以满足应用程序的内存需求,避免内存溢出或过度分配。 线程调优:调整线程池大小和相关参数,以优化并行性和响应速度。 类加载调优:调整类加载器相关参数,以优化类加载性能和减少类加载器死锁。

GC 事件

JVM 的废品回收 GC 事件可以分为以下几类: Minor GC:回收新生代中不再使用的对象,通常很快。 Major GC:回收年老代中不再使用的对象,通常比 Minor GC 慢得多。 Full GC:回收整个堆内存中不再使用的对象,是最慢的 GC 事件。

常用参数总结

以下是 JVM 调优中常用的参数:

(1) 堆内存调优参数

`-Xms`: 设置堆内存初始大小 `-Xmx`: 设置堆内存最大大小 `-XX:NewRatio`: 设置新生代和年老代的比值

(2) GC 调优参数

`-XX:+UseG1GC`: 使用 G1 做为 GC 收集器 `-XX:MaxGCPauseMillis`: 设置并行收集最大暂停时间 `-XX:ParallelGCThreads`: 设置并行 GC 线程数

(3) GC 统计信息

`-XX:+PrintGCDetails`: 打印 GC 事件详细信息 `-XX:-PrintGCDateStamps`: 禁用 GC 事件时间戳打印 `-XX:+PrintGCApplicationStoppedTime`: 打印 GC 导致应用程序暂停的时间

(4) 线程调优参数

`-Xss`: 线程堆栈大小,默认为 1M `-XX:ThreadStackSize`: 线程堆栈大小(可比 -Xss 更细粒度地设置) `-XX:MaxTenuringThreshold`: 设置对象晋升到年老代所需的 Minor GC 次数 调优常用参数

(5) 类加载调优参数

`-XX:+UseParllelOldGC`: 启用并行旧生代废品回收 `-XX:ParallelGCThreads`: 设置并行 GC 线程数 `-XX:MinHeapFreeRatio`: 设置堆内存最小空闲比例

(6) 其他调优参数

`-XX:+UseCompressedClassPointers`: 启用压缩类指针 `-XX:+UseCompressedOops`: 启用压缩对象指针 `-XX:+UseLWPSynchronization`: 使用轻量级指针同步

示例配置

以下是基于不同需求的示例配置: 高吞吐量应用程序: -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=20 低延迟应用程序: -Xms512m -Xmx512m -XX:+UseParallelGC -XX:ParallelGCThreads=4 内存受限应用程序: -Xms256m -Xmx256m -XX:+UseCompressedClassPointers -XX:+UseCompressedOops

注意事项

调优是一个持续的过程,需要根据应用程序的特定需求进行。 在进行调优之前,请确保对应用程序的性能瓶颈有充分的了解。 调优参数可能会对应用程序产生显着影响,因此在进行任何更改之前请先进行测试。 始终监控应用程序的性能和稳定性,并根据需要进行进一步的调整。

JVM常用参数

-Xmx4g初始堆大小 4g-Xms4g最大堆大小4g-Xmn512m 年轻代大小(1.4or lator)整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。 持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。 此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8-XX:MetaspaceSize=256m 设置元空间初始大小为256m-XX:MaxMetaspaceSize=512m设置元空间最大可分配大小512m-Xss256k 每个线程的堆栈大小256k-XX:+ExplicitGCInvokesConcurrent降低每次Full GC的时间,其实就是启用多线程去执行-XX:+UseConcMarkSweepGC启用CMS做为废品收集-XX:+UseCMSInitiatingOccupancyOnly只有开启了这个参数,CMSInitiatingOccupancyFraction这个参数才会生效-XX:CMSInitiatingOccupancyFraction=70CMS废品收集器,当老年代达到70%时,触发CMS废品回收。 -XX:ParallelGCThreads=4选项指定在默认废品收集器的并行操作期间使用的线程数为4-XX:-UseBiasedLocking关闭用户偏向锁-XX:AutoBoxCacheMax= 参数是设置Integer缓存上限的参数,在VM初始化期间属性可以被设置和保存在私有的系统属性 class中。 理论上讲,当系统需要频繁使用Integer时,或者说堆内存中存在大量的Integer对象时,可以考虑提高Integer缓存上限,避免JVM重复创造对象,提高内存的使用率,减少GC的频率,从而提高系统的性能。 -XX:MaxTenuringThreshold=6 设置的是年龄阈值,默认15(对象被复制的次数),这里设置成了6次-XX:+PrintGCApplicationStoppedTime打印废品收集时 , 系统的停顿时间-XX:+PrintGCDateStamps打印CG发生的时间戳-XX:+PrintGCDetails来打印详细的GC日志来查看-XX:+PrintCodeCache会打印Code Cache区的使用情况。 -Xloggc:/dev/shm/ 指定gc的log日志所在位置/dev/shm/-XX:+UseGCLogFileRotation打开或关闭GC日志滚动记录功能,要求必须设置 -Xloggc参数-XX:NumberOfGCLogFiles=2 设置滚动日志文件的个数,必须大于1 日志文件命名策略是,<filename>.0, <filename>.1, ..., <filename>.n-1,其中n是该参数的值-XX:GCLogFileSize=10m 设置滚动日志文件的大小,必须大于8k 当前写日志文件大小超过该参数值时,日志将写入下一个文件-XX:+HeapDumpOnOutOfMemoryError表示当JVM发生OOM时,自动生成DUMP文件。 -XX:HeapDumpPath=/root/logs/ 发生了 内存溢出错误 dump路径为root/logs/ (一般与HeapDumpOnOutOfMemoryError参数一块使用)

常用JVM参数(JDK 8)

-Xss :线程栈空间-Xms : 初始堆空间,如: -Xms512M -Xmx : 最大堆空间,如: -Xmx512M -XX:MinHeapFreeRatio : 堆空间最小空闲比,当堆空间空闲内存小于这个数值时,JVM会扩展堆空间。-XX:MaxHeapFreeRatio : 堆空间最大空闲比,当堆空间空闲内存大于这个数值时,JVM会压缩堆空间,得到一个较小的堆。-XX:NewSize : 新生代初始空间-XX:MaxNewSize : 最大新生代空间-Xmn : 相当于设置相同的 -XX:NewSize 和 -XX:MaxNewSize .-XX:SurvivorRatio : 新生代中eden空间和s0空间的比例-XX:TargetSurvivorRatio : survivor区的可使用率,当survivor区的空间使用率达到这个数值时,会将对象送入老年代。-XX:NewRatio : 老年代 / 新生代的空间比例-XX:MetaspaceSize=512m : 分配给类元数据空间的初始大小,以bytes为单位,达到该值就会触发废品收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。-XX:MaxMetaspaceSize=512m : 分配给类元数据空间的最大值, 超过此值就会触发Full GC. 此值仅受限于系统内存的大小, JVM会动态地改变此值-XX:MinMetaspaceFreeRatio ,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的废品收集。-XX:MaxMetaspaceFreeRatio ,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的废品收集。-XX:CompressedClassSpaceSize=512m : 类指针压缩空间大小, 默认为1G-XX:+PrintGCDetails : 打印GC细节-XX:+PrintGC :-XX:+PrintGCTimeStamps :-XX:+PrintHeapAtGC :

Java 8 以前的JVM内存结构图:

其中:

虚拟机栈 在运行时使用 栈帧 保存上下文,栈帧中存储了以下内容:

更为精细地, 堆 和 方法区 的结构如下:

堆 分为 新生代 和 老年代 .

新生代 分为 Eden区 、 s0区(survivor space0或from space) 和 s1区(survivor space1或to space) 。

大部分新创建的对象进入Eden区,幸存区s0区和s1区存放经历了至少一次GC的“幸存者”。如果幸存区中的对象到了指定年龄仍未被回收,则有机会进入 老年代(tenured)

对于习惯了HotSpot虚拟机的程序员来说,很多都愿意将 方法区 称作 永久代 。本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是Java虚拟机规范,永久代是Hotspot针对该规范进行的实现。

堆 和 方法区 都是被JVM中所有线程共享的。

Java 8以后的JVM内存结构图:

Java8中,Hotspot取消了永久代,永久代的参数 -XX:PermSize 和 -XX:MaxPermSize 也随之失效。

对于Java8,HotSpots取消了永久代,是不是就没有方法区了呢?当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中, 方法区存在于元空间(Metaspace) 。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

本地内存(Native memory) ,也称为 C-Heap ,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但本地内存空间不够却不会触发GC。

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中 : PermGen space 这种错误。默认情况下元空间是可以无限使用本地内存的,但JVM同样提供了参数 -XX:MaxMetaspaceSize 来限制它使用的空间。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: JVM

“调优常用参数-JVM (调优常用参数是什么)” 的相关文章

目的和算法-GC-渣滓回收-渣滓回收及其原理-JVM (目的计算方法)

目的和算法-GC-渣滓回收-渣滓回收及其原理-JVM (目的计算方法)

MajorGC老年代区域的渣滓回收,老年代空间无余时,会先尝试触发MinorGC。MinorGC之后空间还无余,则会触发MajorGC,MajorGC速度比拟慢,暂停期间长。 图片 1渣滓回...

解释和编译指南-JVM (解释和编译指的是)

解释和编译指南-JVM (解释和编译指的是)

是一种跨平台的编程言语。程序源代码会被编译为字节码bytecode,而后字节码在运转时被转换为机器码hinecode。解释器interpreter在物理机器上模拟出的形象计算机上口头字节码指令。即...

深入理解并发编程艺术之JVM内存模型 (深入理解并发扫描的含义)

深入理解并发编程艺术之JVM内存模型 (深入理解并发扫描的含义)

Java内存模型(Java Memory Model,简称JMM)是一种抽象概念,并不真实存在。它的主要目的是围绕原子性、可见性和有序性这几种并发问题定义程序中各种变量的访问规则,即关注在虚拟机中...

的组成和运转流程-JVM (运转的概念)

的组成和运转流程-JVM (运转的概念)

思索:JVM由那些部分组成,运转流程是什么? 1.JVM由那些部分组成,运转流程是什么? JVM是什么 好处: 一次性编写,四处运转 智能内存治理,渣滓回收机制...