自从切换到 JRE 6 后,我服务器的代码缓存使用(非堆)一直在无限增长。我的应用程序在运行时创建了很多类,但这些类在 GC 过程中被成功卸载。我可以看到这些类在 gc 日志中被卸载,并且 permGen 的使用保持不变。我特别确保在我的代码中,一旦我完成这些类,它们就会被孤立,这样它们就能正确地从 permGen 中收集垃圾。
然而,代码缓存不断增长。我在切换到 JRE 6 后才意识到代码缓存。所以我想我的问题是:
- GC 是否包含代码缓存?
- 什么会导致代码缓存内存泄漏,特别是。
- 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,但问问也无妨。
关于java - 是什么导致 JRE 6 JVM 代码缓存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1586061/