当前位置: 首页 > 知识库问答 >
问题:

Jboss(Java)进程对驻留内存的使用逐渐增加

司徒志
2023-03-14

我们面临的问题是,Java进程的驻留内存逐渐增长。我们将Xmx定义为4096 MB,并且XX:MaxPermSize=1536m。活动线程的数量约为1500,定义了256K的Xss。

当应用服务器(JBoss 6.1)启动时,使用的驻留内存约为5.6GB(一直在使用top命令对其进行监视);它逐渐增长(每天约0.3到0.5 Gb),直到增长到约7.4 Gb,这时内核的OOM杀手由于RAM空间不足而终止了进程(服务器有9GB的RAM)。

我们一直在定期监视线程转储-没有线程泄漏的嫌疑。我们仍然无法找出这些额外内存的来源。

pmap输出显示了许多Anon块(除了堆栈和堆的常规块),主要在64 Mb的竞技场中,这些块在堆的内存使用方面未被考虑,perm gen

在堆转储中,我们还尝试了寻找DirectByteBuffers和sun.misc.不安全对象,它们通常用于非堆内存分配,但是对象的数量和内存容量似乎是名义上的。即使在这些对象被GCed之后,是否仍有未释放的本机内存?任何其他可能导致用完非堆内存的类?

我们的应用程序本身确实有本机调用,但某些第三方库可能有它们。

你知道是什么导致了这一切吗?还有什么其他细节/工具可以进一步帮助调试这样的增加?有什么我们应该注意的已知问题吗?平台:运行在Centos 5.6上的Jboss 6.1。

共有2个答案

涂羽
2023-03-14

RSS使用量的增加可能是由本机内存泄漏引起的。一个常见的问题是未关闭ZipInputStream/GZIPInputStream引起的本机内存泄漏。

打开ZipInputStream的典型方法是调用Class.get资源/ClassLoader.get资源并在java.net.URL实例上调用openConnection(). getInputStream()或调用Class.getResourceAsStream/ClassLoader.getResourceAsStream。必须确保这些流始终关闭。

您可以通过指定MALLOC_CONF环境变量中的设置来启用malloc采样分析,从而使用jemalloc调试本机内存泄漏。这篇博文提供了详细的说明:http://www.evanjones.ca/java-native-leak-bug.html。这篇博文还提供了有关使用jemalloc调试java应用程序中本机内存泄漏的信息。

同一个博客还包含与ByteBuffers相关的另一个本机内存泄漏的信息。

文嘉禧
2023-03-14

Java和glibc存在一个已知问题

解决方法是设置此环境。变量:export MALLOC\u ARENA\u MAX=4

有一篇IBM的文章是关于设置MALLOC_ARENA_MAXhttps://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

这篇博文说

众所周知,驻留内存的爬行方式类似于内存泄漏或内存碎片。

在谷歌上搜索MALLOC_ARENA_MAX,以获取更多参考。

您可能还需要调整其他malloc选项,以优化分配内存的低碎片:

# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536

 类似资料:
  • 我是java内存问题的新手,在调试java进程的内存使用时遇到了问题,需要你的帮助。根据“the java进程占用8G常驻内存和9.4G虚拟内存。这对于这个进程来说太多了,我想检查一下为什么它会吃掉内存。所以我使用jmap进行了一次堆转储(没有使用‘live’选项,因为它可能会触发GC ),发现只有100MB的活动对象,还有1.5G的不可达对象。那么剩下的6G内存去哪了?我应该检查哪些其他类型的非

  • 问题是,那些块是什么?哪个子系统分配这些? 更新:我们不使用JIT和/或JNI本机代码调用。

  • 问题内容: 我们最近对生产系统的观察告诉我们Java容器的常驻内存使用量正在增长。关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用pmap之类的本地工具会比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对): 我将0000000720000000 3670016K的行解释为我们使用JVM参数“

  • 我在spark streaming中面临一个非常奇怪的问题。我使用的是、节点数3、执行器数3{1个接收器和2个处理器}、每个执行器的内存2GB、每个执行器的内核1。批次间隔为10秒。我的批量大小约为1000条记录(约150KB)。 流转时长从最初的2秒逐渐增加到几分钟,但在最初的40-50小时内运行良好。之后,调度延迟和流转时长开始上升。 我试过查看GC,发现驱动程序的旧一代堆内存容量不断增加。这

  • 问题内容: 一个的类上堆和参考变量指向它创建。 如果我写的时候没看错 类的对象在堆上创建并指向它。在堆中,我们有两个单独的对象,其中包含它们自己的实例变量。 但是如果我写 还有两个将在堆上创建,一个用于,另一个用于。但仅提供参考 即可。谁指的是堆外层?如果没有任何引用引用它,那么它应该有资格进行垃圾回收,这将影响的使用。 问题答案: 内部类包含对其外部类实例的隐藏引用。如果没有其他引用,则该隐藏引

  • 我有几个线程在运行,每个线程都对HTTP工具包进行阻塞调用。我的代码一直在工作,但最近大约30分钟后就冻结了。我所有的线程都卡在以下一点上: