一、jvm内存结构
程序计数器(Program Counter Register)、JVM虚拟机栈(JVM Stacks)、本地方法栈(Native Method Stacks)、堆(Heap)、方法区(Method Area)
(1)PCR
跟随线程生命周期,记录当前执行到的.class字节码行数,用于多线程操作
(2)JVM Stacks
跟随线程生命周期,在方法执行中存储数据
(3)Native Method Stacks
处理native方法,如object中的hashCodes()等
(4)Heap
存储所有实例对象和数组对象,内置GC
(5)Method Area
堆的组成部分,但不强制GC。存储的对象为运行时常量池、静态变量、JVM加载的类信息等
二、垃圾回收
堆和方法区需要进行垃圾回收,其他三个随线程生命周期创建销毁
垃圾判定算法
(1)引用计算器:对循环引用的对象无法回收
(2)根搜索:效率较低
垃圾清除算法
(1)标记、清除算法
过程:内存紧张时,停止程序,遍历GC Root将可达的对象标记出可存活的对象,清除所有未使用的对象
缺点:效率较低;清理出来的空闲内存不连续
(2)复制算法
过程:将内存分成活动区间和空闲区间两块,新分配的内存在活动区间,内存紧张时进行GC,将活动区间中
存活的对象,按顺序放入空闲区间
缺点:浪费一半内存;对象存活率高时比较费复制操作
(3)标记、整理算法
过程:类似(1)标记所有存活对象,重新移动按内存顺序排列对象,将末端内存清除
缺点:效率不高
(4)分代搜索算法
过程:针对不同对象进行不同的回收算法。
夭折对象(局部变量、临时变量):复制算法(80%内存分配对象+10%活动区间+10%空闲区间)
老不死对象(缓存对象、数据库连接对象、单例对象):标记、整理算法
不灭对象(String池对象、class类信息):标记、整理算法