JVM模型图

image.png

概念解释

线程栈——一个线程对应一个线程栈

  • 栈帧:当调用方法时会以栈帧方式分配内存,并压入线程栈
  • 局部变量表:方法存储变量的地方,大小在编译期决定
  • 操作数栈:方法执行过程中字节码的操作会在操作数栈中执行
  • 动态链接:该栈帧所属方法的常量池的符号引用,为了能够在运行时转化为直接引用,即动态链接
  • 返回地址:方法正常完成或异常退出的位置

非堆:与堆不同,使用的是本地内存,不会那么容易出现OOM

  • 元空间:存放类元信息、方法元信息和常量池
  • CCS:节省对象指向自身类的指针的内存空间
  • Code Cache:JIT编译缓存机器码

元空间

  • 方法区
  • 常量池

直接内存
这里的直接内存与非堆无关,但也需要指定堆外内存大小。也不由GC管理,需要自己管理
好处是IO不需要经过内核缓冲到用户缓存的拷贝,JVM可以直接访问

参数分类

以“-”开头

-server
标准参数,JVM都要实现这些参数

以“-D”开头

设置系统属性,如 -Dfile.encoding=UTF-8

以“-X”开头

用于配置JVM,如 -Xms

以“-XX”开头

非稳定参数,用于控制JVM ,如 -XX:UseG1GC

JVM启动时的默认设置

可通过jmap -heap pid查看jvm内存分配情况

  • -Xms:JVM堆初始化大小,默认为1/64内存,最小为1M
  • -Xmx:JVM最大值,默认为1/4内存或1G,最小为2M
  • -Xss:单个线程栈大小,默认为512K
  • -XX:NewRatio:新生代和老年代的比例,默认为2,即新生代:老年代=1:2,新生代占1/3
  • -SurvivorRatio:新生代中,eden区和存活区的比例,默认为8,即(8:1:1)