- JVM虚拟机组成:运行时数据区(内存模型)、类加载子系统、字节码执行引擎
- 运行时数据区组成:堆、方法区(共享);栈、本地方法栈、程序计数器(独立于线程)
- 反编译命令:javap -c User.class
- 方法运行(启动一个线程)——栈帧内开辟内存空间(进出栈结构先进后出)——栈帧内有:局部变量表、操作数栈、动态链接、方法出口
- Integer a=1过程: a存在局部变量表——1进入操作数栈——赋值的时候1出栈,进入局部变量表中赋值
- 程序计数器:记录程序执行的具体步骤编号
- 静态变量如果是对象,栈中存放内存地址(指针)对象存于堆中
- 静态方法在加载时静态链接、自己写的方法在运行时动态链接(符号引用替换成直接引用)
- 方法出口:内层方法执行完成后,回到外层方法的位置继续执行
- 方法区:常量+静态变量(对象存于堆,内存地址存于方法区)+类信息
- 本地方法:带native原生方法,底层c++或者其他汇编语言构成
堆
- 组成:年轻代(Eden【8/10】;S0【1/10】,Survivor)、老年代(2/3)
- Eden区满触发minor GC 回收Eden和Survivor非空区域;老年区满触发full GC(或者内存溢出OOM),不仅回收堆,也回收方法区(物理内存默认21M可设置256M)
- GCroot根节点:本地变量、静态变量、native的变量;同GCroot没有引用的对象均可GC
- 15次GC进入老年代;1.8以前是永久代(元空间直接内存)
- JDK查看GC回收:idea中GC回收插件——右下角查看状态
- stop the world:暂停线程
- -Xss越小,线程分配内存越小,可容纳线程数量越多