JVM:内存设置

内存大小

  • -Xms 设置初始堆的大小,也是最小堆的大小,它等价于:-XX:InitialHeapSize
  • -Xmx 设置最大堆的大小,它等价于-XX:MaxHeapSize。

比如,下面这条命令就是设置堆的初始值为128m,最大值为2g。

java -Xms128m -Xmx2g MyApp

如果堆的初始值和最大值不一样的话,JVM会根据程序的运行情况,自动调整堆的大小,这可能会影响到一些效率。针对服务端程序,一般是把堆的最小值和最大值设置为一样来避免堆扩展和收缩对性能的影响。

  • -XX:PermSize 用来设置永久区的初始大小
  • -XX:MaxPermSize 用来设置永久区的最大值,永久区是存放类以及常量池的地方,如果程序需要加载的class数量非常多的话,就需要增大永久区的大小。
  • -Xss 设置线程栈的大小,线程栈的大小会影响到递归调用的深度,同时也会影响到能同时开启的线程数量。

OutofMemory(OOM)相关的选项

如果程序发生了OOM后,JVM可以配置一些选项来做些善后工作,比如把内存给dump下来,或者自动采取一些别的动作。

  • -XX:+HeapDumpOnOutOfMemoryError 表示在内存出现OOM的时候,把Heap转存(Dump)到文件以便后续分析,文件名通常是java_pid<pid>.hprof,其中pid为该程序的进程号。
  • -XX:HeapDumpPath=<path>: 用来指定heap转存文件的存储路径,需要指定的路径下有足够的空间来保存转存文件。
  • -XX:OnOutOfMemoryError 用来指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本。

比如,下面的命令可以使得在发生OOM的时候,Heap被转存到文件/tmp/heapdump.hprof,同时执行Home目录中的cleanup.sh文件。

$ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp