0 0

java垃圾回收器不停的做GC,怎么回事?5

最近写了个服务器小程序,开的线程比较多,大约在1000左右吧,高峰期会更多。
今天忽然不停的GC,觉得很纳闷,不知道是怎么一回事,应该如何去做优化?
GC日志如下:一次GC的时间间隔不到一秒,每次GC的时间也不到一秒。
{Heap before GC invocations=306 (full 0):
par new generation   total 511936K, used 511872K [0x000000007fff0000, 0x000000009f3f0000, 0x000000009f3f0000)
  eden space 511872K, 100% used [0x000000007fff0000, 0x000000009f3d0000, 0x000000009f3d0000)
  from space 64K,   0% used [0x000000009f3d0000, 0x000000009f3d0000, 0x000000009f3e0000)
  to   space 64K,   0% used [0x000000009f3e0000, 0x000000009f3e0000, 0x000000009f3f0000)
concurrent mark-sweep generation total 5632000K, used 145047K [0x000000009f3f0000, 0x00000001f6ff0000, 0x00000001f6ff0000)
concurrent-mark-sweep perm gen total 512000K, used 35276K [0x00000001f6ff0000, 0x00000002163f0000, 0x00000002163f0000)
158889.595: [GC 158889.595: [ParNew: 511872K->0K(511936K), 0.0029090 secs] 656919K->145050K(6143936K), 0.0030557 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap after GC invocations=307 (full 0):
par new generation   total 511936K, used 0K [0x000000007fff0000, 0x000000009f3f0000, 0x000000009f3f0000)
  eden space 511872K,   0% used [0x000000007fff0000, 0x000000007fff0000, 0x000000009f3d0000)
  from space 64K,   0% used [0x000000009f3e0000, 0x000000009f3e0000, 0x000000009f3f0000)
  to   space 64K,   0% used [0x000000009f3d0000, 0x000000009f3d0000, 0x000000009f3e0000)
concurrent mark-sweep generation total 5632000K, used 145050K [0x000000009f3f0000, 0x00000001f6ff0000, 0x00000001f6ff0000)
concurrent-mark-sweep perm gen total 512000K, used 35276K [0x00000001f6ff0000, 0x00000002163f0000, 0x00000002163f0000)
}
{Heap before GC invocations=307 (full 0):
par new generation   total 511936K, used 511872K [0x000000007fff0000, 0x000000009f3f0000, 0x000000009f3f0000)
  eden space 511872K, 100% used [0x000000007fff0000, 0x000000009f3d0000, 0x000000009f3d0000)
  from space 64K,   0% used [0x000000009f3e0000, 0x000000009f3e0000, 0x000000009f3f0000)
  to   space 64K,   0% used [0x000000009f3d0000, 0x000000009f3d0000, 0x000000009f3e0000)
concurrent mark-sweep generation total 5632000K, used 145050K [0x000000009f3f0000, 0x00000001f6ff0000, 0x00000001f6ff0000)
concurrent-mark-sweep perm gen total 512000K, used 35276K [0x00000001f6ff0000, 0x00000002163f0000, 0x00000002163f0000)
158893.168: [GC 158893.168: [ParNew: 511872K->0K(511936K), 0.0029313 secs] 656922K->145054K(6143936K), 0.0030717 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap after GC invocations=308 (full 0):
par new generation   total 511936K, used 0K [0x000000007fff0000, 0x000000009f3f0000, 0x000000009f3f0000)
  eden space 511872K,   0% used [0x000000007fff0000, 0x000000007fff0000, 0x000000009f3d0000)
  from space 64K,   0% used [0x000000009f3d0000, 0x000000009f3d0000, 0x000000009f3e0000)
  to   space 64K,   0% used [0x000000009f3e0000, 0x000000009f3e0000, 0x000000009f3f0000)
concurrent mark-sweep generation total 5632000K, used 145054K [0x000000009f3f0000, 0x00000001f6ff0000, 0x00000001f6ff0000)
concurrent-mark-sweep perm gen total 512000K, used 35276K [0x00000001f6ff0000, 0x00000002163f0000, 0x00000002163f0000)
}

JVM的配置参数如下:
-Xms6000M -Xmx6000M -Xmn500M -XX:PermSize=500M -XX:MaxPermSize=500M -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=90 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
2013年8月26日 13:33

5个答案 按时间排序 按投票排序

1 0

采纳的答案

这jvm参数是谁给的啊?
-XX:SurvivorRatio=65536,以为着survivor区非常小,小到几乎可以忽略了。你想象500M*1/65538能有多大啊。这参数默认是8,不知道楼主为什么要这么调。高并发可以调到6。调到65535,完全无法理解。

-XX:MaxTenuringThreshold=0,这个是新生代晋升到老年代的次数,0次,意味着只要活一次就到老年代了,omg,在高并发的时候可以不调,默认15次很好。不过调为0,真的很难理解,可以调到8试试。
这是两个大问题。

在高并发的时候-Xmn500M这个参数可以还大一点,比如1G或1.5G。

2013年8月26日 16:24
0 0

[img][list]
[*]

引用
[b] :lol: [/b]

[/list][/img]

2013年8月28日 12:10
0 0

看到这些JVM参数,是哪个调的啊?

我估计也根本就没理解甚至不知道JVM GC原理吧...

2013年8月27日 14:05
0 0


    1楼说得很对,尤其是这个参数,-XX:MaxTenuringThreshold=0,它是指对象存活多少次再进入老年代的阈值,设为0使得你大部分对象存活一次就要开始回收,这应该就是你频繁GC的主要原因了。设为默认的15左右可以自己实际测试下效果,但设为0肯定是不OK的。

2013年8月27日 11:32
0 0

让我等2G内存的编码小白,情何以堪。

最好吧功能代码也贴出来,上面只看出新生代

2013年8月26日 14:20

相关推荐

    java垃圾回收器代码举例

    Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...

    java jstat 查看哪个进程频繁GC垃圾回收

    Java垃圾回收(Garbage Collection, 简称GC)是JVM(Java Virtual Machine)管理内存的重要机制。在Java应用程序运行过程中,如果发现并回收不再使用的对象,可以防止内存泄漏,确保程序稳定运行。当我们遇到应用...

    java垃圾回收(gc)机制详解.pdf

    Java垃圾回收(GC)机制是Java语言管理内存的自动化机制,它能够自动释放不再使用的内存空间,从而避免内存泄漏和程序崩溃等问题。在介绍Java GC机制之前,我们首先要了解垃圾回收的目的和意义。在任何程序中,内存...

    Java_GC垃圾回收调优指南

    ### Java GC垃圾回收调优指南 #### 概述 在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。合理的GC配置可以显著提高应用程序的性能和稳定性。本指南旨在帮助开发者深入理解...

    java垃圾回收(gc)机制详解

    Java垃圾回收(GC)机制是Java编程语言中的一个重要特性,它自动管理程序的内存空间,负责识别并清除不再使用的对象,以防止内存泄漏。本文将深入探讨Java GC的工作原理、类型、过程以及优化策略。 一、Java垃圾...

    Java的垃圾收集器(GC)

    ### Java的垃圾收集器(GC)详解 #### 引言 垃圾收集器(Garbage Collector,简称GC)是Java语言的一项重要特性,它自动化管理内存,显著减轻了开发者手动管理内存负担,避免了常见的内存泄漏问题,提高了程序的...

    Java垃圾回收原理

    Java的垃圾回收(Garbage Collection, GC)是一种自动化的内存管理方式,它能够自动识别并释放不再被引用的对象所占用的内存空间,从而避免了程序员手动管理内存带来的各种问题,如内存泄漏等。 ##### 2.2 堆与栈的...

    Java垃圾回收详解

    - `System.gc()` 和 `System.runFinalization()`:请求垃圾回收器执行垃圾回收和调用`finalize()` 方法。需要注意的是,虽然这些方法允许开发者显式地请求垃圾回收,但并不保证垃圾回收器会立即响应。 - `freeMemory...

    Java垃圾回收GC机制

    Java垃圾回收GC机制 Java垃圾回收GC机制是Java虚拟机(JVM)中的一种自动内存管理机制,它主要是为了解决Java程序中的内存问题。GC机制的出现使得Java程序员不再需要手动管理内存,提高了开发效率和程序的稳定性。 ...

    java垃圾回收

    Java垃圾回收(Garbage Collection, 简称GC)是Java虚拟机(JVM)管理内存的一种机制,它自动地识别并清理不再使用的对象,从而避免了程序员手动管理内存可能导致的内存泄漏问题。垃圾回收是Java语言的一个重要特性...

    java高级之垃圾回收机制

    其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...

    JAVA垃圾回收面试个人总结.doc

    垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存泄漏。面试中,理解GC的工作原理和优化策略对于应聘者来说至关重要。 首先,Java内存主要...

    java垃圾回收日志分析工具GCViewer

    java垃圾回收日志分析工具GCViewer,包内含有15年9月1日所能下载到的最新代码及代码打包的jar文件,双击即可执行。 本GCViewer是最新版本的,是JDK1.8编译并支持JDK1.8的GC 日志文件分析。 GCViewer是业内支持率很高...

    Java垃圾回收精粹-Part4Java开发Java经验技

    Java垃圾回收(Garbage Collection, 简称GC)是Java平台中的一项重要特性,它自动管理内存,释放不再使用的对象,避免了程序员手动管理内存可能导致的内存泄露问题。本篇将深入探讨Java垃圾回收的精华部分,以及在...

    JAVA垃圾回收机制

    Java垃圾回收机制(GC)是Java编程语言的关键特性,它自动管理内存,释放不再使用的对象,以防止内存泄漏。GC的运作方式主要有两种策略:引用计数和对象引用遍历。 引用计数是一种简单但不完美的方法。每个对象都有...

    Java垃圾回收GC.xmind

    Java垃圾回收GC.xmind

    迷你垃圾回收器mini gc for c

    迷你垃圾回收器(Mini GC for C)是一种针对C语言实现的轻量级内存管理工具,主要功能是自动回收不再使用的内存,以防止内存泄漏。在C语言中,程序员需要手动管理内存分配和释放,而垃圾回收器则可以自动化这一过程...

Global site tag (gtag.js) - Google Analytics