zoukankan      html  css  js  c++  java
  • JVM回收方法区内存

    很多人认为方法区(或者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的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出。

  • 相关阅读:
    Android WebService Does not support output
    textarea 内容对齐
    win7 下使用ssh连接vmare下的ubuntu系统
    myeclipse6.5 下无法使用tomcat7
    connectmongo.js 中出错 var Store = connect.session.Stroe
    linux tomcat7 ServerLifecycleListener类找不到
    SQL CASE 多条件用法
    myeclipse快捷键大全
    hibernat 中new对象进行查询
    SQL语句删除表中重复字段
  • 原文地址:https://www.cnblogs.com/thiaoqueen/p/8778718.html
Copyright © 2011-2022 走看看