1.jvm内存使用
运行时数据区,存储元数据(创建对象,方法参数,返回值,运算中间结果)
jvm实例有一个方法区和一个堆
方法区:class中的类型信息(类数据),静态变量
堆:运行时创建的对象
线程 - PC寄存器和栈
(java:下一条指令,局部变量,参数,返回值,中间结果,非java:依赖实现)
java栈:许多栈帧stack frame 帧frame
(一个栈帧包含一个方法,调用一个方法,压入一个栈帧到栈中)
使用栈存储中间数据 , 栈是向下增长
2.类型 :
基本类型
引用类型
3.类状态器子系统:
启动类装载器,用户自定义类装载器
(用户自定义类装载器,Class类的实例都放在堆上)
4.jvm启动过程:
装载 class文件
连接 验证,分配内存,解析
初始化
5.方法区(堆上特殊的区域):
所有线程都共享方法区
6.堆(一个jvm实例,只有一个堆):
所有线程所创建的类实例和数组
headoffish一种堆设计:一个句柄池,一个对象池;引用类型变量指向句柄池(指向对象池的指针,指向类数据的指针)
一种堆设计:引用类型变量指向堆,每个对象数据包括一个指向特殊数据结构的指针
数据结构位于方法区,两部分:指向对应类数据的指针,此对象的方法表(方法数据的指针数组)
7.栈
一个线程启动一个java栈,栈以栈帧为单位
当前方法使用的栈帧为当前帧,当前方法所属类为当前类,当前类的常量池为当前常量池
线程执行一个方法时,它会跟踪当前类和当前常量池
当线程调用一个java方法时,虚拟机都会在该线程的java栈中压入一个新帧,新帧保存局部变量,中间运算结果,参数等数据
当方法return,抛出异常时,新帧出栈;上一个方法为新栈帧
在栈中存储变量(对象引用(包括this),byte char short都是int,long double是两个)
所有对象都是引用传递
(栈帧指令在PC寄存器中,帧中指令在操作数栈中)
栈帧组成:
局部变量区,是字节数组,存储变量,用索引来访问 (指令存储变量索引)
操作数栈:是字节数组,存储指令,只有压栈、出栈操作
他是jvm的工作区,中间运算在这里完成,如1+2,会出栈两个值,运算后,压入栈
栈帧数据区:访问常量池(存储指向常量池的指针,解析指向类,接口的符号)
负责方法完成,调用操作下一个栈帧的指令(设置PC寄存器中),以及压入结果到下一个栈帧
负责异常,抛出异常,找到匹配的catch,或是抛给下一个帧
本地方法栈
垃圾收集
1.gc功能:
负责进行对象的内存释放,以及处理堆碎块,处理在活动对象之间的空闲内存;
2.gc算法:
检测垃圾对象,回收垃圾对象所使用的堆空间
2.1 检测算法:建立一个根对象的集合,和根对象有通路的是活动的,其他对象是垃圾
引用计数收集器:计数引用个数,0的时候为垃圾。互相引用永远释放不了,每次引用都要有开销
跟踪收集器:从根节点开始的引用图,遍历每个引用数,并标记;没有被标记的释放
压缩收集器: