相关知识:
JDK : JDK是Java Development Kit的缩写,是Java的开发工具包,主要包含了各种类库(Tool APIS)和工具(Tools),当然也包含了另外一个JRE;
JRE:运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库;
JVM: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
JVM内存组成结构:总体分为: 程序计数器,堆,栈(JAVA虚拟栈、本地方法栈),方法区等部分组成
程序计数器 :这是一块比较小的内存,不在Ram上,而是直接划分在CPU上的,程序员无法直接操作它,它的作用是:JVM在解释字节码文件(.class)时,存储当前线程所执行的字节码的行号
栈:存放的是临时变量
(JAVA虚拟栈:JVM虚拟机栈就是我们常说的堆栈的栈是线程私有的,生命周期和线程一样,每个方法被执行的时候会产生一个栈帧,用于存储局部变量表、动态链接、操作数、方法出口等信息。方法的执行过程就是栈帧在JVM中出栈和入栈的过程。局部变量表中存放的是各种基本数据类型,如boolean、byte、char、等8种,及引用类型—–存放的是指向各个对象的内存地址,因此,它有一个特点:内存空间可以在编译期间就确定,运行期不在改变。
本地方法栈:就是用来处理Java中的本地方法的,Java类的祖先类Object中有众多Native方法,如hashCode()、wait()等,他们的执行很多时候是借助于操作系统,但是JVM需要对他们做一些规范,来处理他们的执行过程)堆:存放的是对象的完整信息(对象实例及数组都是在堆上面分配的, 在32位系统上最大为2G,64位系统上无限制,堆内存是垃圾回收的主要区域)
方法区 : 存放的是类的完整信息(是所有线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量等数据)
JVM内存管理:
随着程序的运行,内存中存在的实例对象、变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用内存不足造成一些不必要的系统异常。
JVM最重要的内存管理就是引入了垃圾回收机制即Garbage Collection(GC)
在我们上面介绍的五大区中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行GC。
垃圾回收机制(GC):
垃圾回收只与内存有关
垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。
垃圾收集器不可以被强制执行,但程序员可以通过调用System. gc方法来建议执行垃圾收集器(System. gc仅仅是给 JVM 一个建议而不是命令)
事实上:在 Java 中,当你创建一个对象时,Java 虚拟机(JVM)为该对象分配内存、调用构造函数并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时),JVM 通过垃圾回收器将该对象标记为释放状态。
垃圾回收器准备释放内存的时候,会先调用finalize()方法,准备回收被标记为释放状态的对象所占有的内存空间
finalize()方法:
finalize方法是与Java编程中的垃圾回收器有关系。即:当一个对象变成一个垃圾对象的时候,如果此对象的内存被回收,那么就可以调用系统中定义的finalize方法来完成
finalize() 是一个用于释放非 Java 资源的方法;
垃圾回收和finalize()都是靠不住的只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的(换句话说:垃圾回收并不会按照程序员的要求,随时进行GC,垃圾回收并不会及时的清理内存,尽管有时程序需要额外的内存)
简单的总结:
什么是垃圾回收机制?
是JVM提供的一种内存管理机制,用于收集那些不可到达的对象,回收其占有的内存空间
什么时候执行垃圾回收?
JVM内存快耗尽的时候执行(如果不手动gc的时候)
关系图: