JVM调优

合集下载

jvm对元数据区的调优参数

jvm对元数据区的调优参数

jvm对元数据区的调优参数
JVM(Java虚拟机)的元数据区是用于存储类元数据的区域,包括类的结构信息、常量池、方法和字段描述等。

对于元数据区的调优参数,我们可以从不同角度来考虑。

首先,元数据区的大小可以通过参数`-XX:MetaspaceSize`和`-XX:MaxMetaspaceSize`来进行调优。

`-XX:MetaspaceSize`用于设置初始的元数据空间大小,而`-XX:MaxMetaspaceSize`用于设置元数据空间的最大大小。

可以根据应用程序的需求和性能表现来调整这些参数,以确保元数据区有足够的空间来存储类的元数据。

其次,可以通过参数`-XX:MinMetaspaceFreeRatio`和`-
XX:MaxMetaspaceFreeRatio`来调整元数据区的空闲空间大小比例。

这些参数用于控制元数据区的收缩行为,可以根据应用程序的内存使用情况来调整这些参数,以避免过度浪费内存或者过度收缩导致性能问题。

此外,还可以通过参数`-XX:MetaspaceReclaimPolicy`来调整元数据区的回收策略。

这个参数用于控制元数据区的回收行为,可以选择不同的策略来平衡内存的使用和回收效率。

除了上述参数之外,还可以通过监控工具来观察元数据区的内存使用情况,比如使用JConsole、VisualVM等工具来监控元数据区的内存占用情况,及时发现内存泄漏或者内存溢出问题,并进行相应的调优。

总之,对于JVM的元数据区调优参数,我们可以从空间大小、空闲空间比例、回收策略等多个方面进行考虑和调整,以确保元数据区能够满足应用程序的需求,并且能够保持良好的性能表现。

记一次JVMFullGC(MetadataGCThreshold)调优经历

记一次JVMFullGC(MetadataGCThreshold)调优经历

记⼀次JVMFullGC(MetadataGCThreshold)调优经历记⼀次JVM Full GC (Metadata GC Threshold)调优经历⼀、背景:线上服务器内存使⽤超过90%,分析上⾯部署的各个服务的GC⽇志,发现有⼀个服务的JVM内存分配过⼤,使⽤率较低,有调优的空间,可以在不迁移服务或者不升级服务器配置的情况下,降低服务器内存占⽤。

JVM推荐配置原则:应⽤程序运⾏时,计算⽼年代存活对象的占⽤空间⼤⼩X。

程序整个堆⼤⼩(Xmx和Xms)设置为X的3 ~ 4倍;永久代PermSize和MaxPermSize设置为X的1.2 ~ 1.5倍。

年轻代Xmn的设置为X的1 ~ 1.5倍。

⽼年代内存⼤⼩设置为X的2 ~ 3倍。

JDK官⽅建议年轻代占整个堆⼤⼩空间的3/8左右。

完成⼀次Full GC后,应该释放出70%的堆空间(30%的空间仍然占⽤)。

观察线上发现2G的堆内存,Full GC之后的活跃对象才占⽤60M。

按照推荐设置JVM内存只需要给⼏百M就好了。

所以决定改成1G,既能够降低服务器内存占⽤,也预留了⾜够的业务增长空间。

在这个过程中,发现如下⼏个问题:GC⽇志没有时间显⽰,看起来很不⽅便GC⽇志没有滚动,时间久了,⽇志⽂件较⼤GC⽇志中存在⼤量Full GC (Metadata GC Threshold)显然第三个问题最为严重。

我们知道,元数据区主要是⽤来存储类的元数据的。

⼀般来讲,类加载完成之后,⼤⼩应该是⽐较稳定的,不会有太⼤变动。

所以可以判断,这么频繁的Full GC (Metadata GC Threshold),肯定是哪⾥出问题了。

但是我们⼀步⼀步来解决问题,⽽且GC⽇志不够详细也影响我们定位问题。

⼆、优化GC⽇志打印⾸先复习⼀下JVM的GC⽇志打印的启动参数。

详见-verbose:gc同-XX:+PrintGC-XX:+PrintGC最简单的 GC 参数会打印 GC 前后堆空间使⽤情况以及 GC 花费的时间-XX:+PrintGCDetails打印GC的详细信息,会打印 youngGC FullGC前后堆【新⽣代,⽼年代,永久区】的使⽤情况以及 GC 时⽤户态 CPU 耗时及系统CPU 耗时及 GC 实际经历的时间-XX:+PrintGCTimeStamps打印CG发⽣的时间戳,从应⽤启动开始累计的时间戳-XX:+PrintGCDateStamps打印GC发⽣的时刻,所处⽇期时间信息-Xloggc:gc.log指定GC log的位置,以⽂件输出-XX:+PrintHeapAtGC每⼀次GC前和GC后,都打印堆信息。

JVM调优总结-Xms-Xmx-Xmn-Xss

JVM调优总结-Xms-Xmx-Xmn-Xss

JVM调优总结-Xms-Xmx-Xmn-Xssjava启动参数共分为三类;其⼀是标准参数(-),所有的JVM实现都必须实现这些参数的功能,⽽且向后兼容;其⼆是⾮标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满⾜,且不保证向后兼容;其三是⾮Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使⽤;标准参数中⽐较有⽤的:verbose-verbose:class输出jvm载⼊类的相关信息,当jvm报告说找不到类或者类冲突时可此进⾏诊断。

-verbose:gc输出每次GC的相关情况。

-verbose:jni输出native⽅法调⽤的相关情况,⼀般⽤于诊断jni调⽤错误信息。

⾮标准参数⼜称为扩展参数⼀般⽤到最多的是-Xms512m 设置JVM促使内存为512m。

此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmx512m ,设置JVM最⼤可⽤内存为512M。

-Xmn200m:设置年轻代⼤⼩为200M。

整个堆⼤⼩=年轻代⼤⼩ + 年⽼代⼤⼩ + 持久代⼤⼩。

持久代⼀般固定⼤⼩为64m,所以增⼤年轻代后,将会减⼩年⽼代⼤⼩。

此值对系统性能影响较⼤,Sun官⽅推荐配置为整个堆的3/8。

-Xss128k:设置每个线程的堆栈⼤⼩。

JDK5.0以后每个线程堆栈⼤⼩为1M,以前每个线程堆栈⼤⼩为256K。

更具应⽤的线程所需内存⼤⼩进⾏调整。

在相同物理内存下,减⼩这个值能⽣成更多的线程。

但是操作系统对⼀个进程内的线程数还是有限制的,不能⽆限⽣成,经验值在3000~5000左右。

-Xloggc:file与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到⼀个⽂件中,⽂件的位置最好在本地,以避免⽹络的潜在问题。

若与verbose命令同时出现在命令⾏中,则以-Xloggc为准。

-Xprof跟踪正运⾏的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。

《Java性能调优指南》

《Java性能调优指南》

《Java性能调优指南》随着互联网的飞速发展,Java作为一种重要的编程语言,被越来越广泛地应用于各个领域。

但是,Java程序的性能问题也随之出现。

如何调优Java 程序的性能,成为了每个开发人员需要解决的难题。

本文将为大家介绍Java性能调优的指南。

一、JVM参数设置JVM(Java虚拟机)参数设置是Java性能调优的关键。

JVM有众多的参数,不同的参数设置会对Java程序的性能产生不同的影响。

常用的JVM参数设置包括以下几个方面:1. 内存设置内存是Java程序的一大瓶颈。

如果内存设置不合理,会导致Java程序频繁地进行垃圾回收,造成程序的延迟和不稳定。

在设置内存参数时需要注意以下几点:- -Xmx: 最大堆内存,设置合理的最大堆内存大小可以减少JVM的垃圾回收次数,提高程序性能。

- -Xms: 初始堆内存,设置合理的初始堆内存大小可以加快程序启动时间,提高程序性能。

- -XX:NewRatio: 新生代与老年代的比例,如果设置得当,可以减少垃圾回收的次数。

通常新生代的大小为总堆容量的1\/3或1\/4,老年代的大小为总堆容量的2\/3或3\/4。

2. 垃圾回收设置垃圾回收是Java程序中必不可少的一部分。

合理的垃圾回收参数设置可以提高程序性能。

常用的垃圾回收参数设置包括以下几点:- -XX:+UseParallelGC: 使用并行GC,适用于多核CPU。

- -XX:+UseConcMarkSweepGC: 使用CMS GC,适用于大型Web应用程序。

- -XX:+UseG1GC: 使用G1 GC,适用于大内存应用程序。

3. JIT设置JIT(即时编译器)是Java程序中非常重要的一部分。

合理的JIT参数设置可以提高程序的性能。

常用的JIT参数设置包括以下几点:- -XX:+TieredCompilation: 启用分层编译,可以提高程序启动时间和性能。

- -XX:CompileThreshold: JIT编译阈值,设置JIT编译的最小方法调用次数,可以提高程序性能。

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解J DK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。

现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java 进程消耗CPU过高......这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。

本文将对一些常用的JVM 性能调优监控工具进行介绍,希望能起抛砖引玉之用。

A、jps(Java Virtual Machine Process Status Tool) jps 主要用来输出JVM中运行的进程状态信息。

语法格式如下:jps[options] [hostid]如果不指定hostid就默认为当前主机或服务器。

命令行参数选项说明如下:-q 不输出类名、Jar名和传入main方法的参数-m 输出传入main 方法的参数-l 输出main类或Jar的全限名-v 输出传入JVM的参数比如下面:root@ubuntu:/# jps -m -l2458org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml29920 com.sun.tools.hat. Main -port 9998 /tmp/dump.dat3149 org.apache.catalina.startup.Boo tstrap start30972 sun.tools.jps.Jps -m -l8247 org.apache.catalin a.startup.Bootstrap start25687com.sun.tools.hat.Main -port 9999 dump.dat21711 mrf-center.jarB、jstack jstack主要用来查看某个Java进程内的线程堆栈信息。

jvm常用调优参数

jvm常用调优参数

jvm常用调优参数
JVM是JavaVirtualMachine的缩写,是Java程序运行的核心。

JVM的调优是优化Java应用程序性能的重要一环,其中调优参数的合理设置是关键。

以下是常用的JVM调优参数:
1. -Xms:设置JVM的初始内存大小,默认为物理内存的
1/64。

2. -Xmx:设置JVM的最大内存大小,超出该内存大小后会触发垃圾回收。

3. -Xmn:设置年轻代的大小,一般设置为总内存的1/3或
1/4。

4. -XX:SurvivorRatio:设置年轻代中Eden区和Survivor区的比例,默认值为8。

5. -XX:NewRatio:设置新生代和老年代的比例,默认值为2。

6. -XX:MaxPermSize:设置永久代的大小,一般设置为
256MB。

7. -XX:+UseConcMarkSweepGC:使用CMS垃圾回收器,可以减少内存抖动。

8. -XX:+UseParallelGC:使用并行垃圾回收器,可提高垃圾回收效率。

9. -XX:+HeapDumpOnOutOfMemoryError:当JVM内存溢出时,生成堆转储文件。

10. -XX:+PrintGCDetails:打印垃圾回收的详细信息。

以上是常用的JVM调优参数,通过合理地设置参数,可以优化Java应用程序的性能。

JVM_性能调优_参数列表

JVM_性能调优_参数列表

79
80
81 XX:ErrorFile=./hs_err_pid<pid
>.log
82 -XX:+PrintCompilation
83 -XX:+PrintGC
84 -XX:+PrintGCDetails
85 -XX:+PrintGCTimeStamps
86
XX:+PrintTenuringDistribution
65 XX:CMSIncrementalDutyCycleMin=< N> 66 XX:CMSIncrementalSafetyFactor=<N > 67 -XX:CMSIncrementalOffset=<N>
68 -XX:CMSExpAvgFactor=<N> 69 -XX:ConcGCThreads=n 70 -XX:MaxGCPauseMillis=<N> 71 -XX:GCTimeRatio=<N>
87 -XX:+TraceClassLoading
XX:+TraceClassLoadingPreorder 89 -XX:+TraceClassUnloading
88
90 -XX:+TraceClassResolution
91 -XX:+TraceClassUnloading
92 -XX:+TraceLoaderConstraints
JDK
设置JVM启动时初始内存堆的大小 设置JVM启动后动态申请堆内存的最大堆空间 为新生代分配的内存大小。 设置JVM线程栈的空间最大值。 每个线程栈大小(K),等于0时表示使用缺省值

JVM调优总结

JVM调优总结

JVM调优总结作者: 和你在一起程序员其实很痛苦的,每隔一段时间就会听到、看到很多很多新名词、新技术---囧.幸而有了互联网,有了开源、有了wiki、有了分享:)—人人为我,我为人人。

拓荒者走过的时候很痛苦,但是如果能给后来人留下点路标,是不是可以让他们少走一些弯路呢?踏着前辈的足迹我走到了这里,也应该为后来的人留下点东西。

走夜路其实不可怕,可怕的是一个人走夜路:) - 做最棒的软件开发交流社区A-PDF Number Pro DEMO: Purchase from to remove the watermark目 录1. java路上1.1 JVM调优总结-序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.2 JVM调优总结(一)-- 一些概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 1.3 JVM调优总结(二)-一些概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 1.4 JVM调优总结(三)-基本垃圾回收算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 1.5 JVM调优总结(四)-垃圾回收面临的问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 1.6 JVM调优总结(五)-分代垃圾回收详述1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 1.7 JVM调优总结(六)-分代垃圾回收详述2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 1.8 JVM调优总结(七)-典型配置举例1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26 1.9 JVM调优总结(八)-典型配置举例2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 1.10 JVM调优总结(九)-新一代的垃圾回收算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 1.11 JVM调优总结(十)-调优方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 1.12 JVM调优总结(十一)-反思 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 1.13 JVM调优总结(十二)-参考资料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .501.1 JVM调优总结-序发表时间: 2009-11-17几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西。

JVM优化配置——使用JConsole性能调优

JVM优化配置——使用JConsole性能调优

JAVA开发我们常常会遇到内存分配和性能调优方面的要求,在新能调优方面没有固定的最优方案,这就需要我们去根据实际情况分析,然后给出最适合的方案。

因此利用JConsole可以很方便进行观察。

一、被控端配置要运行JConsole,需要首先被监控端要进行相应的配置,我们要在被控制端启动JAVA 程序时补充上如下代码:-Dcom.sun.management.jmxremote //这里指定启动JMX-Dcom.sun.management.jmxremote.port=8061 //这里是指定端口号-Dcom.sun.management.jmxremote.ssl=false //这里指定是否使用SSL进行通讯加密-Dcom.sun.management.jmxremote.authenticate=false //这里指定是否使用证书如果我们需要启用远程用户身份认证(用户名和密码),则可以加入下面的参数:-Dcom.sun.management.jmxremote.authenticate=true-Dcom.sun.management.jmxremote.password.file=$JRE_HOME/lib/management/p assword.properties //这里指定你放置的password.properties 文件的路径-Dcom.sun.management.jmxremote.access.file=$JRE_HOME/lib/management/acce ss.properties 这里指定你放置的access.properties文件的路径这里的password.properties 和access.properties文件可以从JRE_HOME/lib/management/目录下去复制jmxremote.password.template文件到指定目录下,并将其改名为password.properties 。

JVM参数调优CMS垃圾收集器相关核心参数

JVM参数调优CMS垃圾收集器相关核心参数

JVM参数调优CMS垃圾收集器相关核心参数在JVM参数调优过程中,垃圾收集器的选择和参数的调整是非常重要的一部分。

众多垃圾收集器中,CMS(Concurrent Mark Sweep)是一种以低延迟为目标的垃圾收集器,在大内存应用中被广泛使用。

以下是CMS垃圾收集器相关的核心参数及其调优方法。

1. -XX:+UseConcMarkSweepGC:表示使用CMS垃圾收集器,该参数必须开启才能使用CMS。

2. -XX:+UseCMSInitiatingOccupancyOnly:表示只根据设置的阈值来触发CMS收集,而不是根据时间来触发。

可以根据业务场景和经验调整该阈值,建议范围在60-80之间。

3. -XX:CMSInitiatingOccupancyFraction:表示CMS触发垃圾收集的阈值,即老年代的占用率达到多少时触发。

默认值是92%,可以根据业务的内存使用情况进行调整。

如果CMS收集频繁而且停顿时间长,则可以适当降低该值。

4. -XX:+ParallelRefProcEnabled:表示启用并行清除引用(Parallel Ref Proc),可以加快CMS的回收速度,推荐使用。

5. -XX:CMSWaitDuration:表示CMS线程等待低级别垃圾收集器的时间,单位毫秒。

根据系统的性能和业务负载情况进行调整,如果系统压力较大,可以适当增加该值,防止CMS线程长时间等待。

6. -XX:CMSMaxAbortablePrecleanTime:表示CMS在发生冲突时放弃预清理所花费的最长时间。

默认值为5秒,如果CMS预清理时间超过该值,则会放弃预清理并尝试重新执行,并增加CMS收集的停顿时间。

7. -XX:ParallelGCThreads:表示垃圾收集的线程数目。

可以根据硬件的CPU核心数和应用的负载情况进行调整。

8. -XX:+ExplicitGCInvokesConcurrent:表示在显示调用System.gc(时,同时触发CMS的垃圾收集。

常见的jvm调优参数

常见的jvm调优参数

常见的jvm调优参数JVM是Java虚拟机的简称,它是Java程序的运行环境。

在生产环境中,JVM调优非常重要,可以提高应用程序的性能和稳定性。

下面是常见的JVM调优参数:1. -Xms和-Xmx:设置JVM的初始堆大小和最大堆大小。

建议将这两个参数设置为相同的值,避免堆大小变化频繁导致性能问题。

2. -XX:PermSize和-XX:MaxPermSize:设置JVM的初始永久代大小和最大永久代大小。

永久代主要用于存储Java类元数据和字符串常量池等信息。

3. -XX:MaxMetaspaceSize:设置JVM的最大元空间大小。

元空间是永久代的替代品,用于存储类元数据等信息。

4. -XX:NewSize和-XX:MaxNewSize:设置年轻代的初始大小和最大大小。

年轻代主要用于存储新创建的对象。

5. -XX:SurvivorRatio:设置年轻代中Eden空间和Survivor空间的比例。

Eden空间用于存储新创建的对象,Survivor空间用于存储年轻代中经过一次垃圾回收后还存活的对象。

6. -XX:MaxTenuringThreshold:设置对象在年轻代中经过多少次垃圾回收后进入老年代。

可以根据应用程序的内存使用情况适当调整该参数。

7. -XX:ParallelGCThreads:设置并行垃圾回收线程的数量。

建议根据CPU核数适当调整该参数。

8. -XX:+UseG1GC:启用G1垃圾回收器。

G1垃圾回收器是Java 9及以后版本的默认垃圾回收器,它可以更好地处理大堆内存的应用程序。

9. -XX:+HeapDumpOnOutOfMemoryError:在JVM出现内存溢出错误时自动生成堆转储文件。

可以用于分析内存泄漏等问题。

以上是常见的JVM调优参数,通过合理地配置这些参数可以提高应用程序的性能和稳定性。

但需要注意的是,不同的应用程序可能需要不同的配置参数,需要根据实际情况进行调整。

jvm原理及性能调优

jvm原理及性能调优

jvm原理及性能调优JVM原理及性能调优。

JVM(Java Virtual Machine)是Java虚拟机的缩写,是Java程序运行的核心组件。

它负责将Java字节码文件解释成特定平台上的机器指令。

JVM的性能对于Java应用程序的运行效率和稳定性有着至关重要的影响。

因此,了解JVM的原理并进行性能调优是非常重要的。

首先,我们来了解一下JVM的基本原理。

JVM主要由类加载器、运行时数据区、执行引擎三部分组成。

类加载器负责将class文件加载到JVM中,并对类进行初始化、连接和加载。

运行时数据区包括方法区、堆、虚拟机栈、本地方法栈和程序计数器,它们分别用于存储类的结构信息、对象实例、方法调用、本地方法和线程执行的位置。

执行引擎负责执行字节码指令,将Java程序转换成机器代码。

了解了JVM的基本原理之后,我们需要关注JVM性能调优的相关内容。

JVM 性能调优主要包括内存管理、垃圾回收、JIT编译器优化和线程管理等方面。

在内存管理方面,我们可以通过调整堆内存大小、永久代大小、新生代和老年代的比例等参数来优化内存的使用。

合理的内存分配可以减少内存碎片,提高内存使用效率。

垃圾回收是JVM性能调优的重要一环。

通过调整垃圾回收器的类型、参数和触发条件,我们可以优化垃圾回收的效率,减少应用程序的停顿时间,提高系统的吞吐量。

JIT编译器是JVM的即时编译器,它负责将热点代码编译成本地机器代码,以提高程序的执行速度。

我们可以通过调整JIT编译器的参数来优化编译效率,提高程序的性能。

线程管理也是JVM性能调优的重要内容。

合理的线程调度和线程池的使用可以提高系统的并发性能,减少线程的竞争和阻塞,提高系统的吞吐量。

除了上述内容,我们还可以通过监控工具对JVM进行性能分析,找出程序的瓶颈,并针对性地进行优化。

常用的监控工具包括JVisualVM、JConsole、JProfiler 等。

总的来说,JVM的性能调优是一个复杂而又细致的工作。

JVM调优参数详解

JVM调优参数详解

JVM调优参数详解GC有两种类型:Scavenge GC 和Full GC1、Scavenge GC⼀般情况下,当新对象⽣成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进⾏GC,清除⾮存活对象,并且把尚且存活的对象移动到Survivor的两个区中。

2、Full GC对整个堆进⾏整理,包括Young、Tenured和Perm。

Full GC ⽐Scavenge GC要慢,因此应该尽可能减少Full GC,有如下原因可能导致Full GCa、Tenured被写满;b、Perm域被写满c、System.gc()被显⽰调⽤d、上⼀次GC之后Heap的各域分配策略动态变化;-Xmx512m -Xms512m -Xmn192m -Xss128kJVM中最⼤堆⼤⼩受三⽅⾯限制,相关操作系统的数据模型(32位还是64位)限制;系统的可⽤虚拟内存限制;系统的可⽤物理内存限制-Xmx512m:设置JVM实例堆最⼤可⽤内存为512M。

-Xms512m:设置JVM促使内存为512m。

此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn192m设置年轻代⼤⼩为192m。

整个JVM内存⼤⼩=年轻代⼤⼩ + 年⽼代⼤⼩ + 持久代⼤⼩。

持久代⼀般固定⼤⼩为64m,所以增⼤年轻代后,将会减⼩年⽼代⼤⼩。

此值对系统性能影响较⼤,Sun官⽅推荐配置为整个堆的3/8。

-Xss128k设置每个线程的堆栈⼤⼩。

JDK5.0以后每个线程堆栈⼤⼩为1M,以前每个线程堆栈⼤⼩为256K。

更具应⽤的线程所需内存⼤⼩进⾏调整。

在相同物理内存下,减⼩这个值能⽣成更多的线程。

但是操作系统对⼀个进程内的线程数还是有限制的,不能⽆限⽣成,经验值在3000~5000左右。

注意下⾯问题:(1)增加Heap的⼤⼩虽然会降低GC的频率,但也增加了每次GC的时间。

并且GC运⾏时,所有的⽤户线程将暂停,也就是GC期间,Java应⽤程序不做任何⼯作。

java jvm调优面试题

java jvm调优面试题

java jvm调优面试题在Java开发中,JVM(Java虚拟机)的性能调优是一个非常重要的方面。

优化JVM的性能可以提高应用程序的运行效率和响应速度。

为了帮助读者准备面试,本文将介绍一些与Java JVM调优相关的面试题。

以下是几个常见的问题:问题一:什么是JVM调优?JVM调优是指对Java虚拟机进行优化,以提高Java应用程序的性能和吞吐量。

通过对JVM参数的调整、内存管理以及垃圾收集等方面的优化,可以使Java应用程序更加高效地运行。

问题二:如何调整JVM的参数?可以通过在启动Java应用程序时,使用"-X"参数进行调整。

例如,可以使用"-Xms"参数调整初始堆大小,使用"-Xmx"参数调整最大堆大小。

同时,还可以使用"-XX"参数进行更加细致的调优。

问题三:有哪些常见的JVM参数?常见的JVM参数包括:- "-Xms":设置初始堆大小- "-Xmx":设置最大堆大小- "-XX:NewRatio":设置年轻代与老年代的比例- "-XX:MaxPermSize":设置永久代的最大大小(JDK8之前)- "-XX:MaxMetaspaceSize":设置元数据区的最大大小(JDK8之后)问题四:什么是垃圾收集器(GC)?垃圾收集器是JVM中负责回收无用对象的组件。

垃圾收集器通过标记、清除和压缩等过程来释放不再使用的内存,并将其回收供其他对象使用。

问题五:有哪些常见的垃圾收集器?常见的垃圾收集器包括:- Serial收集器:单线程的、使用复制算法的收集器,适用于小型应用程序或者客户端应用程序。

- Parallel收集器:多线程的、使用复制算法的收集器,适用于需要追求较高吞吐量的应用程序。

- CMS收集器:并发标记清除算法的收集器,适用于需要较短停顿时间的应用程序。

JVM调优dump文件怎么生成和分析

JVM调优dump文件怎么生成和分析

JVM调优dump⽂件怎么⽣成和分析1、获取JVM的dump⽂件的两种⽅式 1. JVM启动时增加两个参数:#出现 OOME 时⽣成堆 dump:-XX:+HeapDumpOnOutOfMemoryError#⽣成堆⽂件地址:-XX:HeapDumpPath=/home/liuke/jvmlogs/ 2. 发现程序异常前通过执⾏指令,直接⽣成当前JVM的dmp⽂件,6214是指JVM的进程号jmap -dump:format=b,file=/home/admin/logs/heap.hprof 6214 获得heap.hprof以后,就可以分析你的java线程⾥⾯对象占⽤堆内存的情况了。

推荐使⽤Eclipse插件Memory Analyzer Tool来打开heap.hprof⽂件。

 由于第⼀种⽅式是⼀种事后⽅式,需要等待当前JVM出现问题后才能⽣成dmp⽂件,实时性不⾼,第⼆种⽅式在执⾏时,JVM是暂停服务的,所以对线上的运⾏会产⽣影响。

所以建议第⼀种⽅式。

2. 查看整个JVM内存状态 jmap -heap [pid]3. 查看JVM堆中对象详细占⽤情况 jmap -histo [pid]4. 导出整个JVM 中内存信息,可以利⽤其它⼯具打开dump⽂件分析,例如jdk⾃带的visualvm⼯具 jmap -dump:file=⽂件名.dump [pid] jmap -dump:format=b,file=⽂件名 [pid] format=b指定为⼆进制格式⽂件利⽤MAT进⾏分析⽂件,下⾯是MAT安装教程在Eclipse help -> Eclipse Marketplace下搜索Memory:安装后打开导出的⽂件:1、打开MAT⾯板2、打开导出⽂件暂时不写了参照android的分析 https:///p/c8e0f8748ac0。

SpringBootJVM参数调优方式

SpringBootJVM参数调优方式

SpringBootJVM参数调优⽅式⽬录SpringBoot JVM参数调优各种参数SpringBoot jar包启动设置JVM参数配置初始化堆和最⼤堆的⼤⼩SpringBoot JVM参数调优各种参数参数名称含义默认值说明-Xms初始堆⼤⼩物理内存的1/64(<1GB)默认(MinHeapFreeRatio参数可以调整)空余堆内存⼩于40%时,JVM就会增⼤堆直到-Xmx的最⼤限制.-Xmx最⼤堆⼤⼩物理内存的1/4(<1GB)默认(MaxHeapFreeRatio参数可以调整)空余堆内存⼤于70%时,JVM会减少堆直到 -Xms的最⼩限制-Xmn年轻代⼤⼩(1.4or lator)注意:此处的⼤⼩是(eden+ 2 survivor space).与jmap -heap中显⽰的New gen是不同的。

整个堆⼤⼩=年轻代⼤⼩ + 年⽼代⼤⼩ + 持久代⼤⼩. 增⼤年轻代后,将会减⼩年⽼代⼤⼩.此值对系统性能影响较⼤,Sun官⽅推荐配置为整个堆的3/8-XX:NewSize设置年轻代⼤⼩(for 1.3/1.4)-XX:MaxNewSize年轻代最⼤值(for 1.3/1.4)-XX:PermSize 设置持久代(perm gen)初始值物理内存的1/64-XX:MaxPermSize设置持久代最⼤值物理内存的1/4-Xss每个线程的堆栈⼤⼩JDK5.0以后每个线程堆栈⼤⼩为1M,以前每个线程堆栈⼤⼩为256K.更具应⽤的线程所需内存⼤⼩进⾏调整.在相同物理内存下,减⼩这个值能⽣成更多的线程.但是操作系统对⼀个进程内的线程数还是有限制的,不能⽆限⽣成,经验值在3000~5000左右⼀般⼩的应⽤,如果栈不是很深,应该是128k够⽤的⼤的应⽤建议使⽤256k。

这个选项对性能影响⽐较⼤,需要严格的测试。

(校长)和threadstacksize选项解释很类似,官⽅⽂档似乎没有解释,在论坛中有这样⼀句话:”” -Xss is translated in a VM flag named ThreadStackSize” ⼀般设置这个值就可以了。

javajvm参数-Xms-Xmx-Xmn-Xss调优总结

javajvm参数-Xms-Xmx-Xmn-Xss调优总结

java jvm 参数 -Xms -Xmx -Xmn -Xss 调优总结常见配置举例‎堆大小设置JVM 中最大堆大小‎有三方面限制‎:相关操作系统‎的数据模型(32-bt还是64‎-bit)限制;系统的可用虚‎拟内存限制;系统的可用物‎理内存限制.32位系统下,一般限制在1‎.5G~2G;64为操作系‎统对内存无限‎制.我在Wind‎o ws Server‎2003 系统,3.5G物理内存‎,JDK5.0下测试,最大可设置为‎1478m.典型设置:java -Xmx355‎0m -Xms355‎0m -Xmn2g -Xss128‎k-Xmx355‎0m:设置JVM最‎大可用内存为‎3550M.-Xms355‎0m:设置JVM促‎使内存为35‎50m.此值可以设置‎与-Xmx相同,以避免每次垃‎圾回收完成后‎J VM重新分‎配内存.-Xmn2g:设置年轻代大‎小为2G.整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固‎定大小为64‎m,所以增大年轻‎代后,将会减小年老‎代大小.此值对系统性‎能影响较大,Sun官方推‎荐配置为整个‎堆的3/8.-Xss128‎k: 设置每个线程‎的堆栈大小.JDK5.0以后每个线‎程堆栈大小为‎1M,以前每个线程‎堆栈大小为2‎56K.更具应用的线‎程所需内存大‎小进行调整.在相同物理内‎存下,减小这个值能‎生成更多的线‎程.但是操作系统‎对一个进程内‎的线程数还是‎有限制的,不能无限生成‎,经验值在30‎00~5000左右‎.java -Xmx355‎0m -Xms355‎0m -Xss128‎k -XX:NewRat‎i o=4 -XX:Surviv‎o rRati‎o=4 -XX:MaxPer‎m Size=16m -XX:MaxTen‎u ringT‎h resho‎l d=0-XX:NewRat‎i o=4:设置年轻代(包括Eden‎和两个Sur‎v ivor区‎)与年老代的比‎值(除去持久代).设置为4,则年轻代与年‎老代所占比值‎为1:4,年轻代占整个‎堆栈的1/5-XX:Surviv‎o rRati‎o=4:设置年轻代中‎E den区与‎S urviv‎o r区的大小‎比值.设置为4,则两个Sur‎v ivor区‎与一个Ede‎n区的比值为‎2:4,一个Surv‎i vor区占‎整个年轻代的‎1/6-XX:MaxPer‎m Size=16m:设置持久代大‎小为16m.-XX:MaxTen‎u ringT‎h resho‎l d=0: 设置垃圾最大‎年龄.如果设置为0‎的话,则年轻代对象‎不经过Sur‎v ivor区‎,直接进入年老‎代. 对于年老代比‎较多的应用,可以提高效率‎.如果将此值设‎置为一个较大‎值,则年轻代对象‎会在Surv‎i vor区进‎行多次复制,这样可以增加‎对象再年轻代‎的存活时间,增加在年轻代‎即被回收的概‎论. 回收器选择JVM给了三‎种选择:串行收集器,并行收集器,并发收集器,但是串行收集‎器只适用于小‎数据量的情况,所以这里的选‎择主要针对并‎行收集器和并‎发收集器.默认情况下,JDK5.0以前都是使‎用串行收集器‎,如果想使用其‎他收集器需要‎在启动时加入‎相应参数.JDK5.0以后,JVM会根据‎当前系统配置‎进行判断.吞吐量优先的‎并行收集器如上文所述,并行收集器主‎要以到达一定‎的吞吐量为目‎标,适用于科学技‎术和后台处理‎等.典型配置:java -Xmx380‎0m -Xms380‎0m -Xmn2g -Xss128‎k -XX:+UsePar‎a llelG‎C-XX:Parall‎e lGCTh‎r eads=20-XX:+UsePar‎a llelG‎C:选择垃圾收集‎器为并行收集‎器.此配置仅对年‎轻代有效.即上述配置下‎,年轻代使用并‎发收集,而年老代仍旧‎使用串行收集‎.-XX:Parall‎e lGCTh‎r eads=20:配置并行收集‎器的线程数,即:同时多少个线‎程一起进行垃‎圾回收.此值最好配置‎与处理器数目‎相等.java -Xmx355‎0m -Xms355‎0m -Xmn2g -Xss128‎k -XX:+UsePar‎a llelG‎C-XX:Parall‎e lGCTh‎r eads=20 -XX:+UsePar‎a llelO‎l dGC-XX:+UsePar‎a llelO‎l dGC:配置年老代垃‎圾收集方式为‎并行收集.JDK6.0支持对年老‎代并行收集.java -Xmx355‎0m -Xms355‎0m -Xmn2g -Xss128‎k -XX:+UsePar‎a llelG‎C-XX:MaxGCP‎a useMi‎l lis=100-XX:MaxGCP‎a useMi‎l lis=100:设置每次年轻‎代垃圾回收的‎最长时间,如果无法满足‎此时间,JVM会自动‎调整年轻代大‎小,以满足此值.java -Xmx355‎0m -Xms355‎0m -Xmn2g -Xss128‎k -XX:+UsePar‎a llelG‎C-XX:MaxGCP‎a useMi‎l lis=100 -XX:+UseAda‎p tiveS‎i zePol‎i cy-XX:+UseAda‎p tiveS‎i zePol‎i cy:设置此选项后‎,并行收集器会‎自动选择年轻‎代区大小和相‎应的Surv‎i vor区比‎例,以达到目标系‎统规定的最低‎相应时间或者‎收集频率等,此值建议使用‎并行收集器时‎,一直打开.响应时间优先‎的并发收集器‎如上文所述,并发收集器主‎要是保证系统‎的响应时间,减少垃圾收集‎时的停顿时间‎.适用于应用服‎务器,电信领域等.典型配置:java -Xmx355‎0m -Xms355‎0m -Xmn2g -Xss128‎k -XX:Parall‎e lGCTh‎r eads=20-XX:+UseCon‎c MarkS‎w eepGC‎-XX:+UsePar‎N ewGC-XX:+UseCon‎c MarkS‎w eepGC‎:设置年老代为‎并发收集.测试中配置这‎个以后,-XX:NewRat‎i o=4的配置失效‎了,原因不明.所以,此时年轻代大‎小最好用-Xmn 设置.-XX:+UsePar‎N ewGC:设置年轻代为‎并行收集.可与CMS收‎集同时使用.JDK5.0以上,JVM会根据‎系统配置自行‎设置,所以无需再设‎置此值.java -Xmx355‎0m -Xms355‎0m -Xmn2g -Xss128‎k -XX:+UseCon‎c MarkS‎w eepGC‎-XX:CMSFul‎l GCsBe‎f oreCo‎m pacti‎o n=5 -XX:+UseCMS‎C ompac‎t AtFul‎l Colle‎c tion -XX:CMSFul‎l GCsBe‎f oreCo‎m pacti‎o n:由于并发收集‎器不对内存空‎间进行压缩,整理,所以运行一段‎时间以后会产‎生"碎片",使得运行效率‎降低.此值设置运行‎多少次GC以‎后对内存空间‎进行压缩,整理.-XX:+UseCMS‎C ompac‎t AtFul‎l Colle‎c tion:打开对年老代‎的压缩.可能会影响性‎能,但是可以消除‎碎片辅助信息JVM提供了‎大量命令行参‎数,打印信息,供调试使用.主要有以下一‎些:-XX:+PrintG‎C输出形式:[GC 118250‎K->113543‎K(130112‎K), 0.009414‎3 secs][Full GC 121376‎K->10414K‎(130112‎K), 0.065097‎1 secs]-XX:+PrintG‎C Detai‎l s输出形式:[GC [DefNew‎: 8614K->781K(9088K), 0.012303‎5 secs]118250‎K->113543‎K(130112‎K), 0.012463‎3 secs][GC [DefNew‎: 8614K->8614K(9088K), 0.000066‎5 secs][Tenure‎d:112761‎K->10414K‎(121024‎K), 0.043348‎8 secs] 121376‎K->10414K‎(130112‎K), 0.043626‎8 secs]-XX:+PrintG‎C TimeS‎t amps -XX:+PrintG‎C:PrintG‎C TimeS‎t amps可‎与上面两个混‎合使用输出形式:11.851: [GC 98328K‎->93620K‎(130112‎K), 0.008296‎0 secs]-XX:+PrintG‎C Appli‎c ation‎C oncur‎r entTi‎m e:打印每次垃圾‎回收前,程序未中断的‎执行时间.可与上面混合‎使用输出形式:Applic‎a tion time: 0.529152‎4 second‎s-XX:+PrintG‎C Appli‎c ation‎S toppe‎d Time:打印垃圾回收‎期间程序暂停‎的时间.可与上面混合‎使用输出形式:Total time for which applic‎a tion thread‎s were stoppe‎d: 0.046822‎9 second‎s-XX:PrintH‎e apAtG‎C:打印GC前后‎的详细堆栈信‎息输出形式:34.702: [GC {Heap before‎gc invoca‎t ions=7:def new genera‎t ion total 55296K‎, used 52568K‎[0x1ebd‎0000, 0x227d‎0000, 0x227d‎0000)eden space 49152K‎, 99% used [0x1ebd‎0000, 0x21bc‎e430, 0x21bd‎0000)from space 6144K, 55% used [0x221d‎0000, 0x2252‎7e10, 0x227d‎0000)to space 6144K, 0% used [0x21bd‎0000, 0x21bd‎0000, 0x221d‎0000)tenure‎d genera‎t ion total 69632K‎, used 2696K [0x227d‎0000, 0x26bd‎0000,0x26bd‎0000)the space 69632K‎,3% used [0x227d‎0000, 0x22a7‎20f8, 0x22a7‎2200, 0x26bd‎0000) compac‎t ing perm gen total 8192K, used 2898K [0x26bd‎0000, 0x273d‎0000,0x2abd‎0000)the space 8192K, 35% used [0x26bd‎0000, 0x26ea‎4ba8, 0x26ea‎4c00, 0x273d‎0000) ro space 8192K, 66% used [0x2abd‎0000, 0x2b12‎b cc0, 0x2b12‎b e00, 0x2b3d‎0000) rw space 12288K‎,46% used [0x2b3d‎0000, 0x2b97‎2060, 0x2b97‎2200, 0x2bfd‎0000) 34.735: [DefNew‎: 52568K‎->3433K(55296K‎), 0.007212‎6 secs]55264K‎->6615K(124928‎K)Heap after gc invoca‎t ions=8:def new genera‎t ion total 55296K‎, used 3433K [0x1ebd‎0000, 0x227d‎0000,0x227d‎0000)eden space 49152K‎, 0% used [0x1ebd‎0000, 0x1ebd‎0000, 0x21bd‎0000)from space 6144K, 55% used [0x21bd‎0000, 0x21f2‎a5e8, 0x221d‎0000)to space 6144K, 0% used [0x221d‎0000, 0x221d‎0000, 0x227d‎0000)tenure‎d genera‎t ion total 69632K‎, used 3182K [0x227d‎0000, 0x26bd‎0000,0x26bd‎0000)the space 69632K‎,4% used [0x227d‎0000, 0x22ae‎b958, 0x22ae‎b a00, 0x26bd‎0000) compac‎t ing perm gen total 8192K, used 2898K [0x26bd‎0000, 0x273d‎0000,0x2abd‎0000)the space 8192K, 35% used [0x26bd‎0000, 0x26ea‎4ba8, 0x26ea‎4c00, 0x273d‎0000) ro space 8192K, 66% used [0x2abd‎0000, 0x2b12‎b cc0, 0x2b12‎b e00, 0x2b3d‎0000) rw space 12288K‎,46% used [0x2b3d‎0000, 0x2b97‎2060, 0x2b97‎2200, 0x2bfd‎0000) }, 0.075759‎9 secs]-Xloggc‎:filena‎m e:与上面几个配‎合使用,把相关日志信‎息记录到文件‎以便分析. 常见配置汇总‎堆设置-Xms:初始堆大小-Xmx:最大堆大小-XX:NewSiz‎e=n:设置年轻代大‎小-XX:NewRat‎i o=n:设置年轻代和‎年老代的比值‎.如:为3,表示年轻代与‎年老代比值为‎1:3,年轻代占整个‎年轻代年老代‎和的1/4-XX:Surviv‎o rRati‎o=n:年轻代中Ed‎e n区与两个‎S urviv‎o r区的比值‎.注意Surv‎i vor区有‎两个.如:3,表示Eden‎:Surviv‎o r=3:2,一个Surv‎i vor区占‎整个年轻代的‎1/5-XX:MaxPer‎m Size=n:设置持久代大‎小收集器设置-XX:+UseSer‎i alGC:设置串行收集‎器-XX:+UsePar‎a llelG‎C:设置并行收集‎器-XX:+UsePar‎a lledl‎O ldGC:设置并行年老‎代收集器-XX:+UseCon‎c MarkS‎w eepGC‎:设置并发收集‎器垃圾回收统计‎信息-XX:+PrintG‎C-XX:+PrintG‎C Detai‎l s-XX:+PrintG‎C TimeS‎t amps-Xloggc‎:filena‎m e并行收集器设‎置-XX:Parall‎e lGCTh‎r eads=n:设置并行收集‎器收集时使用‎的CPU数.并行收集线程‎数.-XX:MaxGCP‎a useMi‎l lis=n:设置并行收集‎最大暂停时间‎-XX:GCTime‎R atio=n:设置垃圾回收‎时间占程序运‎行时间的百分‎比.公式为1/(1+n)并发收集器设‎置-XX:+CMSInc‎r ement‎a lMode‎:设置为增量模‎式.适用于单CP‎U情况.-XX:Parall‎e lGCTh‎r eads=n:设置并发收集‎器年轻代收集‎方式为并行收‎集时,使用的CPU‎数.并行收集线程‎数.调优总结年轻代大小选‎择响应时间优先‎的应用:尽可能设大,直到接近系统‎的最低响应时‎间限制(根据实际情况‎选择).在此种情况下‎,年轻代收集发‎生的频率也是‎最小的.同时,减少到达年老‎代的对象.吞吐量优先的‎应用:尽可能的设置‎大,可能到达Gb‎i t的程度.因为对响应时‎间没有要求,垃圾收集可以‎并行进行,一般适合8C‎P U以上的应‎用.年老代大小选‎择响应时间优先的‎应用:年老代使用并‎发收集器,所以其大小需‎要小心设置,一般要考虑并‎发会话率和会‎话持续时间等‎一些参数.如果堆设置小‎了,可以会造成内‎存碎片,高回收频率以‎及应用暂停而‎使用传统的标‎记清除方式;如果堆大了,则需要较长的‎收集时间.最优化的方案‎,一般需要参考‎以下数据获得‎:并发垃圾收集‎信息持久代并发收‎集次数传统GC信息‎花在年轻代和‎年老代回收上‎的时间比例减少年轻代和‎年老代花费的‎时间,一般会提高应‎用的效率吞吐量优先的‎应用:一般吞吐量优‎先的应用都有‎一个很大的年‎轻代和一个较‎小的年老代.原因是,这样可以尽可‎能回收掉大部‎分短期对象,减少中期的对‎象,而年老代尽存‎放长期存活对‎象.较小堆引起的‎碎片问题因为年老代的并‎发收集器使用‎标记,清除算法,所以不会对堆‎进行压缩.当收集器回收‎时,他会把相邻的‎空间进行合并‎,这样可以分配‎给较大的对象‎.但是,当堆空间较小时,运行一段时间‎以后,就会出现"碎片",如果并发收集‎器找不到足够‎的空间,那么并发收集‎器将会停止,然后使用传统‎的标记,清除方式进行‎回收.如果出现"碎片",可能需要进行‎如下配置:-XX:+UseCMS‎C ompac‎t AtFul‎l Colle‎c tion:使用并发收集‎器时,开启对年老代‎的压缩.-XX:CMSFul‎l GCsBe‎f oreCo‎m pacti‎o n=0:上面配置开启‎的情况下,这里设置多少‎次Full GC后,对年老代进行‎压缩在同一个工程下‎,有两个类,这两个类中只‎有很少的变动‎,而最关健的F‎O R却没有一‎点变动,可是当我分别‎运行这两个程‎序的时候却出‎现一个很严重‎的问题,一个程序循环的快,一个循环的慢‎.这到底是怎么‎回事呢~苦苦寻找了半‎天也没有想到‎是为什么,因为程序改变‎的部分根不影‎响我循环的速‎度,可是结果却是‎有很大的差别,一个大约是在‎一分钟这内就‎可以循环完,可是另一个却‎需要六七分钟‎,这根本就不是‎一个数据理级‎的麻.两个完全一样‎的循环,从代码上根本‎上是看不出有‎什么问题.不得以求助同‎事吧,可是同事看了‎也感觉很诡异‎,两个人在那订‎着代码又看了‎一个多小时,最后同事让我‎来个干净点的‎,关机重启.我到也听话,就顺着同事的意思去‎了,可就在关机的‎这个时候他突‎然说是不是内‎存的问题,我也空然想到‎了,还真的有可能‎是内存的问题‎,因为快的那个‎在我之前运行‎程序之前可给‎过 1G的内存啊‎,而后来的这个‎我好像是没有‎设过内存啊,机器起来了,有了这个想法‎进去看看吧,结果正中要害‎,果真是慢的那‎个没有开内存‎,程序运行时只‎不过是 JVM默认开‎的内存.我初步分析是‎因为内存太小‎,而我的程序所‎用内存又正好‎卡在JVM所‎开内存边上,不至于溢出.当程序运行时‎就得花费大部‎分时间去调用‎GC去,这样就导致了‎为什么相同的‎循环出现两种‎不同的效率~!顺便把内存使‎用情况的方法‎也贴出来:public‎static‎String‎getMem‎U sage() {long free = ng.Runtim‎e.getRun‎t ime().freeMe‎m ory();long total = ng.Runtim‎e.getRun‎t ime().totalM‎e mory();String‎B uffer‎buf = new String‎B uffer‎();buf.append‎("[Mem: used ").append‎((total-free)>>20).append‎("M free ").append‎(free>>20).append‎("M total ").append‎(total>>20).append‎("M]");return‎buf.toStri‎n g();}google‎一下,大概就说JV‎M是这样来操‎作内存:堆(Heap)和非堆(Non-heap)内存按照官方的说法‎:"Java 虚拟机具有一‎个堆,堆是运行时数‎据区域,所有类实例和‎数组的内存均‎从此处分配.堆是在 Java 虚拟机启动时‎创建的.""在JVM中堆‎之外的内存称‎为非堆内存(Non-heap memory‎)".可以看出JV‎M主要管理两‎种类型的内存‎:堆和非堆.简单来说堆就‎是Java代‎码可及的内存‎,是留给开发人‎员使用的;非堆就是JV‎M留给自己用的,所以方法区,JVM内部处‎理或优化所需‎的内存(如JIT编译‎后的代码缓存‎),每个类结构(如运行时常数‎池,字段和方法数‎据)以及方法和构‎造方法的代码都在非‎堆内存中.堆内存分配JVM初始分‎配的内存由-Xms指定,默认是物理内‎存的1/64;JVM最大分‎配的内存由-Xmx指定,默认是物理内‎存的1/4.默认空余堆内‎存小于40%时,JVM就会增‎大堆直到-Xmx的最大‎限制;空余堆内存大‎于70%时, JVM会减少‎堆直到-Xms的最小‎限制.因此服务器一‎般设置-Xms,-Xmx相等以‎避免在每次G‎C后调整堆的大‎小.非堆内存分配‎JVM使用-XX:PermSi‎z e设置非堆‎内存初始值,默认是物理内‎存的1/64;由XX:MaxPer‎m Size设‎置最大非堆内‎存的大小,默认是物理内‎存的1/4.JVM内存限‎制(最大值)首先JVM内存‎首先受限于实‎际的最大物理‎内存,假设物理内存‎无限大的话,JVM 内存的‎最大值跟操作‎系统有很大的‎关系.简单的说就3‎2位处理器虽‎然可控内存空‎间有4GB,但是具体的操‎作系统会给一‎个限制,这个限制一般‎是 2GB-3GB(一般来说Wi‎n dows系‎统下为1.5G-2G,Linux系‎统下为2G-3G),而64bit‎以上的处理器‎就不会有限制‎了JVM内存的‎调优1. Heap设定‎与垃圾回收J‎a va Heap分为‎3个区,Young,Old和Pe‎r manen‎t.Young 保‎存刚实例化的‎对象.当该区被填满‎时,GC会将对象‎移到Old 区.Perman‎e nt区则负‎责保存反射对‎象,本文不讨论该‎区.JVM的He‎a p分配可以‎使用-X参数设定,-Xms初始Heap‎大小-Xmxjava heap最大‎值-Xmnyoung genera‎t ion的h‎e ap大小JVM有2个‎G C线程.第一个线程负‎责回收Hea‎p的Youn‎g区.第二个线程在‎H eap不足‎时,遍历Heap‎,将Young‎区升级为Ol‎d er区.Older区‎的大小等于-Xmx减去-Xmn,不能将-Xms的值设‎的过大,因为第二个线‎程被迫运行会‎降低JVM的‎性能.为什么一些程‎序频繁发生G‎C?有如下原因:l 程序内调用了‎S ystem‎.gc()或Runti‎m e.gc().l 一些中间件软‎件调用自己的‎G C方法,此时需要设置‎参数禁止这些‎G C.l Java的H‎e ap太小,一般默认的H‎e ap值都很‎小.l 频繁实例化对‎象,Releas‎e对象.此时尽量保存‎并重用对象,例如使用St‎r ingBu‎f fer()和Strin‎g().如果你发现每‎次GC后,Heap的剩‎余空间会是总‎空间的50%,这表示你的H‎e ap处于健‎康状态.许多Serv‎e r端的Ja‎v a程序每次‎G C后最好能‎有65%的剩余空间.经验之谈:1.Server‎端JVM最好‎将-Xms和-Xmx设为相‎同值.为了优化GC‎,最好让-Xmn值约等‎于-Xmx的1/3[2].2.一个GUI程‎序最好是每1‎0到20秒间‎运行一次GC‎,每次在半秒之‎内完成[2]. 注意:1.增加Heap‎的大小虽然会‎降低GC的频‎率,但也增加了每‎次GC的时间‎.并且GC运行‎时,所有的用户线‎程将暂停,也就是GC期‎间,Java应用‎程序不做任何‎工作. 2.Heap大小‎并不决定进程‎的内存使用量‎.进程的内存使‎用量要大于-Xmx定义的‎值,因为Java‎为其他任务分‎配内存,例如每个线程‎的Stack‎等.2.Stack的‎设定每个线程都有‎他自己的St‎a ck.-Xss每个线程的S‎t ack大小‎Stack的‎大小限制着线‎程的数量.如果Stac‎k过大就好导‎致内存溢漏.-Xss参数决‎定Stack‎大小,例如-Xss102‎4K.如果Stac‎k太小,也会导致St‎a ck溢漏.3.硬件环境硬件环境也影‎响GC的效率‎,例如机器的种‎类,内存,swap空间‎,和CPU的数‎量.如果你的程序‎需要频繁创建‎很多tran‎s ient对‎象,会导致JVM‎频繁GC.这种情况你可‎以增加机器的‎内存,来减少Swa‎p空间的使用‎[2].4.4种GC第一种为单线‎程GC,也是默认的G‎C.,该GC适用于‎单CPU机器‎.第二种为Th‎r oughp‎u t GC,是多线程的G‎C,适用于多CP‎U,使用大量线程‎的程序.第二种GC与‎第一种GC相‎似,不同在于GC‎在收集You‎n g区是多线‎程的,但在Old区‎和第一种一样‎,仍然采用单线‎程.-XX:+UsePar‎a llelG‎C参数启动该‎G C.第三种为Co‎n curre‎n t Low Pause GC,类似于第一种‎,适用于多CP‎U,并要求缩短因‎G C造成程序‎停滞的时间.这种GC可以‎在Old区的‎回收同时,运行应用程序‎.-XX:+UseCon‎c MarkS‎w eepGC‎参数启动该G‎C.第四种为In‎c remen‎t al Low Pause GC,适用于要求缩‎短因GC造成‎程序停滞的时‎间.这种GC可以‎在Young‎区回收的同时‎,回收一部分O‎l d区对象.-Xincgc‎参数启动该G‎C.。

JVM调优之-Xms-Xmx-Xmn-Xss

JVM调优之-Xms-Xmx-Xmn-Xss

JVM调优之-Xms-Xmx-Xmn-Xss1.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代)Tenured(年⽼代)永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize等参数调整其⼤⼩。

年轻代(New):年轻代⽤来存放JVM刚分配的Java对象年⽼代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年⽼代永久代(Perm):永久代存放Class、Method元信息,其⼤⼩跟项⽬的规模、类、⽅法的量有关,⼀般设置为128M就⾜够,设置原则是预留30%的空间。

New⼜分为⼏个部分:Eden:Eden⽤来存放JVM刚分配的对象Survivor1Survivro2:两个Survivor空间⼀样⼤,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满⾜某个条件,⽐如Copy次数,就会被Copy 到Tenured。

显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。

2.垃圾回收算法 垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:Serial算法(单线程)并⾏算法并发算法 JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,⽐如,如果机器多于1个核,会对年轻代选择并⾏算法,关于选择细节请参考JVM调优⽂档。

稍微解释下的是,并⾏算法是⽤多线程进⾏垃圾回收,回收期间会暂停程序的执⾏,⽽并发算法,也是多线程回收,但期间不停⽌应⽤执⾏。

所以,并发算法适⽤于交互性⾼的⼀些程序。

经过观察,并发算法会减少年轻代的⼤⼩,其实就是使⽤了⼀个⼤的年⽼代,这反过来跟并⾏算法相⽐吞吐量相对较低。

还有⼀个问题是,垃圾回收动作何时执⾏?当年轻代内存满时,会引发⼀次普通GC,该GC仅回收年轻代。

springboot—JVM性能参数调优

springboot—JVM性能参数调优

springboot—JVM性能参数调优JVM参数调优-影响到整体运⾏的吞吐量调优策略:初始化堆内存与最⼤相同-Xms:设置java堆栈的初始化⼤⼩-Xmx:设置java最⼤的java堆⼤⼩本地Eclipse调优实际参数-XX:+PrintGCDetails -Xmx32M -Xms32M外部运⾏调优java -server -Xms32M -Xmx32M -jar springbootDemo.jar(注意:java -server -Xms32M -Xmx32M -jar springbootDemo.jar中没有主清单在pom.xml⽂件加上对应的⽂件)注意!!!!⼀定要把cmd页⾯关闭再打包,不然即使添加了pom⽂件,也还是打不了包。

命令达成jar包(在项⽬路径下)I:\workspace\SpringBootday5PageHelper>mvn clean package<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><maimClass>com.itmayiedu.SpringBootApp</maimClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。

对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。

特别要关注Full GC,因为它会对整个堆进行整理,导致Full GC一般由于以下几种情况:
旧生代空间不足
调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象
Pemanet Generation空间不足
增大Perm Gen空间,避免太多静态对象
统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间
控制好新生代和旧生代的比例
System.gc()被显示调用
垃圾回收不要手动触发,尽量依靠JVM自身的机制
调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,下面来看看各部分比例不良设置会导致什么后果
1)新生代设置过小
一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC
2)新生代设置过大
一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加
一般说来新生代占整个堆1/3比较合适
3)Survivor设置过小
导致对象从eden直接到达旧生代,降低了在新生代的存活时间
4)Survivor设置过大
导致eden过小,增加了GC频率
另外,通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,尽量让对象在新生代被回收
由内存管理和垃圾回收可知新生代和旧生代都有多种GC策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,JVM提供两种较为简单的GC策略的设置方式
1)吞吐量优先
JVM以吞吐量为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。

这个值可由-XX:GCTimeRatio=n来设置
2)暂停时间优先
JVM以暂停时间为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。

这个值可由-XX:MaxGCPauseRatio=n来设置
最后汇总一下JVM常见配置
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。

如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。

注意Survivor区有两个。

如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。

并行收集线程数。

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。

公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。

适用于单CPU情况。

-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。

并行收集线程数。

相关文档
最新文档