-Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize)
最流行的JVM参数,用来设置JVM初始堆内存大小,和最大堆内存大小。
这两个参数单位是Byte,同时支持速记符号kmgt或KMGT。
1k = 1024Byte 1m = 1024k 1g = 1024m
举个例子,下面的命令启动了一个初始化堆内存为128M,最大堆内存为2G,名叫“MyApp”的Java应用程序。
java -Xms128m -Xmx2g MyApp
另外一种写法
java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp
设置初始堆内存为1G,最大堆内存为1G,并打印出来
java -Xms1g -Xmx1g -XX:+PrintCommandLineFlags
-XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath
如果-Xmx设置不合理,可能会内存溢出。通常来说,分析内存快照(HeapDump)是个好手段。
我们可以通过设置-XX:+HeapDumpOnOutOfMemoryError 让JVM在发生内存溢出时自动的生成堆内存快照。有了这个参数,当我们不得不面对内存溢出异常的时候会节约大量的时间。默认情况下,堆内存快照会保存在JVM的启动目录下名为java_pid<pid>.hprof 的文件里(在这里<pid>就是JVM进程的进程号)。也可以通过设置-XX:HeapDumpPath=<path>来改变默认的堆内存快照生成路径,<path>可以是相对或者绝对路径。
虽然这一切听起来很不错,但有一点我们需要牢记。堆内存快照文件有可能很庞大,特别是当内存溢出错误发生的时候。因此,我们推荐将堆内存快照生成路径指定到一个拥有足够磁盘空间的地方。
-XX:OnOutOfMemoryError
当内存溢出发生时,通过这个参数可以执行一些指令,比如发E-mail通知,重启。
在下面的例子中,当内存溢出错误发生的时候,我们会将堆内存快照写到/tmp/heapdump.hprof 文件并且在JVM的运行目录执行脚本cleanup.sh
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp
-XX:PermSize and -XX:MaxPermSize
永久代在堆内存中是一块独立的区域,它包含了所有JVM加载的类的对象表示。
-XX:PermSize初始化大小,-XX:MaxPermSize最大永久代内存大小
java -XX:PermSize=128m -XX:MaxPermSize=256m MyApp
这里设置的永久代大小并不会被包括在使用参数-XX:MaxHeapSize 设置的堆内存大小中。也就是说,通过-XX:MaxPermSize设置的永久代内存可能会需要由参数-XX:MaxHeapSize 设置的堆内存以外的更多的一些堆内存。
-XX:MetaspaceSize and -XX:MaxMetaspaceSize
主要用于jdk1.6后的版本,永久代被metaspacesize取代。
java -XX:MetaspaceSize =128m -XX:MaxMetaspaceSize=256m MyApp