JVM方法区内存回收
来源:互联网 发布:首尔 知乎 编辑:程序博客网 时间:2024/06/10 09:50
很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是在新生代中,常规应用进行一次垃圾收集一般可以回收70%~95%的空间,而永久代的垃圾收集效率远低于此。
永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。
先来说说方法区内常量池之中主要存放的两大类常量:字面量和符号引用。字面量比较接近Java语言层次的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括下面三类常量:
1、类和接口的全限定名
2、字段的名称和描述符
3、方法的名称和描述符
回收废弃常量与回收Java堆中的对象非常类似。以常量池中字面量的回收为例,假如一个字符串“abc”已经进入了常量池中,但是当前系统没有任何一个String对象是叫做“abc”的,换句话说是没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用了这个字面量,如果在这时候发生内存回收,而且必要的话,这个“abc”常量就会被系统“请”出常量池。常量池中的其他类(接口)、方法、字段的符号引用也与此类似。
判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面3个条件才能算是“无用的类”:
该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
虚拟机可以对满足上述3个条件的无用类进行回收,这里说的仅仅是“可以”,而不是和对象一样,不使用了就必然会回收。是否对类进行回收,HotSpot虚拟机提供了-Xnoclassgc参数进行控制,还可以使用-verbose:class及-XX:+TraceClassLoading、 -XX:+TraceClassUnLoading查看类的加载和卸载信息。
在大量使用反射、动态代理、CGLib等bytecode框架的场景,以及动态生成JSP和OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出。
- JVM方法区内存回收
- JVM方法区内存回收
- 方法区内存溢出测试
- tomcat方法区内存溢出
- 1、java虚拟机方法区内存模型
- java虚拟机方法区内存模型
- C+指针开辟堆区内存空间并使用回收
- jmap查看jvm的heap区内存情况
- 让Java虚拟机Perm区内存溢出的方法
- JVM回收方法区
- JVM之内存分配与回收策略
- JVM内存管理之内存回收策略
- jvm之内存分配与垃圾回收
- JVM之内存分配与回收策略
- jvm之内存管理和垃圾回收
- 自由存储区内存管理
- JVM 方法区回收小结
- jvm方法区的回收
- GitHub上使用Hexo搭建博客
- 【JZOJ4782】Math
- 01背包的方案数问题
- 刚才发的图对应的源码
- Excel 基础篇01
- JVM方法区内存回收
- 完美2017校招编程题 小萌的副本生涯
- poj 1415 Shredding Company
- 自己动手写SSO(单点登录)
- HashMap的底层工作原理和并发问题
- 为什么数据中心需要使用VMware NSX
- webstorm软件破解
- jsp的3个指令(page指令 Include指令 taglib指令)
- tapply 分组apply,sapply,