Ser*_*TCG 7 java serialization garbage-collection g1gc java-8
我正在寻找一种方法来String
从byte[]
Java中反序列化尽可能少的垃圾.因为我正在创建自己的序列化器和反序列化器,所以我可以完全自由地在服务器端(即在序列化数据时)和客户端(即在反序列化数据时)实现任何解决方案.
我已经设法通过迭代chars()并将每个(16位值)转换为2x 8位值来有效地序列化 a String
而不会产生任何垃圾开销.有这方面一个很好的辩论在这里.另一种方法是使用Reflection 直接访问底层,但这超出了问题的范围.String's
String.charAt(i)
char
String's
char[]
但是,我似乎不可能在byte[]
没有创建char[]
两次的情况下反序列化,这似乎很奇怪.
程序,流程:
char[]
byte[]
并填写char[]
String(char[])
构造函数创建String由于Java的String
不变性规则,构造函数复制char [],创建2x GC开销.我总是可以使用机制来规避这个(不安全的String
分配+反射来设置char[]
实例),但我只是想问一下,除了我违反每一个关于String's
不变性的约定之外是否还有其他后果.
当然,对此最明智的回应是"来吧,停止这样做,并相信GC,原来char[]
将是非常短暂的,G1将暂时摆脱它",这实际上是有道理的,如果char[]
它更小比G1的区域大小的1/2.如果它更大,char []将直接分配为一个巨大的对象(即自动传播到G1的区域之外).这些物体很难在G1中有效地进行垃圾收集.这就是每个分配都很重要的原因.
关于如何解决这个问题的任何想法?
非常感谢.
我找到了一个解决方案,如果您有一个不受管理的环境,则该解决方案毫无用处。
该类java.lang.String
有一个包私有的构造函数String(char[] value, boolean share)
。
来源:
/*
* Package private constructor which shares value array for speed.
* this constructor is always expected to be called with share==true.
* a separate constructor is needed because we already have a public
* String(char[]) constructor that makes a copy of the given char[].
*/
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
Run Code Online (Sandbox Code Playgroud)
这在 Java 中被广泛使用,例如在Integer.toString()
、Long.toString()
、String.concat(String)
、String.replace(char, char)
、中String.valueOf(char)
。
解决方案(或黑客,无论你想怎么称呼它)是将类移动到java.lang
包并访问包私有构造函数。这对安全经理来说不是一个好兆头,但这是可以规避的。
归档时间: |
|
查看次数: |
1406 次 |
最近记录: |