我有一个应用程序,基本上,创建一个新的字节数组(少于1K)后存储一些数据后(通常少于1分钟,但仍存储长达1小时)写入磁盘,数据将用于垃圾。每秒创建的大约400个数据包。我读了一些文章,这些文章不必担心GC特别快速创建和发布内存零件(在Java 6上)。 GC运行时间太长会导致我的应用程序问题。我设置了一些GC参数(较大的XMX和ParalelGC),这种减少的GC时间减少,但还不够。我有2个想法,我是焦点GC参数还是创建字节数组内存池机制?哪一个更好?

有帮助吗?

解决方案

我建议您对为什么GC对您的运作不足进行一些分析。您可以使用 jmap 倾倒堆,然后使用 jhat 或者 Eclipse内存分析仪 看看其中有什么物体。您可能会发现自己坚持不再需要的参考。

GC非常聪明,您实际上可以通过尝试使用自己的内存管理代码来实现它来使情况变得更糟。尝试调整参数,也许您也可以尝试新的G1垃圾收集器。

另外,请记住,GC喜欢短暂的,不变的物体。

其他提示

执行GC的频率取决于对象大小,但是成本(清理时间)更依赖于对象的数量。我怀疑在空间之间复制了长时间的阵列,直到最终进入旧空间并最终被丢弃。清洁旧的生命相对昂贵。

我建议您尝试使用ByteBuffer存储数据。这些就像字节[],但具有可变大小,如果您可以使用NIO的直接字节缓冲液,则可能会更有效。预先分配缓冲区可以更有效地预先分配缓冲区。 (虽然会浪费虚拟记忆)

顺便说一句:直接字节缓冲区在“ C”空间中使用内存时使用了很小的堆空间。

  1. 使用Profiler识别代码段
  2. 尝试使用弱点。
  3. 向VM建议GC ALGO
-Xgc: parallel
  1. 设置一个大堆并共享mem
-XX:+UseISM -XX:+AggressiveHeap
  1. 设置下面的垃圾收集。

-XX:SurvivorRatio 8

  1. 这可能会有所帮助http://download.oracle.com/docs/cd/e12840_01/wls/docs103/perform/jvmtuning.html#wp1130305
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top