JVM模型图
概念解释
线程栈——一个线程对应一个线程栈
- 栈帧:当调用方法时会以栈帧方式分配内存,并压入线程栈
- 局部变量表:方法存储变量的地方,大小在编译期决定
- 操作数栈:方法执行过程中字节码的操作会在操作数栈中执行
- 动态链接:该栈帧所属方法的常量池的符号引用,为了能够在运行时转化为直接引用,即动态链接
- 返回地址:方法正常完成或异常退出的位置
非堆:与堆不同,使用的是本地内存,不会那么容易出现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)
