【问题标题】:How many times memcpy is called during System.out.println("hello")?在 System.out.println("hello") 期间调用 memcpy 多少次?
【发布时间】:2017-12-02 13:19:10
【问题描述】:

我认为当常量字符串“hello”从 Java 堆(用户空间)复制到内核空间时会调用 memcpy。

我认为还有更多,是吗?

【问题讨论】:

  • 这完全取决于您的 JVM,但答案将是“很多”。而且根本不涉及内核空间。
  • 没有。该字符串被转换为字节,这不是 memcpy。它通过 JNI 接口传递,这不是 memcpy。它被传递给write() 函数,它不是一个memcpy。
  • 你能列出其中的一些吗?我认为其中一些与 JVM 无关并且肯定会发生,是吗?
  • 你为什么认为有任何?为什么你需要知道?
  • @Slaks 内核不可能打印字符而不将它们放入内核空间。

标签: java operating-system memcpy


【解决方案1】:

也许你可以自己调查一下。起点可以是

Foo.java

class Foo {
    public static void main(String[] args) {
        System.out.println("before");
        System.out.println("hello world");
    }
}

编译

javac Foo.java

然后检查memcpy 调用

ltrace -f -S -e memcpy java Foo 2>&1 \
    | sed -n "/before/,/hello/ {/\(before\|hello\|>memcpy\)/p}"

输出

[pid 18509] write@SYS(1, "before", 6before)            = 6
[pid 18509] libjvm.so->memcpy(0x7fc2325f7410, 0xf341dec0, 1, 0xc0100800 ...
[pid 18509] libjvm.so->memcpy(0x7fc2325f73b0, 0xf341dec0, 11, 0xc0100800 ...
[pid 18509] write@SYS(1, "hello world", 11hello world)      = 11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2019-08-13
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多