jvm虚拟机=运行时数据区+类装载子系统+字节码执行引擎
运行时数据区=堆+栈+本地方法栈+方法区+程序计数区
线程的内存空间栈,这里的栈与数据栈是一样的设计结构
这里和程序的运行顺序是一样的,程序在执行时是从最里面先执行然后到最开始的逻辑
main方法先运行,先压栈道底部,后面的接着往上压,执行的时候,先从上面开始执行到底部
栈:线程独有,每个线程一个
栈帧:方法独有, 每个方法对于一个栈帧
栈帧:局部变量表,操作数栈,动态链接,方法出口
操作数栈是方法里面执行数据操作的内存
程序计算器:线程独有,记录当前线程执行的行号
动态链接:方法对应的内存地址
方法出口:方法执行完返回到主方法的出口位置
main:有对象的时候,对象会在生成在堆里,在局部变量变里有一分指向堆的内存地址
方法区:共享,运行时常量池+静态变量+类信息+堆对象的内存地址,元空间(永久代或持久代)
元空间(直接物理内存),默认21m,默认无效扩展,默认会使用全部内存,达到阀值会触发full gc,项目启动会很慢,会触发gc和扩容,导致启动很慢
本地方法栈:线程独有,native c++的语言实现的(Java字节码执行引擎调用c++)
堆:共享,年轻代1/3(eden区8/10,so 1/10,s2 1/10),老年代2/3
eden满了触发垃圾回收,由字节码执行引擎执行minor gc
引用计数达到15次就放到老年代
gcRoot :局部变量,静态变量,从根节点出发都有引用的
静态对象,缓冲对象都会到老年代
stw:stop 用户线程暂停,用户体验不好,
minor gc时间很短,full gc很长,优化对象
stw:目的就是当前查找垃圾对象的时候是暂停用户程序,是为了确保查找垃圾对象的过程是有效的,避免查找到一半的时候,线程结束,这次查找浪费了
堆:xms xmx
新生代:xmn
方法区:metaspacesize,metaspacesize
线程/栈:xss 默认1m
元空间:256M,默认21m
栈空间越小,相同情况下,线程数越多