分析 JVM 的最佳方法是什么? [关闭]

问题描述 投票:0回答:1

我们公司有一台 Unix 机器,里面有一个 tomcat 服务器,我,使用 spring 和 vuejs 的 webApp 程序员,创建了 .war 以提供给 Tomcat 在线上传并通过 HTTPS 访问它;

一点历史:

最初在这台机器上只有 5 场战争,分为:WebApp 和 Rest-Api with Job Scheduled(一些通过 Spring-boot Scheduled 编写,其他通过 Quartz 编写,其他 .war 而不是通过 spring-boot 和 Vuejs 和/或 vanilla javascript)是碰巧由于工作原因,战争从 5 转移到 17。(总是如上所述划分)碰巧每 3 天 Tomcat 服务器崩溃并且不再工作,分析日志崩溃和不工作的原因不再工作是由于这个“GC overhead limit exceeded”错误,每次我们重新启动 tomcat 时,它都会在 catalina.out 日志中写入“64 位 Java HotSpot(TM) Server VM 线程的完整转储” 感谢 ycrash 社区,我不仅能够分析转储并进行进一步研究以更好地理解为什么会产生此错误,并且在我的研究中我遇到了一个名为 JProfile 的工具并开始使用它

图库:

现状:

在使用 JProfile 工具进行了几天的分析之后,我无法继续,或者说很多问题涌入我的脑海,但我找不到答案,例如:

  1. 内存总是达到2GB是正常的;
  2. 几乎有80多个线程处于阻塞状态,这正常吗?
  3. java.util怎么会有这么高的值?
java jvm jprofiler
1个回答
2
投票

QnA

  1. 内存总是达到2GB是正常的

如果你在你的 jvm 中存储大数据,达到 2GB 是正常的内存。此外,还有 jvm 设置,可设置分配给程序的最小和最大内存

  1. 几乎80多个线程处于阻塞状态是否正常

很遗憾,由于不了解您的程序是如何工作的,我无法为您解答。您可能需要查看您的文档或开发它的人。

  1. java.util怎么会有这么高的价值

与其关注那个,不如关注更一般的层面。这是一些例子

场景

  1. 高内存,低实例数

Jvm 检测到仍然需要 org.jboss.weld.annotated.enhanced.jlr 因此它存储了它们。实例数现在很低并不意味着它不会很高,因为某些事件会触发它并且程序会分配更多实例供其处理。

  1. 低内存,高实例数

org.jboss.weld.util.collections 使用低内存但某些事件触发它并且程序需要为其分配实例以进行处理。

总之,这就是为什么你会看到一些实例数高但内存低和实例数低但内存高的原因,这与理论不符

高内存 = 高实例数

低内存 = 低实例数

附加:Java 有垃圾收集器,可以删除未使用的变量,这有助于简化工作。例如,我们不需要清除一些变量(可能有 1000 万大小),如列表或数组。

我的崩溃解决方案是......

  1. 您可能需要分配更多内存。
  2. 请估计您的程序的最小和最大内存是多少
  3. 请确保没有内存泄漏。例如,当您建立与数据库的连接时,请务必关闭它。例如。 mySql.close();
© www.soinside.com 2019 - 2024. All rights reserved.