了解虚拟机参数

3.1 虚拟机参数

在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查会有一定的帮助,为此,虚拟机提供了一些跟踪系统状态的参数,使用给定的参数执行java虚拟机,就可以在系统运行时打印相关日志,用于分析实际问题。我们进行虚拟机参数配置,其实主要就是围绕着堆、栈、方法区进行配置。

3.2 堆分配参数(一)

-XX:+PrintGC:使用这个参数,虚拟机启动后,只要遇到GC就会打印日志。
-XX:+UseSerialGC:配置串行回收器
-XX:+PrintGCDetails:可以查看详细信息,包括各个区的情况
-Xms:设置java程序启动时初始堆大小
-Xmx:设置java程序能获得的最大堆大小
示例:-Xmx20m -Xms5m -XX:+PrintCommandLineFlags:可以将隐世或者显示传给虚拟机的参数输出

总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小设置相等,这样的好处是可以减少程序运行时的垃圾回收次数,从而提高性能。

3.3 堆分配参数(二)

新生代的配置

-Xmn:可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,新生代大小一般会设置整个堆空间的1/3到1/4左右
-XX:SurvivorRatio:用来设置新生代中eden空间和from/to空间的比例。

含义:-XX:SurvivorRatio=eden/from=eden/to

示例:

//第一次配置
-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
//第二次配置
-Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC 
//第三次配置
-XX:NewRatio=老年代/新生代
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

总结:

  1. 不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,减少老年代的GC此数。
  2. 除了可以设置新生代的绝对大小(-Xmm),还可以使用(-XX:NewRatio)设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代

3.4 堆溢出处理

在java程序的运行过程中,如果堆空间不足,则会抛出内存溢出的错误(Out Of Menory) OOM,一旦这类问题发生在生产环境,可能引起严重的业务中断,java虚拟机提供了-XX:+HeapDumpOnOutOfMemoryError,使该参数可以在内存溢出时导出整个堆信息,与之配合使用的还有参数,-XXHeapDumpPath,可以设置导出堆的存放路径

内存分析工具:Memory Analyzer 1.5.0
地址:http://download.eclipse.org/mat/1.5/update-site

3.5 栈配置

java虚拟机提供了参数-Xss指定线程的最大栈空间,整个参数也直接决定了函数可调用的最大深度。

3.6 方法区

和java堆一样,方法区是一块所有线程共享的内存区域,它用于保存系统的类信息,方法区(永久区)可以保存多少信息可以对其进行配置,在默认情况下-XX:MaxPerSize为64MB,如果系统运行时产生大量的类,就需要设置一个相对合适的方法区,以免出现永久区内存溢出的问题。

示例:-XX:PermSize=64M -XX:MaxPermSize=64M

3.7 直接内存配置

直接内存也是java程序中非常重要的组成部分,特别是广泛用在NIO中,直接内存跳过了java堆,使java程序可以直接访问原生堆空间,因此在一定程度上加快了内存空间的访问速度。但是说直接内存一定就可以提高内存访问速度也不见得,具体情况具体分析。
相关配置参数:-XX:MaxDirectMemorySize,如果不设置默认值为最大堆空间,即-Xmx。直接内存使用达到上限时,就会触发垃圾回收,如果不能有效的释放空间,也会引起系统的OOM。

3.8 Client和Server虚拟机工作模式

目前java虚拟机支持Client和Server两种运行模式,使用参数-client可以指定使用Client模式,使用-server即使用Server模式。可以直接在命令行查看当前计算机系统自动选择的运行模式。java -version即可。

二者区别:Client模式相对Server启动较快,如果不追求系统的长时间使用性能仅仅是测试,可以使用Client模式。而Server模式则启动比较慢,原因是会对其进行复杂的系统性能信息收集和使用更复杂的算法对程序进行优化,一般我们的生产环境都会使用是Server模式,长期运行期性能要远远快于Client模式。

JVM不错的博客:

http://www.cnblogs.com/redcreen/archive/2001/05/04/2037057.html

你可能感兴趣的:(了解虚拟机参数)