1.JVM结构图示
2.JVM各内存区域含义
程序计数器
程序技术器是一块较小的内存,它可以看做是当前线程所执行的字节码行号指示器,字节码解释器工作时就是改变行号计数器的值来选择下一条需要执行的字节码指令
java虚拟机栈
java虚拟机栈描述的java方法执行的内存模型,每个方法执行都会创建一个栈帧,栈帧是用于支持虚拟机
进行方法调用和执行的数据结构
本地方法栈
本地方法栈与虚拟机栈类似,本地方法栈主要用于native方法服务
堆
堆是所有线程共享的内存区域,在虚拟机启动时创建,主要用于对象实例和数据的内存分配,也称之为GC垃圾堆
方法区
方法区又称为静态区,是存储程序中永远唯一的元素,被所有线程共享,主要存储被虚拟机加载过的类信息、静态变量、常量、即时编译器编译后的代码
3.GC回收
如何定义垃圾?
GC Root引用标记的四个对象
(1)虚拟机栈引用对象
(2)方法区类静态属性引用对象
(3)方法区常量引用对象
(4)本地方法栈引用对象
如何回收垃圾?
(1)标记清除算法
标记垃圾后直接进行清除
优势:直接清除效率高
劣势:产生内存碎片
(2)复制算法
将内存区域一分为二,在区域内标记垃圾清除后将可用对象迁移至另一片区域
优势:无内存碎片
劣势:可用整体控件减半
(3)标记整理算法
标记垃圾后将垃圾清除并将可用对象整理到内存区域的一端
优势:无内存碎片,可用区域无缩减
劣势:步骤繁琐,效率较低
(4)分代算法
将内存区域分为新生代、老年代,并将新生代区分为 eden和survivor,且survivor区再区分from和to区,当minor Gc触发时,将eden区的垃圾清除,并将可用对象迁移到survivor区,如果from/to区域中也有可用对象,则一并迁移到to/from区,此方式保持survivor区域始终有一个区域是闲置的可用区域,采用复制算法,杜绝内存碎片。而老年代占据2/3堆内存控件,当内存不足时,会进行major Gc,且会先进行minor Gc,采用整理算法,在新生代历经16次minor Gc还能存活的对象,才会被送往老年代。