1. JVM内存参数
要求
-
熟悉常见的 JVM 参数,尤其和大小相关的
堆内存,按大小设置
解释:
-
-Xms 最小堆内存(包括新生代和老年代)
-
-Xmx 最大堆内存(包括新生代和老年代)
-
通常建议将 -Xms 与 -Xmx 设置为大小相等,即不需要保留内存,不需要从小到大增长,这样性能较好
-
-XX:NewSize 与 -XX:MaxNewSize 设置新生代的最小与最大值,但一般不建议设置,由 JVM 自己控制
-
-Xmn 设置新生代大小,相当于同时设置了 -XX:NewSize 与 -XX:MaxNewSize 并且取值相等
-
保留是指,一开始不会占用那么多内存,随着使用内存越来越多,会逐步使用这部分保留内存。下同
堆内存,按比例设置
解释:
-
-XX:NewRatio=2:1 表示老年代:新生代 表示老年代占两份,新生代占一份
-
-XX:SurvivorRatio=4:1 表示新生代中eden区与survivor区的比例,表示新生代分成六份,伊甸园占四份,from 和 to 各占一份
元空间内存设置
解释:
-
class space 存储类的最基本的信息(如类的名称、类的方法入口),最大值受 -XX:CompressedClassSpaceSize(默认是1个G) 控制
-
non-class space 存储除类的基本信息以外的其它信息(如方法字节码、注解等)
-
class space 和 non-class space 总大小受 -XX:MaxMetaspaceSize 控制,默认没有上限,直接使用电脑的物理内存
注意:
-
这里 -XX:CompressedClassSpaceSize 这段空间还与是否开启了指针压缩有关,这里暂不深入展开,可以简单认为指针压缩默认开启
代码缓存(CodeCache)内存设置
解释:
- 机器码就是存在CodeCache里面的,代码缓存区就是用来缓存编译后的机器码的。
-
如果 -XX:ReservedCodeCacheSize < 240m,所有优化机器代码不加区分存在一起
-
否则,分成三个区域(图中笔误 mthod 拼写错误,少一个 e)
-
non-nmethods - JVM 自己用的代码
-
profiled nmethods - 部分优化的机器码
-
non-profiled nmethods - 完全优化的机器码
-
线程内存设置
- -Xss:控制每个线程(也就是虚拟机栈)占用的内存的。
- 如果不设置,它的大小是跟操作系统有关,如果是64位的Linux操作系统,每个线程晖占用1M的内存。