有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我所拥有的gc输出的良好gc调优策略是什么?

这是运行约10分钟后的输出

Heap
 PSYoungGen      total 7040K, used 0K [0x24060000, 0x247c0000, 0x26790000)
  eden space 6528K, 0% used [0x24060000,0x24060000,0x246c0000)
  from space 512K, 0% used [0x246c0000,0x246c0000,0x24740000)
  to   space 512K, 0% used [0x24740000,0x24740000,0x247c0000)
 ParOldGen       total 48896K, used 43303K [0x06990000, 0x09950000, 0x24060000)
  object space 48896K, 88% used [0x06990000,0x093d9d80,0x09950000)
 PSPermGen       total 12288K, used 3737K [0x02990000, 0x03590000, 0x06990000)
  object space 12288K, 30% used [0x02990000,0x02d366c0,0x03590000)
[GC [PSYoungGen: 0K->0K(7040K)] 43303K->43303K(55936K), 0.0005129 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System) [PSYoungGen: 0K->0K(7040K)] [ParOldGen: 43303K->43303K(48896K)] 43303K->43303K(55936K) [PSPermGen: 3737K->3737K(12288K)], 0.1964557 secs] [Times: user=0.36 sys=0.00, real=0.19 secs]

提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    我建议使用JConsole(JDK1.5+)或jVisualVM(JDK1.6)之类的工具。printgc的单个输出不足以给出一个好的建议

    通常有两个问题:你创建了太多的新对象,新的一代会很快填满,因此gc会将所有这些对象移动到幸存者空间,甚至是Perm一代。如果是这样的话(它们在下一个完整gc中被删除,这需要更长的时间),我建议增加年轻/新一代。(-XX:NewSize)。这允许对象被常规gc取消引用和删除

    如果你有很多长寿命的物体,我会检查是否真的有必要。这可能意味着您必须更改代码

    请记住,与小型堆相比,大型堆执行gc所需的时间更长

  2. # 2 楼答案

    可能与从应用程序中创建(但未发布)过多的大型对象有关?我真的不知道javagc,但是来自。NET中,大型对象被放置在一个单独的大型对象堆上,该堆不被GC压缩。在应用程序中,利用忙分配模式可能会导致LOB上的碎片->;这反过来又常常导致那些糟糕的OutOfMemory(OOM)异常。 此外,LOB集合始终是第2代集合。这意味着,它们是昂贵的! 因此,干净的解决方案是实现池。为大型对象实施处置模式,并确保它们在使用后释放到池中。通过从池中回收新对象,将其重新用于新对象。 同样,这只适用于有太多大型分配的情况。所以你可以先把这个弄清楚

  3. # 3 楼答案

    如果内存不足,问题不是GC,而是使用了太多的对象而没有释放它们

    我上一次担心Java的GC是在1998年