跳到主要内容

JVM 调优

  1. -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. 为什么堆内存只有物理内存的 1/64?

  2. 为什么堆外内存的最大值约为堆内存大小?

  3. 为什么二进制代码在 JDK7 与 8 时默认值不一样?

  4. 为什么堆外内存的最大值约为堆内存大小?

方法区参数设置

jdk7之前设置方法区的内存

-XX:PermSize=64M  设置永久代初始分配内存
-XX:MaxPermSize=128M 设置永久代最大分配内存

jdk8之后设置方法区的内存

-XX:MetaspaceSize=64M  设置元空间初始分配内存,当元空间内存超过 MetasoaceSize 时,会触发垃圾回收进行类
型卸载,如果释放了大量的空间,就会将 MetaspaceSize 逐步减小,直到达到 -XX:MinMetaspaceFreeRatio 设置的
最小值。
-XX:MaxMetaspaceSize=128M 设置元空间最大分配内存