这不是我第一次遇到编程语言中的时钟时间问题.基本上我通过在while循环中调用函数来测量函数的运行速度.问题是,由于某种原因,while循环运行的时间越长,经过的时间越来越短.谁能解释一下?代码如下.
DescriptiveStatistics stats = new DescriptiveStatistics();
while(true) {
long startTime = System.nanoTime();
executeSaxonXsltTransformation();
long stopTime = System.nanoTime();
long elapsedTime = stopTime-startTime;
stats.addValue((double)elapsedTime);
System.out.println(stats.getN()+" - "+elapsedTime+ " - "+stats.getMean());
}
Run Code Online (Sandbox Code Playgroud)
因此,经过大约1,000次运行后,经过的时间为750k至850k.但经过大约100,000次运行后,经过的时间降至580k至750k.通过观察平均值(stats.getMeans())可以最好地注意到持续减少,其中108k循环后平均值为〜632k,而3k循环平均值为~100万.切换到currentTimeMillis而不是nanoTime不会改变任何东西.
我\xe2\x80\x99m设置了一个新的JAVA服务器,堆大小设置为22G,并且将使用G1GC算法。我已经阅读了所有的oracle文档,并且相信这就是我们需要的,但仍然有几个问题:
\n1> -XX:G1HeapRegionSize 应该是什么?该数字必须是 2 的幂吗?如果是这样,我应该设置 8M 以获得 2816 个区域,还是设置 16M 以获得 1408 个区域?
\n2> 您认为我们应该显式设置 -XX:ParallelGCThreads 和 -XX:ConcGCThreads 吗?如果省略,是否会根据服务器逻辑处理器将它们设置为默认编号?或者只是设置为固定数字?
\n3> 下面的选项怎么样,有什么我错过的吗?由于这是我们第一次使用G1GC,所以我不知道是否需要设置其他G1相关选项,因为它们都有推荐的默认值。(在https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html中进行了描述中进行了描述)
\n// 常用选项
\n\n\n-Xms22G -Xmx22G -Xss1024K
\n
// G1 选项
\n\n\n-XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:G1HeapRegionSize=16
\n
// 日志
\n\n\n-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
\n-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:-PrintCommandLineFlags
\n
4> 你认为第一次有可能把事情做得大致正确吗?我的意思是没有内存溢出或耗尽。或者您认为我们总是需要更仔细地调整参数才能使事情正确几次?
\n5> 还有其他建议吗?
\n有点长,感谢您的阅读。任何帮助将不胜感激。谢谢你!
\n根据OpenJDK 的网站,可以将线程附加到 Hotspot(动态附加 API),该线程可以收集有关它的信息。我在互联网上找不到任何关于如何获取有关 Hotspot 内部数据结构的信息,例如操作数堆栈或字节码解释器的状态(以了解当前正在执行哪个字节码)或检索当前堆栈帧等的材料。
另外,如果动态连接 API 无法实现这一点,那么如何使用可服务性代理来完成此操作?我在互联网上找到的唯一示例是来自 Github 的要点,它展示了如何附加到正在运行的 JVM 并获取某些字段的值。那么如何访问JVM中的上述内部数据结构呢?
原始代码是:
public static int numberOfLeadingZeros(int i) {
// HD, Figure 5-6
if (i == 0)
return 32;
int n = 1;
if (i >>> 16 == 0) { n += 16; i <<= 16; }
if (i >>> 24 == 0) { n += 8; i <<= 8; }
if (i >>> 28 == 0) { n += 4; i <<= 4; }
if (i >>> 30 == 0) { n += 2; i <<= 2; }
n -= i …
Run Code Online (Sandbox Code Playgroud)