三大类选项:
1. 标准选项: 功能是很稳定的,所有的标准选项都是以-开头,比如-version, -server等。
2. X选项:以-X开头,这类选项的功能还是很稳定,但官方的说法是它们的行为可能会在后续版本中改变,也有可能不在后续版本中提供了。
3. XX选项:属于实验性,主要是给JVM开发者用于开发和调试JVM的,在后续的版本中行为有可能会变化。
Hotspot JVM两种类型:server和client。
区别:
Server VM的初始堆空间会大一些,默认使用的时并行垃圾回收器。
Client VM初始堆空间会小一些,使用串行的垃圾回收器,它的目标是为了让JVM的启动速度更快。
JVM在启动的时候会根据硬件和操作系统会自动选择使用Server还是Client类型的JVM
#1、设置分配的JVM堆内存大小
java -Xms128m -Xmx2g =》初始128M,最大2G
如果堆的初始值和最大值不一样的话,JVM会根据程序的运行情况,自动调整堆的大小,这可能会影响到一些效率。针对服务端程序,一般是把堆的最小值和最大值设置为一样来避免堆扩展和收缩对性能的影响。
#2、监控堆内存溢出错误,并打印堆快照
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof =》开启堆内存溢出错误记录功能,并将快照打印至指定目录
#3、当发生OOM的时候,去执行某个脚本
-XX:OnOutOfMemoryError 用来指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本。
$ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp
#4、设置分配的永久代内存大小
永久代在堆内存中是一块独立的区域,它包含了所有 JVM 加载的类的对象表示;
这里设置的永久代大小并不会被包括在使用#1 设置的堆内存大小中。
java -XX:PermSize=128m -XX:MaxPermSize=256m =》初始128M,最大256M
调节新生代的目标是:1)避免对象过早地被移到了老生代 2)也要避免需要长期存活的对象在新生代呆的时间过长,这会提高MinorGC发生的频率以及增加单次MinorGC的时间。
#5、设置分配的新生代内存大小
新生代是#1分配的内存的一部分,新生代的空间大小不能大于老生代的大小
-XX:NewSize and -XX:MaxNewSize
一般设置为- Xmx/2
#6、设置老生代和新生代大小的比例
-XX:NewRatio
比如-XX:NewRatio=2表示1/3的Heap是新生代,2/3的Heap是老生代。使用这个选项的好处是新生代的大小也能随着Heap的变化而变化。
#7、设置新生代中Eden和Survivor空间大小的比例
-XX:SurvivorRatio
需要注意的是有两个Survivor。
比如-XX:SurvivorRatio=8表示Eden区域在新生代的8/10,两个Survivor分别占1/10。调节Survivor空间的时候也注意要折中,如果Survivor空间小的话,那么很有可能在一次MinorGC的时候Survivor空间就满了,从而对象就被移到了老生代;如果Survivor空间大的话,那么Eden区域就小了,从而导致MinorGC的发生得更频繁。
#8、把GC日志写入到一个文件中去
-Xloggc:<file>