目前的Java虚拟机支持client和server模式,使用参数-client可以指定使用client模式,使用参数-server可以指定使用server
模式,默认情况下,虚拟机会根据操作系统的环境自动选择运行模式,使用java -version命令可以查看默认的运行模式:
[root@cdh1 ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
可以查出当前的默认运行模式为 Server VM.
-Xms400m 设置启动时的初始堆为400M,server模式下默认的最小堆为502MB
-Xmx10m 指定使用的最大堆为10M,server模式下默认的最大堆为8GB.
JVM初始分配的堆内存由-Xms指定,JVM最大分配的堆内存由-Xmx指定。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
堆分为新生代和老年代,新生代分为Eden,from,to三块,from和to是大小相等,可以互换角色的内存空间
-Xmn10m 设置新生代的大小为10M,如果预先设定了Xmx,最大堆的值是固定的,那么设置一个较大的新生代会减小老年代的大小
-XX:NewRation=2 设置老年代(tenured generation)和新生代(DefNew)的比例,server模式下默认值为2
-XX:SurvivorRation=2 设置Eden区域和from区域的比例关系,server模式下默认值为8
-XX:+DoEscapeAnalysis 启用逃逸分析,只有在server模式下才可以启用,启用过后,可以将线程私有对象分配在栈上,线程执行结束,栈销毁,内存释放,不需要GC的参与。但是线程栈的空间比较小,默认线程栈的大小为1024字节,较大的对象不合适也不能分配到线程栈上。
-XX:+EliminateAllocations 开启标量替换(默认打开),允许将对象打散分配在栈上
jdk8删除了perm,使用metaSpace来储存类信息,元数据区使用的是直接内存
-XX:MaxMetaspaceSize 指定元数据区的大小,如果不指定,默认情况下,虚拟会耗尽所有的系统内存,在指定最大值的情况下,如果内存不足,同样会产生OOM异常。
-XX:+PrintGC 只要遇到GC,就会打印日志。
-XX:+PrintGCApplicationStoppedTime GC会引起应用程序的停顿,这个参数可以打印程序因为GC而产生的停顿时间
-XX:+PrintGCDateStamps 打印GC的详细情况,同时打印GC的时间,date格式
--verbose:class 跟踪类的加载和卸载信息
-XX:+PrintVMOptions 在程序运行时,打印虚拟机接受到的命令行显示参数
-XX:+PrintCommandLineFlags 打印传递给虚拟机的显示和隐式参数,参数未必是通过命令行直接给出的,也可能是虚拟机启动时自行设置的。
-Xss10k 指定线程栈的大小,线程栈的大小影响函数的调用深度
-XX:MaxDirectMemorySize 直接内存,默认为最大堆大小
当jvm启动之后,了分析和定位一个Java线上系统问题,我们需要查看JVM启动时的一些参数设置,例如:垃圾回收算法、堆大小等等。这些参数可能在启动脚本中明确指明,也可能采用默认值。在系统运行过程中其他人也许动态调整了系统参数。 如何实时查看正在运行的JVM的参数呢?
可以使用jps命令查看进程的pid
使用jinfo -flags pid查看jvm的启动参数
网友评论