【发布时间】: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