JVM系列-常用参数

1.堆内存

堆内存用于存储new对象,垃圾回收器负责堆内存的管理。但Java程序实际占用的空间则由堆内存、栈内存(程序运行栈)、程序计数器、常量区、代码区、本地内存等。

堆内存分为Young和Old,Young分为2个Survivor (From Survivor和To Survivor),1个eden,具体见JVM系列-垃圾回收

-Xms??[m|g]

初始堆内存大小,默认为物理内存的1/64,单位是Byte

-Xmx??[m|g]

最大堆大小,默认为物理内存的1/4,单位是Byte。虽然程序申请了内存空间,但物理内存还是由程序实际需要来分配(这就是计算机原理了,虚拟地址空间和物理内存的关系)。

-XX:NewRatio = ??

Young与Old的分配,默认为2(young:old=1:2),NewRatio越大,old空间越大。

–XX:SurvivorRatio = ??

Survivor与Eden的分配,默认为8(Survivor:Eden=1:8),SurvivorRatio越大,Eden区间越大。注意这是一个Survivor与Eden的比例,所以Young如果分成10份,则2个Survivor共占2份,Eden占8份。

内存大小和GC的关系

大内存空间:减小GC执行次数,增加单次GC执行时间;小内存空间:减小单次GC执行时间,增加GC执行次数

查看默认值

java -XX:+PrintFlagsFinal -version | grep NewRatio 查看NewRatio

java -XX:+PrintFlagsFinal -version | grep -i heapsize 查看初始堆/最大堆的大小

2.打印GC日志

在程序优化的时候需要观察gc情况,所以需要设置一些参数。

-XX:+PrintGCDetails 打印GC详情,会显示Minor/Full gc的内存变化、持续时间等具体情况

-XX:+PrintGCDateStamps 打印GC日期类型的时间

-Xloggc:/home/work/log/gc.log GC日志存储路径

3.关于SafePoint

SafePoint是线程状态,表示线程目前处于一个稳定状态,可以停止或进行其他调度,GC等其他操作需要SafePoint。SafePoint的特定代码位置主要有:循环末尾、方法return前、方法call返回后、异常抛出位置等。

打印SafePoint信息,显示程序停止时间

-XX:+PrintApplicationStoppedTime(程序暂停了多少时间) -XX:+PrintGCApplicationConcurrentTime(两次连续暂停的时间间隔)

打印引起SafePoint的操作、线程运行情况等

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

如下图可以看出引起STW(Stop the World)的操作有Depotimize/GC/RevokeBias等,这些操作都需要等待程序处于SafePoint状态。

no  vm operation说明是一个保证安全点GuaranteedSafepoint(具体作用待续),默认每秒执行一次。

查看GuaranteedSafepoint的时间间隔:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal 2>&1 | grep Safepoint

设置间隔时间:

-XX:GuaranteedSafepointInterval=0 (关闭) -XX:GuaranteedSafepointInterval=1000 (1000ms)

4.何时需要GC优化

GC应该是程序优化的最后一步,GC执行的次数与创建对象的数量成正比,GC次数多的时候应该首先减少创建对象的数量。

满足以下条件无需GC:

  • Minor GC执行的很快(小于50ms)
  • Minor GC执行的并不频繁(大概10秒一次)
  • Full GC执行的很快(小于1s)
  • Full GC执行的并不频繁(10分钟一次)

可以通过jstat -gcutil pid来查看GC情况,S0/S1/E/O/P分别表示survivor、eden、old、permanent空间已用百分比,YGC/YGCT表示Young GC的次数和总共耗时(单位秒),FGC/FGCT表示Full GC的次数和总耗时,GCT=YGCT+ FGCT。

GC一些原则:

  • 通常-Xms1024m -Xmx1024m -XX:+UseG1GC就满足了需要
  • 初始堆大小和最大堆大小相等,避免堆空间的调整
  • 避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小
时间: 2024-08-05 14:43:23

JVM系列-常用参数的相关文章

JVM 配置常用参数和常用 GC 调优策略

链接:https://juejin.im/post/5c94a123f265da610916081f JVM 配置常用参数 堆参数 回收器参数 如上表所示,目前主要有串行.并行和并发三种,对于大内存的应用而言,串行的性能太低,因此使用到的主要是并行和并发两种.并行和并发 GC 的策略通过 UseParallelGC 和 UseConcMarkSweepGC 来指定,还有一些细节的配置参数用来配置策略的执行方式.例如:XX:ParallelGCThreads, XX:CMSInitiatingOc

JVM CMS 常用参数配置(修订)

-XX:+UseConcMarkSweepGC 该标志首先是激活CMS收集器.默认HotSpot JVM使用的是并行收集器. -XX:UseParNewGC 当使用CMS收集器时,该标志激活年轻代使用多线程并行执行垃圾回收.这令人很惊讶,我们不能简单在并行收集器中重用-XX:UserParNewGC标志,因为概念上年轻代用的算法是一样的.然而,对于CMS收集器,年轻代GC算法和老年代GC算法是不同的,因此年轻代GC有两种不同的实现,并且是两个不同的标志.注意最新的JVM版本,当使用-XX:+Us

JVM常用参数设置

-server -Xms8g 初始堆大小 -Xmx8g 最大堆大小 -Xmn2g 年轻代大小 -Xss1024K 每个线程的堆栈大小 -XX:PermSize=256m -XX:MaxPermSize=512m Perm不属于堆内存,由虚拟机直接分配,可通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小 设置持久代(perm gen)初始值   设置持久代最大值 -XX:ParallelGCThreads=8 并行收集器的线程数 -XX:+UseConcMarkSwe

jvm常用参数设置 good

1.堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx=512m 2.年轻代大小可以通过 -Xmn 来设置,比如-Xmn=2g 或者 -Xmn512m,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 3.年老代大小 = 堆大小 – 年轻代大小 4.持久代或者永久代大小可以通过 -XX:PermSize 和 -XX:MaxPermSize 来控

JVM 常用参数

转自百度空间,原文连接失效,内容来自百度快照 常见配置举例 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制.32位系统 下,一般限制在1.5G~2G;64为操作系统对内存无限制.我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m. 典型设置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -Xmx3

[转]JVM系列三:JVM参数设置、分析

[转]JVM系列三:JVM参数设置.分析 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率.但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同(

深入理解JVM虚拟机10:JVM常用参数以及调优实践

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

jvm系列:Java GC 分析

Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定

jvm系列(八):jvm知识点总览-高级Java工程师面试必备

在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后,内功就更主要了.一个内功低的人招式在奇妙也打不过一个内功高的人.比如,你剑法再厉害,一剑刺过来,别人一掌打断你的剑,你还怎么使剑法,你一掌打到一个武功高的人身上,那人没什么事,却把你震伤了,你还怎么打.同样两者也是相辅相成的,内功深厚之后,原来普通的一招一式威力也会倍增. 对于搞开发的我们其实也是