对虚拟机参数的配置,主要围绕堆、栈、方法区进行配置。
说明:
① -XX:系统级别的(JVM)配置,配置日志信息,或者是jvm使用什么样的垃圾回收器
② 非-XX:应用层的配置
③“+”:表示启用
④“-”:表示禁用
1、堆参数配置
(1)基本参数配置
-XX:+PrintGC 使用该参数,虚拟机启动后,遇到GC就会打印日志
-XX:+UseSerialGC 配置串行垃圾回收器
-XX:+PrintGCDetails 查看详细信息,包括各个区的情况
-XX:+PrintCommandLineFlags 可以将隐式或者显式传给虚拟机的参数输出
-Xms 设置Java程序启动时初始堆大小
-Xmx 设置Java程序能够获得的最大堆大小
示例:-Xms5m -Xmx20m
注意:
在实际工作中,直接将初始堆大小与最大堆大小设置相等,这样的好处减少程序运行时垃圾回收的次数,从而提高性能。
(2)新生代,老年代参数配置
-Xmn 设置新生代的绝对大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统的性能以及GC行为有很大的影响,新生代的大小一般会设置整个堆空间的1/3或1/4。
-XX:SurvivorRatio 用来设置eden空间和from/to空间的比例。含义:-XX:SurvivorRatio=eden/from=eden/to
-XX:NewRatio 用来设置老年代与新生代的比值。含义:-XX:NewRatio=老年代/新生代
注意:
不同的堆分布情况,对系统的执行会产生一定的影响,实际工作中应该根据实际情况作出合理配置。基本原则:尽量将对象预留在新生代,减少老年代GC的次数。
(3)堆溢出处理
Java程序运行的过程中如果堆空间不足,则会抛出内存溢出错误(OutOfMemoryError),该情况出现在生产环境,可能引起严重的业务中断。虚拟机提供一下参数跟踪错误信息:
-XX:+HeapDumpOnOutOfMemoryError 该参数在内存溢出时导出整个堆的信息
-XX:+HeapDumpPath 配置堆信息导出存放的路径
内存分析工具:Memory Analyzer1.5.0
2、栈配置
-Xss 指定线程最大的栈空间,这个参数也决定了函数可调用的最大深度。
3、方法区配置
方法区也称为永久区,使用如下参数对方法区进行配置
-XX:MaxPermSize
-XX:PermSize
示例:-XX:MaxPermSize=64m -XX:PermSize=64m
4、直接内存配置
直接内存也是java内存中非常重要的组成部分,广泛应用与NIO中,直接内存跳过了java堆,使得java程序直接访问原生堆空间,因此,一定程度上加快了内存空间的访问速度。但是,直接内存一定能够提高内存的访问速度也是不一定的,具体情况具体分析。
配置参数:
-XX:MaxDirectMemorySize 如果不设置默认值为最大堆空间,即-Xmx。
直接内存使用达到了上限就会触发垃圾回收,如果不能有效释放空间,会引发OOM。