JVM 调优
- -XX:+PrintFlagsFinal 打印 jvm 参数默认值
java -XX:+PrintFlagsFinal -version
堆设置
一个 2G 堆大小的 JVM,可能总共占用多少内存的?
堆内存 + 线程数 * 线程栈 + 永久代 + 二进制代码 + 堆外内存
2G + 1000 * 1M + 256M + 48/240M + (~2G) = 5.5G (3.5G)
堆内存:存储 Java 对象,默认为物理内存的 1/64 线程栈:存储局部变量(原子类型,引用)及其他,默认为 1M 永久代:存储类定义及常量池,注意 JDK7/8 的区别 二进制代码:JDK7 与 8,打开多层编译时的默认值不一样,从 48 到 240M 堆外内存:被 Netty,堆外缓存等使用,默认最大值约为堆内存大小
为什么堆内存只有物理内存的 1/64?
为什么堆外内存的最大值约为堆内存大小?
为什么二进制代码在 JDK7 与 8 时默认值不一样?
为什么堆外内存的最大值约为堆内存大小?
方法区参数设置
jdk7之前设置方法区的内存
-XX:PermSize=64M 设置永久代初始分配内存
-XX:MaxPermSize=128M 设置永久代最大分配内存
jdk8之后设置方法区的内存
-XX:MetaspaceSize=64M 设置元空间初始分配内存,当元空间内存超过 MetasoaceSize 时,会触发垃圾回收进行类
型卸载,如果释放了大量的空间,就会将 MetaspaceSize 逐步减小,直到达到 -XX:MinMetaspaceFreeRatio 设置的
最小值。
-XX:MaxMetaspaceSize=128M 设置元空间最大分配内存