相关疑难解决方法(0)

为什么G1GC在开始混合收藏之前缩小了年轻一代?

当G1决定它需要开始进行混合收集时,它会将我们的伊甸园空间从10g大幅缩小到大约1g.

{Heap before GC invocations=294 (full 0):
 garbage-first heap   total 20480000K, used 18304860K [0x00000002de000000, 0x00000002de804e20, 0x00000007c0000000)
  region size 8192K, 1363 young (11165696K), 11 survivors (90112K)
 Metaspace       used 37327K, capacity 37826K, committed 38096K, reserved 1083392K
  class space    used 3935K, capacity 4081K, committed 4096K, reserved 1048576K
2016-03-31T20:57:31.002+0000: 7196.427: [GC pause (G1 Evacuation Pause) (young)
Desired survivor size 717225984 bytes, new threshold 1 (max 1)
- age   1:   41346816 bytes,   41346816 total
 7196.427: [G1Ergonomics (CSet Construction) start choosing CSet, _pending_cards: 144693, predicted base …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection heap-memory g1gc

11
推荐指数
1
解决办法
3434
查看次数

Java中的零垃圾大字符串反序列化,Humongous对象问题

我正在寻找一种方法来Stringbyte[]Java中反序列化尽可能少的垃圾.因为我正在创建自己的序列化器和反序列化器,所以我可以完全自由地在服务器端(即在序列化数据时)和客户端(即在反序列化数据时)实现任何解决方案.

我已经设法通过迭代chars()并将每个(16位值)转换为2x 8位值来有效地序列化 a String而不会产生任何垃圾开销.有这方面一个很好的辩论在这里.另一种方法是使用Reflection 直接访问底层,但这超出了问题的范围.String'sString.charAt(i)charString'schar[]

但是,我似乎不可能在byte[]没有创建char[] 两次的情况下反序列化,这似乎很奇怪.

程序,流程:

  1. 创建 char[]
  2. 迭代byte[]并填写char[]
  3. 使用String(char[])构造函数创建String

由于Java的String不变性规则,构造函数复制char [],创建2x GC开销.我总是可以使用机制来规避这个(不安全的String分配+反射来设置char[]实例),但我只是想问一下,除了我违反每一个关于String's不变性的约定之外是否还有其他后果.

当然,对此最明智的回应是"来吧,停止这样做,并相信GC,原来char[]将是非常短暂的,G1将暂时摆脱它",这实际上是有道理的,如果char[]它更小比G1的区域大小的1/2.如果它更大,char []将直接分配为一个巨大的对象(即自动传播到G1的区域之外).这些物体很难在G1中有效地进行垃圾收集.这就是每个分配都很重要的原因.

关于如何解决这个问题的任何想法?

非常感谢.

java serialization garbage-collection g1gc java-8

7
推荐指数
1
解决办法
1406
查看次数