如果要更加了解 JVM 启动参数,那么对 JVM 的内存结构需要有一定的了解。JVM 内存主要分为三大块:
- Heap,又分为 Eden,From Survivor,To Survivor
- 方法区,存储类信息,常量,静态变量
- 栈,又分为虚拟机栈(Java Stack)和本地方法栈(Native Method Stack),用于方法执行
-Xms
初始堆大小,默认值是物理内存的 1/64 . 默认 (MinHeapFreeRatio 参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制。
-Xmx
最大堆大小,物理内存的 1/4(小于 1GB), 默认 (MaxHeapFreeRatio 参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到 -Xms 的最小限制。
-XX:+HeapDumpOnOutOfMemoryError
当堆内存空间溢出时输出堆的内存快照
通常配合 -XX:HeapDumpPath
使用,输出到文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/java_error_xxx.hprof
只有当发生 java.lang.OutOfMemo-ryError
时,才会 dump 到指定文件。
得到 hprof 文件后使用 memory analyzer tool(比如http://eclipse.org/mat/) 来分析。
-XX:MaxGCPauseMillis=100
设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM 会自动调整年轻代大小,以满足此值。
-XX:InitiatingHeapOccupancyPercent=25
整个堆占用量,开始 GC 。 默认值为 45,当值为 0 时,表示 “do constant GC cycles”。
-XX:+UseG1GC
使用 Garbage First(G1) Collector.
-XX:MaxJavaStackTraceDepth=1000000
JVM 人为设置了 stack trace 的限制为 1024,可以使用该参数来增加该限制。-1
值表示没有限制。
-XX:ErrorFile=/hs_err_pid%p.log
JVM 致命错误。
该文件包含如下几类关键信息:
- 日志头文件
- 导致 crash 的线程信息
- 所有线程信息
- 安全点和锁信息
- 堆信息
- 本地代码缓存
- 编译事件
- gc 相关记录
- jvm 内存映射
- jvm 启动参数
- 服务器信息