运行时数据区(内存模型)(补图)
虚拟机栈
又叫线程栈,线程开始运行,会分配一块栈空间,当线程中调用一个方式时,就会产生一个栈桢进入线程栈
栈帧主要构成
动态链接
存储的是符号引用对应的直接引用地址,程序运行过程中,将符号应用转化为直接引用
堆
存储对象,分为年轻代和老年代,占比一般为1:2<br>年轻代又分为Eden区和两个Survivor区,占比一般为8:1:1<br>一般新产生的对象都分配在Eden区,当Eden满了,会触发minor GC,minor GC具体清理哪些对象呢?这就要用到可达性分析了(最开始也用引用计数法,但其存在循环引用问题,可达性分析怎么解决循环引用的?)
程序计数器
放置代码运行位置的内存地址,字节码执行引擎,每执行完一行代码就会去修改程序计数器的值
为什么每个线程都要有一个?线程切换
方法区(元空间)
常量(运行时常量池)+静态变量+类元信息
元空间默认初始值为21M,如果不设置方法区大小,最终可以扩展到剩余所有本地内存<br>元空间有自动伸缩机制,触发FullGC后,不仅去做类型卸载,还会对原空间的初始大小进行调整,根据FullGC回收后的大小,决定初始大小<br>调整元空间需要FullGC<br>建议初始和最大大小设置为一样,不设置可能会产生频繁FullGC