gpt4 book ai didi

尽管堆保持不变,Java RAM 却增加了?

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:03 25 4
gpt4 key购买 nike

Possible Duplicate:
Limit jvm process memory on ubuntu

在我的应用程序中,我将文档上传到服务器,服务器对其进行一些分析。

今天,我使用 jconsole.exe 和堆转储分析了我的应用程序,试图找出是否存在内存问题/内存泄漏。我想我可能会遇到这样的问题,因为我的应用程序在运行时在 RAM 上增长得非常快。

当我在运行一段时间后使用 jconsole 观察堆/codecache/perm gen 等内存时,我很惊讶地看到以下内容:

check

图片链接:https://www7.pic-upload.de/13.06.12/murk9qrka8al.png

正如您在右侧的 jconsole 中看到的那样,当我进行与分析相关的操作时,堆会增加,但当工作结束时,堆也会再次减小到正常大小。在左侧,您可以看到部署应用程序的服务器的“htop”。就是这样:尽管堆运行正常,而且垃圾收集器似乎也运行正确,但 RAM 却令人难以置信高到几乎 3.2GB。

这现在真的让我很困惑。我在想我的 java 虚拟机堆栈是否必须对此做点什么?我做了一些研究,我发现虚拟机堆栈是一个只有几兆字节(甚至只有 kb)的小内存。

我的技术背景:

  • 应用程序在 glassfish v.3.1.2 上运行
  • 数据库在 MySQL 上运行
  • 使用 Hibernate 作为 ORM 框架
  • Java 版本为 1.7.0_04
  • 它是使用 VAADIN 实现的
  • MySQL 数据库和 glassfish 是此服务器上唯一运行的东西
  • 我在分析过程中使用 JAXB 构建 XML-DOM 样式的文档并将其保存在数据库中
  • 上传的文档为 .txt 或 .pdf 文件
  • 操作系统是linux

解决方案?

你知道为什么会发生这种情况以及我可以做些什么来修复它吗?我现在真的很惊讶,因为我认为内存问题来自内存泄漏,导致堆爆炸。但现在,堆不是问题。 RAM 越来越高,而堆却保持在同一水平。而且我不知道该怎么做才能解决它。

感谢您与我分享的每一个想法。

编辑:也许我还应该指出,这种行为目前使我无法真正让其他人使用我的应用程序。当 RAM 已满且服务器不再响应时,我就退出了。

Edit2:也许我还应该补充一点,在每次成功的进一步分析后,此 RAM 都会不断增加。

最佳答案

在 JVM 实现中,除了堆设置之外,还有很多东西需要使用内存。

通过-Xmx进行的堆设置仅控制Java堆,它不控制JVM对 native 内存的消耗,根据实现的不同, native 内存的消耗完全不同。

来自以下文章Thanks for the Memory ( Understanding How the JVM uses Native Memory on Windows and Linux )

维护堆和垃圾收集器使用您无法控制的 native 内存。

More native memory is required to maintain the state of the memory-management system maintaining the Java heap. Data structures must be allocated to track free storage and record progress when collecting garbage. The exact size and nature of these data structures varies with implementation, but many are proportional to the size of the heap.

JIT 编译器使用 native 内存,就像 javac 一样

Bytecode compilation uses native memory (in the same way that a static compiler such as gcc requires memory to run), but both the input (the bytecode) and the output (the executable code) from the JIT must also be stored in native memory. Java applications that contain many JIT-compiled methods use more native memory than smaller applications.

然后你就有了使用 native 内存的类加载器

Java applications are composed of classes that define object structure and method logic. They also use classes from the Java runtime class libraries (such as java.lang.String) and may use third-party libraries. These classes need to be stored in memory for as long as they are being used. How classes are stored varies by implementation.

我什至不会开始引用有关线程的部分,我想您已经明白了Java 堆并不是 JVM 实现中唯一消耗内存的东西,也不是所有东西进入 JVM 堆,堆占用的 native 内存比您指定的要多得多管理和簿记。

native 代码

应用程序服务器很多时候都具有在 JVM 外部运行的 native 代码,但仍然向操作系统显示为与控制应用程序服务器的进程关联的内存。

关于尽管堆保持不变,Java RAM 却增加了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com