繁体   English   中英

在Java应用程序启动时如何减少VM消耗?

[英]How to reduce VM consumption in the startup of Java application?

我正在研究Java(Hibernate + Spring + JavaFX)应用程序。 要成功运行此应用程序,我必须将VM设置为“ -Xms512m”,否则它将因以下提到的错误而失败。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [*path/*]: 
    Constructor threw exception; nested exception is java.lang.OutOfMemoryError: Java heap space.

我观察到会话工厂正在消耗250 MB以上的内存来启动。 有些hbm(hbm POJO)文件占用180 MB

我还尝试了Netbeans Profiler会话以减少内存泄漏。

您能否建议一些减少应用程序启动中VM消耗的步骤。

减少虚拟机消耗的最佳方法是什么?

不确定堆spcae不足的正确原因。 要找到正确的原因,您需要对其进行调试。

调试步骤

  • 如果内存不足,请使用JVM arg将内存转储到给定位置。 它将创建一个庞大的文件(最多几个GB)

    -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = path_to_file

  • 使用任何探查器加载转储文件。 找到罪魁祸首。 以下是使用堆转储的链接

使用visualvm进行堆转储

堆转储技巧

为了启动应用程序,JVM将在启动后需要最少的Java堆空间进行初始化,这是由于缺少内存空间导致应用程序可能抛出OutOfMemory。 没有选择来减少VM的内存消耗。 如果应用程序请求对象分配,则JVM将分配内存。 垃圾收集器有责任清理掉死掉的物体。

遵循Option可能有助于识别泄漏

1)-verbose:gc此参数将记录GC占用行为。 一旦系统抛出OOM,就可以将日志加载到垃圾收集器和内存vzisualizer工具中,以查看该工具提供的分配模式和调整建议。

2)在OOM上收集堆转储并将其加载到MemoryAnalyzerTool(MAT)中,并检查是否有泄漏的可能。

解:

  1. 之前,我在具有3个会话工厂的数据库中映射了3个模式。 现在映射一个。 在那里保存110 MB。

  2. 为了进一步提高性能,请使用Integerated Ehcache。

暂无
暂无

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

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