JVM
1、堆
对象首先放在Eden区,如果Eden区满载之后,jvm(字节码执行引擎)会单独开启一个垃圾收集线程,执行minor gc垃圾收集(将非垃圾对象复制到空的Survivor区,并清空Eden区和另一个Survivor区)。
经过15次gc操作还没有被销毁时,会被jvm移动到老年代里。
当老年区满载之后,可能程序就要挂掉了.....
GC ROOTs根节点:
线程栈的本地变量,静态变量,本地方法栈的变量等。
垃圾回收机制(可达性分析算法):
将“GC ROOTs”对象作为起点,从这些节点开始向下搜索引用的对象(搜索不限于Eden区),找到的对象都标记为非垃圾对象,其余的对象都标记为垃圾对象(如果一个对象经过一次GC处理没有被销毁掉,那么它的分代年龄会加一)。
2、栈(线程):
通过指针指向堆内存中对象的位置来调用相关对象。
3、本地方法栈
4、程序计数器:
标记程序运行位置
5、方法区(元空间):
常量+静态变量+类
其中:
1、每一个线程都有自己单独的:栈,本地方法栈,程序计数器。
2、堆,方法区所有线程共享。
栈帧(stack frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
栈帧内存空间(每一个方法对应一个自己的栈帧空间)
1、局部变量表:
用于储存局部变量
2、操作数栈:
一个指令将操作数压入栈,另一个指令将操作数弹出栈进行相关操作,最后将结果压入栈,相关指令将相关结果弹出栈,最后将结果储存到相应位置。
3、动态链接:
4、方法出口:
储存下一步方法执行位置。
javap:javap是jdk自带的反解析工具,使用javap 操作指令反解析字节码,生成更加可读的相关信息。