java虚拟机(jvm)
1、线程共享内存区:包括堆区、方法区、运行时常量池(三个都有可能跑出内存溢出错误)
堆区 一般用于存储对象实例的内存区,{堆区又分为新生代【Eden,from Survivor,to Survivor】和老年代(oldgen)}
方法区 逻辑上独立,物理上属于堆区(方法区中包含java类的结构信息如运行时常量池、字段、方法数据。。。以及类 、实例、接口的初始化时需要用到的特殊方法数据等)
运行时常量池 属于方法区的一部分(注:当类装载器成功将一个类或者接口装入jvm是便会创建对应的运行时常量池)
2、线程私有内存区:pc寄存器、java栈、本地方法栈(三个都有可能跑出内存溢出错误)
pc寄存器(pc计数器) 线程独有便于并行
java栈 用于存储栈帧(存储局部变量表、操作数栈、方法出口等信息)
本地方法栈 用于支持本地方法(如c/c++编写的方法)
3、垃圾回收
1、根搜索算法(判断对象可达?可达(存活)则不回收)
2、回收算法:标记清除算法、复制算法、标记压缩算法
年轻代适合第二种
老年代适合第一种和第三种
4、类加载
类的加载分为三个阶段:加载、链接(验证、准备、解析)、初始化
加载:加载字节码
验证:格式验证(读取的目标文件是否是合法有效的字节码文件)、语义验证(字节码是否符合java语法规范)、操作验证(对类型的方法执行验证)、符号引用验证(对常量池中的各种字符引用执行验证)
准备:对放在方法区的类数据信息的类变量执行初始化(仅仅是为类中的所有静态变量分配内存空间并设置初始值实例对象不在此操作范围)
解析:将字节码常量池中的符号引用全部转换为直接引用(类、接口、方法、字段的符号引用)
初始化:执行static的初始化包括变量和函数