每个线程私有,有几个线程就会有几个栈.栈也是一种数据结构,遵循FILO(先进后出),在线程创建执行方法时都会创建一个栈帧,进行压栈的操作.最先进行压栈的栈帧最后出来,最后压栈的栈帧最先出来.可以理解为栈是一个封住底的桶,而栈帧就是一个放入桶中,切面面积与桶相等的木块,你需要先取出后面放进去的木块,才能取出前面的.
在每个栈帧栈帧中都会存储几个常见的结构(我也不知道怎么讲) 如: 局部变量表,操作数栈,动态链接,方法出口(见图一).
每个线程私有,记录着程序运行期间,jvm指令执行的行数.
用于执行本地方法的栈,每个线程私有.在java中有很多底层方法用native修饰,这些方法就是本地方法,本地方法是用其他语言写的比如c.
存放对象的位置.堆中分为年轻代和老年代.内存分配占比默认为1:2.在年轻代中分为Eden区,Survivor区(分为两部分,S0,S1),Eden:S0:S1:1:1.在对象新建之初对象会被放入Eden区,当这一区放满会触发Young GC,清理掉死亡对象,将剩余存活对象移入到S0区,S0区放满后依然会触发Young GC,并将剩余存活对象放入S1区,S1区满后依然会触发Young GC,并将剩余存活对象放回From区.
也就是说年轻代的三个分区在放满后都会触发,Young GC并移动剩余存活对象
Eden区剩余存存活对象移入Survivor区, 在Survivor区中,S0和S1的剩余存货对象都会移入到另一个区, 在对象每次进行移动操作时对象头中存储的迭代年龄会+1,当迭代年龄达到15,就会把对象移入到老年代.当老年代存满后会触发Full GC(Full GC会停止掉其他工作进程).
方法区也叫元空间,存放着常量池,静态变量,类的元信息等.堆中的对象会指向方法区中对应的类的信息.