Java 在System.out.println(“hello”)期间调用memcpy多少次?

Java 在System.out.println(“hello”)期间调用memcpy多少次?,java,operating-system,memcpy,Java,Operating System,Memcpy,我认为当常量字符串hello从Java HeapUser空间复制到内核空间时,会调用memcpy 我想还有更多,是吗?也许你可以自己调查一下。一个起点可以是 Foo.java 编译它 javac Foo.java 然后检查memcpy调用 输出 [pid 18509] write@SYS(1, "before", 6before) = 6 [pid 18509] libjvm.so->memcpy(0x7fc2325f7410, 0xf341dec0, 1, 0xc

我认为当常量字符串hello从Java HeapUser空间复制到内核空间时,会调用memcpy


我想还有更多,是吗?

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

Foo.java

编译它

javac Foo.java
然后检查memcpy调用

输出

[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

这完全取决于您的JVM,但答案将是很多。而且根本不涉及内核空间,根本没有。字符串被转换为字节,而字节不是memcpy。它通过JNI接口传递,JNI接口不是memcpy。它被传递给write函数,而write函数不是memcpy?我认为其中一些是独立于JVM的,并且肯定会发生,是吗?你认为为什么会有呢?为什么你需要知道?@Slaks内核不可能在不将字符放入内核空间的情况下打印字符。
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