JVM(Java Virtual Machine)内存体系结构
程序的开发离不开内存的支持,要想理解整个java的内存体系,必须清楚java程序的执行过程
(1)如图,按功能编写一个*.java源程序,然后利用java提供的编译器(java.exe) 将*.java编译为JVM可以使用的*.class字节码文件
(2)当进行java程序类解析时(java.exe启动JVM进程) ,JVM会通过类加载器加载各个类的字节码文件,然后将操作继续交由JVM执行引擎处理
(3)如果在程序中需要调用本地的C程序函数库,则可以通过本地方法接口实现与函数库进行连接
(4)程序执行过程中,JVM会使用一段空间存储程序执行期间所要用到的数据和相关信息,这段空间称为运行时数据区,即JVM内存
通过上述分析,内存管理实际上是对运行时数据区(Runtime Data Area)这段空间的管理
其中,运行时数据区(Runtime Data Area)的组成部分:
程序计数器(Program Counter Register):在编译时会为每一个字节码文件的程序分配一个程序位置,用于标注下一个要执行的指令位置。简而言之,为一个行号的指示器。每一个线程都有一个自己独立的程序计数器,属于私有区域(内存空间极小)
Java栈(Stack):又称Java虚拟机栈,每个线程都会存在私有的栈内存空间。在线程对象每次调用一个方法时都会自动产生一个栈帧
Java对象访问方式
java中引用操作是最为重要的数据处理模式,而在引用访问的过程中涉及3块内存区域:栈内存、堆内存、方法区。
假如这是一段引用类型代码: Object ob = new Object();
(1)Object ob: 一个本地引用,会存储在JVM的本地变量表中,表示一个引用(reference)类型数据
(2)new Object() :一个实例化对象,该数据将保存在堆内存中
(3)堆内存中会记录Object类的相关类信息(如成员、方法、接口)的地址,而这些地址所执行的数据会存储在方法区中
在java的虚拟机规范中,对于通用引用类型(reference)去引用访问具体对象的方法并未做规定,目前主流的方法有两种:
JVM垃圾收集
JDK1.8之前提供用永久代,之后永久代被替换为元空间(MetaSpace)
年轻代
老年代
永久代
JDK1.8之前提供用永久代,之后永久代被替换为元空间(MetaSpace)
元空间(MetaSpace)
垃圾收集策略
垃圾收集主要分为 年轻代GC 与 老年代GC 两个部分。
年轻代GC:主要采用复制清理算法
老年代GC: 主要采用标记整理算法
引用类型
从JDK1.2开始,Java把对象引用分为4种级别:强引用、软引用、弱引用、虚应用