Java内存溢出问题

12

我有一个在Amazon-EC2-m1.large实例上运行的JAR文件,使用64位Linux操作系统。不同的时间段内,通常在2-4个小时之间,我就会用完内存,尽管在我的最后一次日志写入(在错误文件创建之前),我看到了以下内容:

Memory - 
     totalHeapSize: 264 MB, 
     maxHeapSize: 1656 MB, 
     freeHeapSize: 220 MB

当我从开始读取jar文件直到内存耗尽时,所有的值都是相同的,而且freeHeapSize在200-230 MB之间(我每30秒检查一次并执行System.gc())。

在hs_err_pid2250.log中写道:

    #
    # There is insufficient memory for the Java Runtime Environment to continue.
    # Cannot create GC thread. Out of system resources.
    # Possible reasons:
    #   The system is out of physical RAM or swap space
    #   In 32 bit mode, the process size limit was hit
    # Possible solutions:
    #   Reduce memory load on the system
    #   Increase physical memory or swap space
    #   Check if swap backing store is full
    #   Use 64 bit Java on a 64 bit OS
    #   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 (gcTaskThread.cpp:46), pid=2250, tid=140227064182528
    #
    # JRE version: 7.0_25-b15
    # Java VM: Java HotSpot(TM) 64-Bit Server VM (23.25-b01 mixed mode linux-amd64 compressed oops)
    # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
    #

    ---------------  T H R E A D  ---------------

    Current thread (0x00007f8920007800):  JavaThread "Unknown thread" [_thread_in_vm, id=2251, stack(0x00007f8928493000,0x00007f8928594000)]

    Stack: [0x00007f8928493000,0x00007f8928594000],  sp=0x00007f89285925d0,  free space=1021k
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    V  [libjvm.so+0x8a1d3a]  VMError::report_and_die()+0x2ea
    V  [libjvm.so+0x4071fb]  report_vm_out_of_memory(char const*, int, unsigned long, char const*)+0x9b
    V  [libjvm.so+0x4b3e2a]  GCTaskThread::GCTaskThread(GCTaskManager*, unsigned int, unsigned int)+0xfa
    V  [libjvm.so+0x4b2896]  GCTaskManager::initialize()+0x266
    V  [libjvm.so+0x75dc4f]  ParallelScavengeHeap::initialize()+0x6cf
    V  [libjvm.so+0x87a078]  Universe::initialize_heap()+0xb8
    V  [libjvm.so+0x87c7ed]  universe_init()+0x7d
    V  [libjvm.so+0x500315]  init_globals()+0x65
    V  [libjvm.so+0x863a62]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x1e2
    V  [libjvm.so+0x55ff34]  JNI_CreateJavaVM+0x74
    C  [libjli.so+0x2f8e]  JavaMain+0x9e


    ---------------  P R O C E S S  ---------------

    Java Threads: ( => current thread )

    Other Threads:

    =>0x00007f8920007800 (exited) JavaThread "Unknown thread" [_thread_in_vm, id=2251, stack(0x00007f8928493000,0x00007f8928594000)]

    VM state:not at safepoint (not fully initialized)

    VM Mutex/Monitor currently owned by a thread: None

    GC Heap History (0 events):
    No events

    Deoptimization events (0 events):
    No events

    Internal exceptions (0 events):
    No events

    Events (0 events):
    No events


    Dynamic libraries:
    00400000-00401000 r-xp 00000000 ca:01 9384                               /usr/java/jdk1.7.0_25/bin/java
    00600000-00601000 rw-p 00000000 ca:01 9384                               /usr/java/jdk1.7.0_25/bin/java
    01f54000-01f75000 rw-p 00000000 00:00 0                                  [heap]
    86600000-87ac0000 rw-p 00000000 00:00 0 
    87ac0000-8b800000 rw-p 00000000 00:00 0 
    8b800000-905b0000 rw-p 00000000 00:00 0 
    905b0000-d92b0000 rw-p 00000000 00:00 0 
    d92b0000-db980000 rw-p 00000000 00:00 0 
    db980000-100000000 rw-p 00000000 00:00 0 
    7f891d000000-7f891d270000 rwxp 00000000 00:00 0 
    7f891d270000-7f8920022000 rw-p 00000000 00:00 0 
    7f8920022000-7f8924000000 ---p 00000000 00:00 0 
    7f8925555000-7f892574d000 rw-p 00000000 00:00 0 
    7f892574d000-7f892574e000 ---p 00000000 00:00 0 
    7f892574e000-7f892584e000 rw-p 00000000 00:00 0 
    7f892584e000-7f892584f000 ---p 00000000 00:00 0 
    7f892584f000-7f892595a000 rw-p 00000000 00:00 0                          [stack:2252]
    7f892595a000-7f8925978000 rw-p 00000000 00:00 0 
    7f8925978000-7f892599f000 rw-p 00000000 00:00 0 
    7f892599f000-7f8925be6000 rw-p 00000000 00:00 0 
    7f8925be6000-7f8925bf1000 rw-p 00000000 00:00 0 
    7f8925bf1000-7f8925c0f000 rw-p 00000000 00:00 0 
    7f8925c0f000-7f8925c36000 rw-p 00000000 00:00 0 
    7f8925c36000-7f8925e7c000 rw-p 00000000 00:00 0 
    7f8925e7c000-7f8925e90000 rw-p 00000000 00:00 0 
    7f8925e90000-7f8925fb3000 rw-p 00000000 00:00 0 
    7f8925fb3000-7f8925fb4000 rw-p 00000000 00:00 0 
    7f8925fb4000-7f8925fcf000 r-xp 00000000 ca:01 17790                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libzip.so
    7f8925fcf000-7f89261ce000 ---p 0001b000 ca:01 17790                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libzip.so
    7f89261ce000-7f89261cf000 rw-p 0001a000 ca:01 17790                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libzip.so
    7f89261cf000-7f89261db000 r-xp 00000000 ca:01 17544                      /lib64/libnss_files-2.12.so
    7f89261db000-7f89263da000 ---p 0000c000 ca:01 17544                      /lib64/libnss_files-2.12.so
    7f89263da000-7f89263db000 r--p 0000b000 ca:01 17544                      /lib64/libnss_files-2.12.so
    7f89263db000-7f89263dc000 rw-p 0000c000 ca:01 17544                      /lib64/libnss_files-2.12.so
    7f89263dc000-7f8926405000 r-xp 00000000 ca:01 17571                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libjava.so
    7f8926405000-7f8926605000 ---p 00029000 ca:01 17571                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libjava.so
    7f8926605000-7f8926607000 rw-p 00029000 ca:01 17571                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libjava.so
    7f8926607000-7f8926614000 r-xp 00000000 ca:01 17789                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libverify.so
    7f8926614000-7f8926813000 ---p 0000d000 ca:01 17789                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libverify.so
    7f8926813000-7f8926815000 rw-p 0000c000 ca:01 17789                      /usr/java/jdk1.7.0_25/jre/lib/amd64/libverify.so
    7f8926815000-7f892681c000 r-xp 00000000 ca:01 17559                      /lib64/librt-2.12.so
    7f892681c000-7f8926a1b000 ---p 00007000 ca:01 17559                      /lib64/librt-2.12.so
    7f8926a1b000-7f8926a1c000 r--p 00006000 ca:01 17559                      /lib64/librt-2.12.so
    7f8926a1c000-7f8926a1d000 rw-p 00007000 ca:01 17559                      /lib64/librt-2.12.so
    7f8926a1d000-7f8926a9f000 r-xp 00000000 ca:01 17537                      /lib64/libm-2.12.so
    7f8926a9f000-7f8926c9e000 ---p 00082000 ca:01 17537                      /lib64/libm-2.12.so
    7f8926c9e000-7f8926c9f000 r--p 00081000 ca:01 17537                      /lib64/libm-2.12.so
    7f8926c9f000-7f8926ca0000 rw-p 00082000 ca:01 17537                      /lib64/libm-2.12.so
    7f8926ca0000-7f89276e1000 r-xp 00000000 ca:01 17795                      /usr/java/jdk1.7.0_25/jre/lib/amd64/server/libjvm.so
    7f89276e1000-7f89278e1000 ---p 00a41000 ca:01 17795                      /usr/java/jdk1.7.0_25/jre/lib/amd64/server/libjvm.so
    7f89278e1000-7f8927984000 rw-p 00a41000 ca:01 17795                      /usr/java/jdk1.7.0_25/jre/lib/amd64/server/libjvm.so
    7f8927984000-7f89279c0000 rw-p 00000000 00:00 0 
    7f89279c0000-7f8927b41000 r-xp 00000000 ca:01 7616                       /lib64/libc-2.12.so
    7f8927b41000-7f8927d41000 ---p 00181000 ca:01 7616                       /lib64/libc-2.12.so
    7f8927d41000-7f8927d45000 r--p 00181000 ca:01 7616                       /lib64/libc-2.12.so
    7f8927d45000-7f8927d46000 rw-p 00185000 ca:01 7616                       /lib64/libc-2.12.so
    7f8927d46000-7f8927d4c000 rw-p 00000000 00:00 0 
    7f8927d4c000-7f8927d4e000 r-xp 00000000 ca:01 17535                      /lib64/libdl-2.12.so
    7f8927d4e000-7f8927f4e000 ---p 00002000 ca:01 17535                      /lib64/libdl-2.12.so
    7f8927f4e000-7f8927f4f000 r--p 00002000 ca:01 17535                      /lib64/libdl-2.12.so
    7f8927f4f000-7f8927f50000 rw-p 00003000 ca:01 17535                      /lib64/libdl-2.12.so
    7f8927f50000-7f8927f66000 r-xp 00000000 ca:01 16704                      /usr/java/jdk1.7.0_25/jre/lib/amd64/jli/libjli.so
    7f8927f66000-7f8928166000 ---p 00016000 ca:01 16704                      /usr/java/jdk1.7.0_25/jre/lib/amd64/jli/libjli.so
    7f8928166000-7f8928167000 rw-p 00016000 ca:01 16704                      /usr/java/jdk1.7.0_25/jre/lib/amd64/jli/libjli.so
    7f8928167000-7f892817e000 r-xp 00000000 ca:01 7640                       /lib64/libpthread-2.12.so
    7f892817e000-7f892837d000 ---p 00017000 ca:01 7640                       /lib64/libpthread-2.12.so
    7f892837d000-7f892837e000 r--p 00016000 ca:01 7640                       /lib64/libpthread-2.12.so
    7f892837e000-7f892837f000 rw-p 00017000 ca:01 7640                       /lib64/libpthread-2.12.so
    7f892837f000-7f8928383000 rw-p 00000000 00:00 0 
    7f8928383000-7f89283a1000 r-xp 00000000 ca:01 9381                       /lib64/ld-2.12.so
    7f89283cb000-7f89283d5000 rw-p 00000000 00:00 0 
    7f89283d5000-7f892848b000 rw-p 00000000 00:00 0 
    7f892848b000-7f8928493000 rw-s 00000000 ca:01 8174                       /tmp/hsperfdata_gurustrade/2250
    7f8928493000-7f8928496000 ---p 00000000 00:00 0 
    7f8928496000-7f8928598000 rw-p 00000000 00:00 0                          [stack:2251]
    7f892859b000-7f892859e000 rw-p 00000000 00:00 0 
    7f892859e000-7f892859f000 r--p 00000000 00:00 0 
    7f892859f000-7f89285a0000 rw-p 00000000 00:00 0 
    7f89285a0000-7f89285a1000 r--p 0001d000 ca:01 9381                       /lib64/ld-2.12.so
    7f89285a1000-7f89285a2000 rw-p 0001e000 ca:01 9381                       /lib64/ld-2.12.so
    7f89285a2000-7f89285a3000 rw-p 00000000 00:00 0 
    7fff64527000-7fff64548000 rw-p 00000000 00:00 0                          [stack]
    7fff645ff000-7fff64600000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

    VM Arguments:
    java_command: /home/gurustrade/proj/versions/trunk/gt_engine/gt_engine.jar
    Launcher Type: SUN_STANDARD

    Environment Variables:
    PATH=/usr/bin:/bin
    SHELL=/bin/sh

    Signal Handlers:
    SIGSEGV: [libjvm.so+0x8a26a0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
    SIGBUS: [libjvm.so+0x8a26a0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
    SIGFPE: [libjvm.so+0x73f3d0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
    SIGPIPE: [libjvm.so+0x73f3d0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
    SIGXFSZ: [libjvm.so+0x73f3d0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
    SIGILL: [libjvm.so+0x73f3d0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
    SIGUSR1: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
    SIGUSR2: [libjvm.so+0x73ed20], sa_mask[0]=0x00000000, sa_flags=0x10000004
    SIGHUP: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
    SIGINT: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
    SIGTERM: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
    SIGQUIT: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000


    ---------------  S Y S T E M  ---------------

    OS:Linux
    uname:Linux 3.4.48-45.46.amzn1.x86_64 #1 SMP Wed Jun 12 02:04:44 UTC 2013 x86_64
    libc:glibc 2.12 NPTL 2.12 
    rlimit: STACK 8192k, CORE 0k, NPROC 1024, NOFILE 4096, AS infinity
    load average:1.01 1.04 1.10

    /proc/meminfo:
    MemTotal:        7633612 kB
    MemFree:         5784036 kB
    Buffers:          186424 kB
    Cached:          1025752 kB
    SwapCached:            0 kB
    Active:           980284 kB
    Inactive:         706036 kB
    Active(anon):     474096 kB
    Inactive(anon):      100 kB
    Active(file):     506188 kB
    Inactive(file):   705936 kB
    Unevictable:           0 kB
    Mlocked:               0 kB
    SwapTotal:             0 kB
    SwapFree:              0 kB
    Dirty:                88 kB
    Writeback:             0 kB
    AnonPages:        474084 kB
    Mapped:            43752 kB
    Shmem:               156 kB
    Slab:             103892 kB
    SReclaimable:      84548 kB
    SUnreclaim:        19344 kB
    KernelStack:        9032 kB
    PageTables:        20180 kB
    NFS_Unstable:          0 kB
    Bounce:                0 kB
    WritebackTmp:          0 kB
    CommitLimit:     3816804 kB
    Committed_AS:    2130476 kB
    VmallocTotal:   34359738367 kB
    VmallocUsed:       23908 kB
    VmallocChunk:   34359714455 kB
    AnonHugePages:         0 kB
    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
    DirectMap4k:     7872512 kB
    DirectMap2M:           0 kB


    CPU:total 2 (4 cores per cpu, 1 threads per core) family 6 model 23 stepping 10, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, tsc

    /proc/cpuinfo:
    processor   : 0
    vendor_id   : GenuineIntel
    cpu family  : 6
    model       : 23
    model name  : Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz
    stepping    : 10
    microcode   : 0xa07
    cpu MHz     : 2660.000
    cache size  : 6144 KB
    fpu     : yes
    fpu_exception   : yes
    cpuid level : 13
    wp      : yes
    flags       : fpu tsc msr pae cx8 cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 lahf_lm dtherm tpr_shadow vnmi flexpriority
    bogomips    : 5320.00
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 38 bits physical, 48 bits virtual
    power management:

    processor   : 1
    vendor_id   : GenuineIntel
    cpu family  : 6
    model       : 23
    model name  : Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz
    stepping    : 10
    microcode   : 0xa07
    cpu MHz     : 2660.000
    cache size  : 6144 KB
    fpu     : yes
    fpu_exception   : yes
    cpuid level : 13
    wp      : yes
    flags       : fpu tsc msr pae cx8 cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 lahf_lm dtherm tpr_shadow vnmi flexpriority
    bogomips    : 5320.00
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 38 bits physical, 48 bits virtual
    power management:



    Memory: 4k page, physical 7633612k(5784036k free), swap 0k(0k free)

    vm_info: Java HotSpot(TM) 64-Bit Server VM (23.25-b01) for linux-amd64 JRE (1.7.0_25-b15),   built on Jun  5 2013 20:48:36 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)

    time: Mon Aug  5 16:11:16 2013
    elapsed time: 0 seconds

另外,我使用具有30个核心线程和100个最大线程的线程池执行器(虽然有时我会使用所有30个,但从未使用超过30个)

最后,我使用bonecp连接池,其中包含50个连接

有什么建议吗? :)

在建议之后,我在本地计算机上运行应用程序后添加了一个堆转储。 我该如何继续? 这些关键性的橙色跳跃很重要吗?还是只有使用的重要? enter image description here


建议:创建一个堆转储,并找出导致此问题的原因。此处不可见。 - zapl
看起来JVM在启动时崩溃了,这可以从尝试为GC创建线程、缺少应用程序线程以及“VM state:not at safepoint(未完全初始化)”的崩溃信息中得知。应用程序是否在单独的JVM中启动副本? - Joni
由于您正在共享机器上运行虚拟机,是否有可能真实的物理机器内存不足? - Peter Lawrey
约翰 - 不,彼得 - 不。 - user502967
6个回答

13

我通过遵循以下建议,成功解决了一个几乎相同的错误:

https://confluence.csiro.au/pages/viewpage.action?pageId=278167841

他们基本上说:

当Java虚拟机启动时,默认情况下会生成许多垃圾回收线程,用于并行垃圾回收操作......此类线程的数量由以下公式计算:(ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8)......由于生成了这么多线程...程序将自动达到系统限制...

我使用环境变量限制了垃圾回收线程的数量,方法如下:

export _JAVA_OPTIONS="-XX:ParallelGCThreads=2"

关于垃圾回收的整体性能影响不确定,但至少今天的工作完成了。

请查看原帖获取更多选项。

祝好运, - Stu


我遇到了完全相同的问题,但这个方法解决了它。看来我的机器核心太多了! - zeroimpl
1
我无法访问你的链接@Stu。 - Rajesh Patel

1
如果您正在使用32位版本,请尝试64位Java版本。此外,添加新的JVM参数“-XX:+CMSClassUnloadingEnabled \”,可以清除一些未使用的类对象。

我使用64,我会加上它。 - user502967

1
如果您有更多的物理内存可用,请使用它。似乎分配的堆大小仅为1656 mb,这可能不足够。 尝试使用两个开关运行java jar文件-xmx4096mb和-xms2048 然后监视使用情况,也许您的应用程序需要的内存要求太大了,如果一段时间后仍然耗尽内存,则需要进一步调查以检查您的代码是否泄漏内存。 希望这可以帮助您,如果您需要更多澄清,请告诉我。

0

使用最新的Java开发工具包(JDK)已解决此问题。 请尝试安装java-11-openjdk


0

堆只是方程式的一部分。请查看总驻留内存 - 它包括堆和非堆贡献。非堆包括映射的JAR文件、线程堆栈(每个线程约1MB)、永久代等。在Linux上如何执行此操作,SO上有许多相关问题。


我该如何监控这些“Off heap”? - user502967

0

不试图解码转储数据,我观察到导致 JVM 内存不足的基本上有三种情况:

  1. 拥有一个结构(列表或其他)允许积累大量未使用但仍被引用的数据。
  2. 保留各种“句柄”——文件句柄、线程、数据库操作。特别是如果使用具有本地组件的 API,则可能会将许多内容留在 GC 范围之外。
  3. 进行单个极大请求(或一系列此类请求)。

介于这些情况之间的是类。如果运行动态创建和加载类的应用程序,则必须正确使用各个类加载器以使类可收集。


1
如果您正在加载一个类,并希望在不再需要时能够卸载它,则需要为其创建一个“用户类加载器”(或一组应一起卸载的相关类)。这是因为类和类加载器本质上相互引用,因此使用常规类加载器会将类锁定在原地,使其无法收集。这有点复杂,而且我实际上从未需要过这样做(至少10年左右),所以您需要查找详细信息。 - Hot Licks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接