Java致命错误文件显示内存不足,而堆转储小得多



我正在运行一个基于Java的应用程序,由于内存不足而崩溃。hs_err:

的一些输出片段
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 24696061952 bytes for committing reserved memory.
# Possible reasons:
#   The system is out of physical RAM or swap space
#   The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
#  Out of Memory Error 
#
# JRE version:  (8.0_275-b01) (build )
# Java VM: OpenJDK 64-Bit Server VM
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#

但是当我采取堆转储它显示内存约8GB。我的jvm参数是:-Xmx30720m -Xms30720m -Xmn7168m -Xss8m

top命令显示

PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20   0 82.7g  36g  33m S 10.6 61.9  63594:19 java

/proc/meminfo

/proc/meminfo:
MemTotal:       61833192 kB
MemFree:         2235872 kB
MemAvailable:   20808016 kB
Buffers:          213036 kB
Cached:         17876428 kB
SwapCached:            0 kB
Active:         55994452 kB
Inactive:        1816412 kB
Active(anon):   39721444 kB
Inactive(anon):      132 kB
Active(file):   16273008 kB
Inactive(file):  1816280 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              1312 kB
Writeback:             0 kB
AnonPages:      39721564 kB
Mapped:           107292 kB
Shmem:               140 kB
Slab:            1280320 kB
SReclaimable:    1121808 kB
SUnreclaim:       158512 kB
KernelStack:       67824 kB
PageTables:       103072 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    30916596 kB
Committed_AS:   75073316 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    62902272 kB

我不明白如何在这里调试,因为堆转储中没有显示任何内容,堆转储比健康运行的应用程序的堆转储要小。知道如何识别程序的哪一部分占用了内存吗?

您已经使用-Xms来强制JVM在启动时获得~30GB的空间。

它已经尝试过了,但是失败了。它只获得了8GB。它需要另外22 GB,但无法获得。这就是错误信息告诉你的。这与显示堆只有8GB的转储一致。

你要求的比操作系统提供的要多。你需要弄清楚在操作系统中发生了什么。

您的应用程序代码可能不涉及。JVM仍在根据您的命令行选项初始化它的堆。

最新更新