小编daw*_*tar的帖子

如何在不破坏应用程序输出的情况下重定向JVM输出?

最近我正在编写一些微基准代码,所以我必须打印出JVM行为以及我的基准信息.我用

-XX:+PrintCompilation
-XX:+PrintGCDetails
Run Code Online (Sandbox Code Playgroud)

以及获取JVM状态的其他选项.对于基准信息,我只是使用System.out.print()方法.因为我需要知道我打印的消息的顺序和JVM输出.

当我在控制台中打印它们时,我可以得到很好的结果,虽然JVM输出有时会撕掉我的消息,但由于它们处于不同的线程中,因此它是可以理解和可接受的.

当我需要做一些批次的基准,我想redirect the output into a filepipe (> in Linux system),并使用Python从文件中获取结果,并进行分析.

这是问题所在:

The JVM output always overlapped with the messages I printed in the Java application. 它破坏了消息的完成.

知道如何应对这种情况吗?我需要both the JVM output and application output in the same place in order to preserve the sequence because it is important. And they do not overlap on each other so I don't lose anything.

python java linux jvm

18
推荐指数
3
解决办法
5000
查看次数

如何在C和java中生成cpu缓存效果?

在Ulrich Drepper的论文中,每个程序员应该了解内存,第三部分:CPU缓存,他显示了一个图表,显示了"工作集"大小与每个操作消耗的cpu周期之间的关系(在这种情况下,顺序读取).并且图中有两个跳转,表示L1缓存和L2缓存的大小.我编写了自己的程序来重现c中的效果.它只是简单地从头到尾顺序读取一个int []数组,我尝试了不同大小的数组(从1KB到1MB).我将数据绘制成图形并且没有跳跃,图形是直线.

我的问题是:

  1. 我的方法有问题吗?生成cpu缓存效果的正确方法是什么(查看跳转).
  2. 我在想,如果它是顺序读取,那么它应该像这样操作:当读取第一个元素时,它是缓存未命中,并且在缓存行大小(64K)内,将有命中.借助预取,将隐藏读取下一个缓存行的延迟.它会连续地将数据读入L1缓存,即使工作集大小超过L1缓存大小,它也会驱逐最近最少使用的数据,并继续预取.因此,大多数缓存未命中都将被隐藏,从L2获取数据所消耗的时间将隐藏在读取活动之后,这意味着它们同时运行.相关性(在我的情况下是8路)将隐藏从L2读取数据的延迟.那么,我的节目现象应该是对的,我错过了什么吗?
  3. 是否有可能在java中获得相同的效果?

顺便说一句,我在linux中这样做.


编辑1

感谢Stephen C的建议,这里有一些额外的信息:这是我的代码:

int *arrayInt;

void initInt(long len) {
    int i;
    arrayInt = (int *)malloc(len * sizeof(int));
    memset(arrayInt, 0, len * sizeof(int));
}

long sreadInt(long len) {   
    int sum = 0;
    struct timespec tsStart, tsEnd;

    initInt(len);

    clock_gettime(CLOCK_REALTIME, &tsStart);
    for(i = 0; i < len; i++) {
        sum += arrayInt[i];
    }
    clock_gettime(CLOCK_REALTIME, &tsEnd);
    free(arrayInt);
    return (tsEnd.tv_nsec - tsStart.tv_nsec) / len;
}
Run Code Online (Sandbox Code Playgroud)

在main()函数中,我尝试过从1KB到100MB的数组大小,仍然相同,每个元素的平均耗时为2纳秒.我认为时间是L1d的访问时间.

我的缓存大小:

L1d == 32k

L2 == 256k

L3 == …

c java linux cpu-cache

8
推荐指数
1
解决办法
4904
查看次数

为什么HotSpots编译日志时间与ManagementFactory.getRuntimeMXBean().getUptime()不同?

当我用参数启动JVM时

-XX:+PrintCompilation
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

 60    1             java.lang.String::hashCode (55 bytes)
 74    2             sun.nio.cs.UTF_8$Encoder::encode (361 bytes)
Run Code Online (Sandbox Code Playgroud)

第一列是以毫秒为单位的时间戳,当打印日志时,我想将此时间戳与返回的值进行比较ManagementFactory.getRuntimeMXBean().getUptime():

long jvmUpTime = ManagementFactory.getRuntimeMXBean().getUptime();
Run Code Online (Sandbox Code Playgroud)

要么

long jvmStartTime = ManagementFactory.getRuntimeMXBean().getStartTime();
Run Code Online (Sandbox Code Playgroud)

但我的结果是这样的:

[62:log from Java code]
103    5             benchmark.AbstractBenchmarkST::benchmark (82 bytes)
[62:log from Java code]
Run Code Online (Sandbox Code Playgroud)

似乎它们之间有大约40毫秒的差异,这使得两个时间戳无法比拟.任何想法如何处理这个?

java benchmarking jvm jvm-hotspot

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

在哪里可以找到如何计算java对象大小的证据

我已经搜查约了很久的Java对象的大小,也有很多类似的答案这样,每个人都告诉我,一个Java对象的开销的大小,以及如何计算出来的实际大小.但他们怎么知道呢?我没有从官方的oracle文件中找到任何证据.这个结论有什么证据?或者数据来自一些基于某些实验的猜测?

另一件事.据官方文档,有一个"近似"的方式来测量物体中提到-的仪表方式,任何人可以向我解释什么是"约"的意思?什么时候准确,什么时候不准确.最好有证据.

java memory size jvm object

2
推荐指数
1
解决办法
840
查看次数

标签 统计

java ×4

jvm ×3

linux ×2

benchmarking ×1

c ×1

cpu-cache ×1

jvm-hotspot ×1

memory ×1

object ×1

python ×1

size ×1