[英]What causes a JRE 6 JVM code cache leak?
自从切换到JRE 6后,我的服务器代码缓存使用率(非堆)不断增长。 我的应用程序在运行时创建了很多类,但这些类在GC过程中成功卸载。 我可以看到这些类在gc日志中被卸载,而permGen的使用也保持不变。 我特别确保在我的代码中,一旦我完成它们,这些类就是孤立的,所以他们正确地从permGen收集垃圾。
然而,代码缓存不断增长。 切换到JRE 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中)? 它可能会让您更加明智地了解正在发生的事情。
看到更多: https : //blog.codecentric.de/en/2012/07/useful-jvm-flags-part-4-heap-tuning/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.