Java虚拟机学习笔记——JVM垃圾回收机制

时间:2024-01-01 11:32:57

Java虚拟机学习笔记——JVM垃圾回收机制

Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题。

但是自动内存管理机制不是万能药,我们仍需要了解JVM垃圾回收机制,以便在Java程序运行时发生错误的时候可以快速定位,并解决。

内存模型图

Java虚拟机学习笔记——JVM垃圾回收机制

线程共享区:

方法区(Method Area):线程共享,存储被JVM加载的类信息、常量、静态变量、编译器编译后的代码等数据。

Java堆(Java Heap):线程共享,用于存储对象实例,是垃圾收集器(GC)管理的主要区域,其中细分为:新生代(Eden空间、From Survivor空间、To Survivor空间)和老年代。

线程私有区:

虚拟机栈(Java Virtual Machine Stacks): 线程私有,每个方法在执行时会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法调用至执行完成,就对应一个栈帧从入栈到出栈。

程序计数器(Program Counter Register):线程私有,可以看成当前程序执行的字节码的行号指示器,字节码通过改变程序计数器的值来选取下一条需要执行的字节码指令,Java的分支、循环、跳转、异常处理、线程恢复等都基于程序计数器。

本地方法栈(Native Method Stack): 线程私有,本地方法栈与虚拟机栈相似,虚拟机栈为执行Java字节码服务,本地方法栈则为Native方法服务。

这章节由于记录的是Java 垃圾回收机制,所以着重分析的是Java堆,因为Java堆是JVM垃圾回收(GC)的主要发生区域。(本篇内容基于Hotspot虚拟机实现,所有Jvm即HotspotVM)

首先我们在分析垃圾回收之前先看下Jdk1.8中的Java 堆中的区域分布:新生代,老年代,元空间,在8之前的jdk1.7则是分为了新生代,老年代,永久代。

之所以将永久代