繁体   English   中英

是什么导致JRE 6 JVM代码缓存泄漏?

[英]What causes a JRE 6 JVM code cache leak?

自从切换到JRE 6后,我的服务器代码缓存使用率(非堆)不断增长。 我的应用程序在运行时创建了很多类,但这些类在GC过程中成功卸载。 我可以看到这些类在gc日志中被卸载,而permGen的使用也保持不变。 我特别确保在我的代码中,一旦我完成它们,这些类就是孤立的,所以他们正确地从permGen收集垃圾。

然而,代码缓存不断增长。 切换到JRE 6后,我才意识到代码缓存。所以我想我的问题是:

  1. GC是否包含代码缓存?
  2. 具体来说,什么可能导致代码缓存内存泄漏。
  3. 这个领域的JDK 6中是否存在错误?

您可能希望仔细阅读此讨论,然后向后看看可能有助于缩小范围: http//mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2009-January/000530 html的

这个涉及JDK5,但可能会有所帮助: http//www.nabble.com/Java-code-cache-memory-td22202283.html

您是否使用它来编译jsp页面或类似的东西? 如果没有,应用程序启动后正在编译什么? 您是否在运行时编织中使用AspectJ?

这将有助于了解您正在做些什么来更好地了解如何提供帮助。

此外,当代码缓存耗尽时,它是否会停止重新编译或jvm崩溃? 我期待前者。

你在使用Sun的JDK吗? 我猜你是因为我怀疑其他人被列为第6版,但是问这个并没什么坏处。

我想知道新的G1垃圾收集器(从Java 6更新14开始)是否可以帮助你。 您可以尝试使用-XX:+ UnlockExperimentalVMOptions -XX:+ UseG1GC,但根据对Jon Masamitsu博客的评论,它不会(如果问题确实是由于代码缓存)。 但也许那里的讨论或其中的链接可能会有所帮助。

来自此博客文章中的评论: http//blogs.oracle.com/jonthecollector/entry/our_collectors

卸载类时代码被驱逐(同样,当方法被“无效”时,也就是说,在编译期间做了一些不再持有的假设)

如果我是你,我会运行一个工作负载,进行堆转储,并检查是否所有类都是你期望的gc'd。

我会找到两个可能的地方问题:泄漏的装载机和大规模的字符串实习。

从您的应用程序描述中,我更有可能验证GC是否正在卸载旧生成的类。

我不认为jConsole有一种可视化的方法,但如果你能得到YourKit的副本,它有一种图形方式来检测上述问题。

是否可以针对麻烦的应用程序调用jvisualvm(在JDK中)? 它可能会让您更加明智地了解正在发生的事情。

  1. 不,但你可以使用-XX:+ UseCodeCacheFlushing标志让JVM在代码缓存填满时处理一些已编译的代码,尽管它有时并不那么有用。 尝试-XX:ReservedCodeCacheSize和-XX:CompileThreshold。
  2. 不时热部署等

看到更多: https//blog.codecentric.de/en/2012/07/useful-jvm-flags-part-4-heap-tuning/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM