在Java中,迭代字符串中所有字符的最快方法是什么,这:
String str = "a really, really long string";
for (int i = 0, n = str.length(); i < n; i++) {
char c = str.charAt(i);
}
Run Code Online (Sandbox Code Playgroud)
或这个:
char[] chars = str.toCharArray();
for (int i = 0, n = chars.length; i < n; i++) {
char c = chars[i];
}
Run Code Online (Sandbox Code Playgroud)
编辑:
如果重复调用的成本是什么,我想知道的是charAt
长迭代期间方法最终是要么不是比执行一个调用的成本小于或大于toCharArray
开头,然后直接在迭代期间访问阵列.
如果有人能够为不同的字符串长度提供强大的基准测试,考虑到JIT预热时间,JVM启动时间等等,而不仅仅是两次调用之间的差异,那就太棒了System.currentTimeMillis()
.
我不是Java newby,但我只知道垃圾收集.现在我想通过一些实践经验来改变它.我的目标是延迟不到0.3秒,或者在极端情况下0.5也可以.
我有一个-Xmx50gb(-Xms50gb)的应用程序,并设置其他GC选项:
-XX:+UseG1GC -Xloggc:somewhere.gc.log -XX:+PrintGCDateStamps
Run Code Online (Sandbox Code Playgroud)
但是现在我偶尔因为垃圾收集而长时间暂停超过5秒,尽管似乎有足够的可用内存.我找到的一个原因:
[GC pause (G1 Evacuation Pause) (young) 42G->40G(48G), 5.9409662 secs]
Run Code Online (Sandbox Code Playgroud)
为什么GCG1仍然为此做"停止世界"?(或者至少我看到它正好在这个时候停止我的应用程序)为什么它会做这样的负面清理,如果它不是真的有必要,因为有超过12%的可用RAM空闲.另外我认为默认值-XX:MaxGCPauseMillis
是200毫秒,为什么这个值被违反29或甚至50(见下文)?
延迟的另一个原因是:
[GC pause (Metadata GC Threshold) (young) (initial-mark) 40G->39G(48G), 10.4667233 secs]
Run Code Online (Sandbox Code Playgroud)
这可能通过这个答案解决,例如只增加元数据空间-XX:MetaspaceSize=100M
顺便说一句:使用JSE 1.8.0_91-b14
更新:此类事件的详细GC日志
2016-08-12T09:20:31.589+0200: 1178.312: [GC pause (G1 Evacuation Pause) (young) 1178.312: [G1Ergonomics (CSet Construction) start choosing CSet, _pending_cards: 3159, predicted base time: 1.52 ms, remaining time: 198.48 ms, target pause time: 200.00 ms]
1178.312: [G1Ergonomics (CSet Construction) add young regions to CSet, …
Run Code Online (Sandbox Code Playgroud) 我最近正在测试一个并发负载相对较高的演示应用程序。该应用程序是一个 java 应用程序,并在 Hotspot JVM (1.8.0_111) 上运行。
使用 4G 堆和并行吞吐量收集器,我可以获得大约 400 TPS 的最大吞吐量。吞吐量图表(作为负载的函数)如下所示。
因为 Oracle 建议对大于 4G 的堆大小使用 G1GC,所以我想尝试 G1,看看这是否对我的应用程序吞吐量有任何好处。
令我惊讶的是,使用 G1GC,我看到了以下吞吐量趋势。
我真的很惊讶,并决定深入了解这里发生了什么。这是我发现的。
我看到最初,在 4G 堆中,1.5G 分配给旧代区域,2.5G 分配给 eden 区域。但是随着时间的推移,旧的 gen 不再适合 1.5G,堆会被调整大小。这似乎无伤大雅。但问题似乎在于调整大小的方式。
现在所有的 4G 都分配给了旧的 gen 区域,几乎没有分配给 eden 区域。现在,当需要将某些东西分配给 eden 时,堆会再次调整大小。这成为新的常态,堆被反复调整大小,从而导致应用程序的巨大性能成本。
有没有人在 G1GC 之前注意到这一点?是否有任何建议来协商这个问题?
下面是带有 JVM 选项的启动命令行。
java -server -Xms4096m -Xmx4096m -XX:MetaspaceSize=100m -XX:MaxMetaspaceSize=100m -XX:MaxDirectMemorySize=512m -XX:MinMetaspaceFreeRatio=0 -XX:MaxMetaspaceFreeRatio=100 -XX:CompressedClassSpaceSize=20m -XX:InitialCodeCacheSize=50m -XX:ReservedCodeCacheSize=50m -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/tmp -Xloggc:/servers/logs/gc.log.2017-01-05-085234 -Djava.awt.headless=true -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dio.netty.leakDetectionLevel=simple -XX:MaxDirectMemorySize=512m -Dadmin.connectors.http.port=9000 -Dproxy.connectors.http.port=8080 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8654 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -server …
Run Code Online (Sandbox Code Playgroud)