ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

JVM---GC垃圾回收总

2026/9/14 11:13:15 拓冰建站 浏览量
JVM---GC垃圾回收总 目录1、JVM的内存模型2、如何判断对象是否可以回收(垃圾判断算法)3、垃圾回收算法4、Java中的四种引用5、造成内存溢出的常见原因6、JVM堆内存垃圾回收7、什么是STW?为什么gc要STW(Stop The World)?8、GC相关参数1、JVM的内存模型根据虚拟机规范,JVM的内存分为 堆、虚拟机栈、本地方法栈、程序计数器、方法区。JDK 1.8 同 JDK 1.7 比,最大的差别就是:元空间取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。虚拟机的内存中主要有程序计数器、虚拟机栈、本地方法栈、堆和方法区。详细介绍java中的堆:线程共享的区域:主要用来保存对象实例,数组等,内存不够则抛出OutOfMemoryError异常。组成:年轻代+老年代年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区老年代主要保存生命周期长的对象,一般是一些老的对象什么是永久代和元空间?方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版本的实现。说白了,方法区就像是一个接口,永久代与元空间分别是两个不同的实现类而已。只不过永久代是这个接口最初的实现类,后来这个接口一直进行变更,直到最后彻底废弃这个实现类,由新实现类——元空间进行替代。从上图中可以看到,永久代与堆中的老年代是连续的,这里的连续指的是物理地址连续,永久代本身并不在堆中。因此,老年代与永久代其中一个满了,都会触发Full GC。由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。最典型的场景就是,在 jsp 页面比较多的情况,容易出现永久代内存溢出,会报出"java.lang.OutOfMemoryError: PermGen space "异常。元空间(Metaspace),不再与堆连续,而是直接存在于本地内存中,也就是机器的内存。理论上机器内存有多大,元空间的野心就有多大。Java8中,使用元空间替换永久代的原因:在之前的版本中,字符串常量池存在于永久代中,在大量使用字符串的情况下,非常容易出现OOM的异常。此外,JVM加载的class的总数,方法的大小等都很难确定,因此对永久代大小的指定难以确定。太小的永久代容易导致永久代内存溢出,太大的永久代则容易导致虚拟机内存紧张。防止内存溢出。2、什么是虚拟机栈Java Virtual machine Stacks (java 虚拟机栈) 1、每个线程运行时所需要的内存,称为虚拟机栈,先进后出 2、每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存nb