在一个应用程序中,我有以下内容 -verbose:gc
[GC (Metadata GC Threshold) 8530310K->2065630K(31574016K), 0.3831399 secs]
[Full GC (Metadata GC Threshold) 2065630K->2053217K(31574016K), 3.5927870 secs]
[GC (Metadata GC Threshold) 8061486K->2076192K(31574016K), 0.0096316 secs]
[Full GC (Metadata GC Threshold) 2076192K->2055722K(31574016K), 0.9376524 secs]
[GC (Metadata GC Threshold) 8765230K->2100440K(31574016K), 0.0150190 secs]
[Full GC (Metadata GC Threshold) 2100440K->2077052K(31574016K), 4.1662779 secs]
Run Code Online (Sandbox Code Playgroud)
什么是"元数据GC阈值"以及如何减少它.注意:虽然Full GC花了很长时间进行清理,但它实际上会清理很多,即如果不这样做会更好.
我使用以下选项运行G1垃圾收集器的Java程序:
-XX:-UseBiasedLocking
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/var/tmp/gclog.out
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样......
44900.297: [GC pause (young)44900.386 (initial-mark), 0.08894851 secs]
: [GC concurrent-mark-start]
[Parallel Time: 83.7 ms]
[GC Worker Start Time (ms): 44900297.6 44900297.6 44900297.6 44900297.6 44900297.6 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7
Avg: 44900297.7, Min: 44900297.6, Max: 44900297.7, Diff: 0.1]
[Update RS (ms): 23.5 24.3 25.0 25.0 23.9 24.4 25.2 24.1 25.7 24.7 24.8 24.4 24.7
Avg: 24.6, Min: 23.5, Max: 25.7, Diff: 2.1]
[Processed Buffers : 16 19 19 23 …Run Code Online (Sandbox Code Playgroud) OpenJDK 9的新Unified JVM日志记录可以按标签过滤日志,但JEP不提供所有可用标记的列表.如何列出所有可用参数?
我正在寻找一种方法来String从byte[]Java中反序列化尽可能少的垃圾.因为我正在创建自己的序列化器和反序列化器,所以我可以完全自由地在服务器端(即在序列化数据时)和客户端(即在反序列化数据时)实现任何解决方案.
我已经设法通过迭代chars()并将每个(16位值)转换为2x 8位值来有效地序列化 a String而不会产生任何垃圾开销.有这方面一个很好的辩论在这里.另一种方法是使用Reflection 直接访问底层,但这超出了问题的范围.String'sString.charAt(i)charString'schar[]
但是,我似乎不可能在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中有效地进行垃圾收集.这就是每个分配都很重要的原因.
关于如何解决这个问题的任何想法?
非常感谢.