【问题标题】:JVM hangs after migrating to jdk1.8.0_74JVM 迁移到 jdk1.8.0_74 后挂起
【发布时间】:2016-08-05 14:17:30
【问题描述】:

我有一个 java 应用程序,它曾经在 java 7 上运行良好。在使用以下配置迁移到 java 8 后,它开始挂起。

-Xms3g -Xmx3g -verbose:gc -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:+PrintGCDateStamps

我已经进行了 jstack 转储,它显示所有线程都处于 BLOCKED 状态。我还使用了 jmap 转储,其中显示了以下信息。

有人可以帮我解决这个问题吗?

Attaching to process ID 2554, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.74-b02

using thread-local object allocation.
Garbage-First (G1) GC with 18 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3221225472 (3072.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 1932525568 (1843.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3072
   capacity = 3221225472 (3072.0MB)
   used     = 2112667712 (2014.7969360351562MB)
   free     = 1108557760 (1057.2030639648438MB)
   65.58583776156108% used
G1 Young Generation:
Eden Space:
   regions  = 1665
   capacity = 2024800256 (1931.0MB)
   used     = 1745879040 (1665.0MB)
   free     = 278921216 (266.0MB)
   86.22475401346452% used
Survivor Space:
   regions  = 5
   capacity = 5242880 (5.0MB)
   used     = 5242880 (5.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 349
   capacity = 1191182336 (1136.0MB)
   used     = 361545792 (344.79693603515625MB)
   free     = 829636544 (791.2030639648438MB)
   30.351842960841218% used

18753 interned Strings occupying 1751224 bytes.

【问题讨论】:

  • 你的伊甸园空间很忙,你的幸存者空间已经满了,这很正常 - 老一代很空。我会再次运行 1) 设置打印 GC 标志,或 2) 附加 VisualVM。
  • 在没有设置任何标志的情况下会挂起吗?
  • 完全是您的应用程序还是在容器上运行? (应用服务器、OSGi 容器……)
  • 您能否尝试使用以下标志运行并共享输出。 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:mygclogfilename.gc
  • 听起来你有一个线程安全错误。您可以编写恰好在一台机器上的一个版本中工作的代码,但是更改操作系统、机器或 JVM 版本,您的错误就会出现。如果你所有的线程都被阻塞了,他们正在等待一些东西。

标签: java garbage-collection jvm


【解决方案1】:

您需要进行线程转储并仔细分析以了解它们卡在哪里,这很可能是您的代码中的线程安全问题。过去,当我们从 Linux 4 机器迁移到 Linux 6(具有多个 CPU 和内核的强大机器)时,我们也遇到过类似的锁定问题。更快的机器可能会暴露这些长期存在的与线程相关的编程错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 2015-10-31
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多