代码之家  ›  专栏  ›  技术社区  ›  Rich

JVM标志CMSClassUnloadingEnabled实际上做什么?

  •  177
  • Rich  · 技术社区  · 14 年前

    我一辈子都找不到javavm标志的定义 CMSClassUnloadingEnabled 实际上是的,除了一些非常模糊的高级定义,比如“摆脱你的永久性问题”( which it doesn't ,顺便说一句)。

    我看过Sun/Oracle的网站,甚至 the options list

    根据标志的名称,我猜CMS垃圾回收器在默认情况下不会卸载类,这个标志会打开它-但我不能确定。

    3 回复  |  直到 7 年前
        1
  •  220
  •   Aaron Digulla    7 年前

    更新 这个答案与Java 5-7有关,Java 8有一个固定的答案: https://blogs.oracle.com/poonam/about-g1-garbage-collector,-permanent-generation-and-metaspace mt.uulu

    如果启用 CMSClassUnloadingEnabled GC也将扫描PermGen,并删除不再使用的类。

    [编辑] 您还必须启用 UseConcMarkSweepGC Sam Hasler ). 看看这个答案: https://stackoverflow.com/a/3720052/2541

        2
  •  35
  •   reevesy onejigtwojig    9 年前

    根据博文 The most complete list of -XX options for Java JVM ,它确定是否在CMS垃圾收集器下启用类卸载。默认值为 false ClassUnloading 就是这样 true 默认情况下,这(可能)会影响其他垃圾收集器。

    设置CMSClassUnloadingEnabled 可以 如果您当前正在使用CMS收集器


    亚伦·迪古拉说:“课程是永远的”。这并不是严格意义上的事实,即使在纯Java世界中也是如此。事实上,类的生存期与其类加载器有关。因此,如果你能安排一个类加载器被垃圾收集(这并不总是一件容易的事情),那么它装载的类也会被垃圾收集。

        3
  •  24
  •   Lukas Eder    12 年前

    这是一个有用的例子:

    设置 -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled 在我们的weblogic10.3上,JVM帮助解决了一个问题:JAX-WS实现为每个web服务调用创建了一个新的代理类,最终导致内存不足错误。

    追踪并不是件小事。以下代码始终为返回相同的代理类 port

    final MyPortType port = 
    Service.create(
            getClass().getResource("/path/to.wsdl"), 
            new QName("http://www.example.com", "MyService"))
        .getPort(
            new QName("http://www.example.com", "MyPortType"), 
            MyPortType.class);
    

    weblogic.wsee.jaxws.spi.ClientInstance ,再次委托给一个新的 $Proxy[nnnn] 在哪里上课 n 每次呼叫都递增。添加标志时, n 仍然递增,但至少这些临时类已从内存中删除。

    java.lang.reflect.Proxy