Java的垃圾回收机制是Java虚拟机提供的一种能力,也是Java的核心技术之一。Java垃圾回收机制用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。对于Java程序员来说在JVM的帮助下不需要你为每一个创建的对象去显示的回收对象所占的内存空间。在JVM的管理下一般不会出现内存溢出等问题。但是如果一旦发生内存溢出等问题,又假设你不知道JVM怎么使用内存,那么对错误的查找和排除是一项艰难的任务。那么要明白JVM内存管理的方法,你首先要知道Java程序运行时候JVM所管理的内存数据区域。下面作为学习Java垃圾回收机制第一步,首先明白Java运行时数据区域(如下图)。
(1)程序计数器(Program CounterRegister):经过编译后的Java文件在内存中以字节码形式供JVM读取,程序计数器就是字节码的行号指示器,通过程序计数器的自加自减方式指示字节码解释器到指定地方读取指令,从而使JVM有序地执行读取到的指令。特别注意不同于内存中的程序计数器,在Java中每一个Java线程都独立的拥有一个程序计数器(Java虚拟机多线程机制是由通过分配处理机到每个线程执行的时间来实现线程对处理机资源的占用的)
(2)Java栈(Java Stack):Java栈描述的是Java方法在内存中的模型。在执行方法时会创建一个栈帧(编译器实现方法处理的一种数据结构)用于储存方法内的局部变量(通过局部变量表),方法出口,方法之间链接等信息。其中在局部变量表中存放了编译期内的基本数据类型和对象的引用等信息。局部变量表存储的数据也是我们程序员直接关心的地方。
(3)本地方法栈(NativeMethod Stack):描述的是由C/C++编写的Native方法的内存模型(JVM通过Native方法和操作系统打交道)。供JVM调用Native方法使用。通过这一点我们可以看到其实Java低层操作还是由C/C++完成的,所以有人说Java基于C++就在于此。
(4)堆(Heap):分配程序中创建的对象实例所需内存空间。通过引用来操作堆中的实例。
(5)方法区(MethodArea):Classloader(类加载器)加载到内存的类的类信息,常量,静态变量等信息。Java中的反射机制就是基于方法区中存储的类信息来实现的,在加载时候就为该类所有实例创建一个Class对象(也存储于此)。