常用JVM参数(JDK 8)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用JVM参数(JDK 8)相关的知识,希望对你有一定的参考价值。

参考技术A

-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。

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

第八章:JVM常用操作参数

①虚拟机日志参数

  -XX:+PrintGC(在jdk9.jdk10中建议使用-Xlog:gc),使用这个参数启动java虚拟机,则在GC时就会打印相应日志

  -XX:+PrintGCDetails, 该参数可以打印堆的详细信息,描述各个区间的使用情况(jdk9,jdk10中使用-Xlog:gc*)

  -XX:+PrintGCApplicationStoppedTime,可以打印应用程序由于GC产生的停顿时间

  -Xloggc:log/gc.log,该命令可以在当前目录的log文件夹下gc.log文件中记录所有GC日志

 

②类加载/卸载跟踪

  -verbose:class可跟踪类的加载、卸载

  -XX:+TraceClassLoading(jdk9,jdk10中使用-Xlog:class+load=info)跟踪类的加载

  -XX:+TraceClassUnloading(jdk9,jdk10中使用-Xlog:class+unload=info)跟踪类的卸载

③查看虚拟机参数

  -XX:+PrintCommandLineFlags,可以打印传递给虚拟机的显式和隐式参数,隐式参数可能是虚拟机启动时自行设置

④堆的配置参数

  -Xms指定初始堆,-Xmx指定最大堆(示例:-Xmx20m -Xms5m,代表初始化堆5M,堆最大可用20M)

  -Xmn指定新生代大小,一般建议设置为整个堆空间的1/3到1/4

  -XX:SurvivorRatio,(示例:-XX:SurvivorRatio=2,代表eden:from=2:1)指定新生代中eden区和from/to区的比例。新生代区中,总可用新生代大小为(eden+from)或(eden+to),正常情况下from和to区的大小相同

  -XX:NewRatio,老年代/新生代的比例

⑤堆溢出处理

程序运行过程中,若堆空间不足,则会抛出OOM异常(Out Of Memory),Java虚拟机提供了两个参数

  -XX:+HeapDumpOnOutOfMemoryError可以在内存溢出时导出整个堆的信息

  -XX:HeapDumpPath,可以指定导出堆的存放路径(绝对路径)

⑥方法区配置

   jdk1.6和jdk1.7可以使用-XX:PermSize和-XX:MaxPermSize配置永久区的大小和最大永久区的大小

  上文也提到过,jdk8开始,永久区已经彻底移除,使用元数据区存放类的元数据,默认情况下,元数据区只受系统可用内存限制,但是依旧可以用-XX:MaxMetaspaceSize指定最大可用值

⑦栈配置

  -Xss:指定线程的栈大小

⑧虚拟机的工作模式

Client模式

    使用-client可以指定使用Client模式,该模式下启动较快,系统最大堆MaxHeapSize约为256MB,CompliThreshold默认为1500,即函数被调用1500次后,会进行JIT编译

Server模式

    使用-server可以指定使用server模式,该模式启动较慢,会尝试收集更多系统性能信息,使用更复杂的优化算法对程序进行优化,因此在系统完全启动后,Server模式会远快于Client模式。

    该模式下系统最大堆MaxHeapSize约为1GB,CompliThreshold默认为10000

 

 

 

 

 

?
 

 

?
 

 

?
 

 

?
 

 

?
 

 

?
 

 

?
 

 

?
 

 

?
 

 

?

以上是关于常用JVM参数(JDK 8)的主要内容,如果未能解决你的问题,请参考以下文章

JVM核心参数配置常用调试命令工具与调优思路

jvm - 常用调优启动参数配置

JVM调优笔记3-----JVM参数配置 JDK1.8

常用jvm参数查看方式

第八章:JVM常用操作参数

JVM调优1- JVM参数及JDK自带的JVM查询工具