JVM 中的永久代

PermGen(永久代)

永久代:线程共享的,用于存放被虚拟机加载的类的元数据信息:如常量、静态变量、即时编译器编译后的代码,也称之为方法区。

绝大部分 Java 程序员应该都见过 “java.lang.OutOfMemoryError: PermGen space “这个异常。这里的 “PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。最典型的场景就是,在 jsp 页面比较多的情况,容易出现永久代内存溢出。我们现在通过动态生成类来模拟 “PermGen space”的内存溢出:

package com.paddx.test.memory;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.
### JVM 永久垃圾回收机制 #### 永久概述 永久(Permanent Generation, PermGen)用于存储类的元数据,包括但不限于类的信息、常量池、字段和方法的数据以及构造函数和方法的字节码。这部分区域专门针对Java应用程序运行期间加载到JVM中的类信息。 #### 永久垃圾回收目标 对于永久而言,其主要关注的是两类资源的有效管理:废弃常量与不再使用的类[^1]。当这些实体变得不再可访问时,则会被视为垃圾并最终由GC处理掉。 - **废弃常量**:如果某个字符串实例已经没有任何地方引用它,并且也没有其他任何对象持有对该字符串的强引用,则该字符串可以被认为是废弃状态下的常量。 - **无用的类**:满足以下条件之一即可判定为无用的类: - 加载此类的ClassLoader本身已被卸载; - 此Class对象表示的应用程序级类已不存在于系统中; - 所有的`java.lang.Class`类型的实例都不再有任何地方可达。 #### 实现细节 为了实现上述功能,JVM会执行如下操作: - 当发生全局性的Full GC事件时,除了常规的对象图遍历外,还会特别检查永久区内存占用情况。 - 如果检测到某些类确实符合前述提到的标准,则允许将其从内存中移除,从而释放宝贵的PermGen空间给新的类定义或其他用途使用。 值得注意的是,在较新版本的HotSpot VM里,永久的概念已经被Metaspace所取,后者提供了更灵活的空间管理和更好的扩展性支持[^5]。 ```java // 示例码展示如何手动触发一次完整的垃圾收集(仅作演示目的) System.gc(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地表最强菜鸡

你的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值