JDK附带了java.exe(用于Windows)程序.您可以使用它从命令行启动程序.
维基百科说它是'类加载器','是类文件的解释器'.
这是真正的全面JVM吗?它是一个"更小,更轻巧"的JVM吗?还有别的吗?
我们的应用程序嵌入了JRE.该应用程序错误地附带了一个mashup(7.x版本的java.exe和8.x版本的其余JRE).
我可以确认运行v.1.7 java.exe的进程使用Process Explorer使用v.1.8 java运行时.我很惊讶运行时或二进制文件没有检测到异常并放弃JVM创建!
同样的含义是什么?安全问题 ?稳定性问题?我没有浏览java.exe的源代码.从我对java.exe二进制文件的初步调查,我可以看出它不仅仅是一个存根.除了USER32.dll,ADVAPI32.dll,COMCTL32.dll之外,它还调用了100种不同的KERNEL32.DLL API.
当然,我们可以(而且我们会)解决这个错误.但对于使用上述异常的几种当前生产系统是否有影响?如果是的话,他们是什么?
我写了一个Java程序,它会休眠一段时间:
package com.mycompany.app;
import java.lang.System;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
System.out.println("the current process's pid is " + ProcessHandle.current().pid());
try {
TimeUnit.SECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Hello World!"); // Prints the string to the console.
}
}
Run Code Online (Sandbox Code Playgroud)
我使用以下程序运行该程序:
$ java -cp target com.mycompany.app.Main
the current process's pid is 10172
Run Code Online (Sandbox Code Playgroud)
我检查了Ubuntu创建的运行它的过程:
$ pstree -pau -l -G -s 10172
systemd,1 splash
??lxterminal,3194,t
??bash,12150
??java,10172 -cp target com.mycompany.app.Main
??{java},10173
??{java},10174
??{java},10175
??{java},10176
??{java},10177
??{java},10178 …Run Code Online (Sandbox Code Playgroud) 我正在研究在一个简单的HelloWorldjava 程序上进行了哪些系统调用。通过一个简单的strace我注意到没有write电话,我发现这是可疑的:
...
mprotect(0x7f0bcd852000, 4096, PROT_READ) = 0
mprotect(0x7f0bce915000, 790528, PROT_READ) = 0
getpid() = 27931
munmap(0x7f0bcf6ac000, 174284) = 0
getpid() = 27931
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f0bcf5d6000
clone(child_stack=0x7f0bcf6d5fb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f0bcf6d69d0, tls=0x7f0bcf6d6700, child_tidptr=0x7f0bcf6d69d0) = 27932
futex(0x7f0bcf6d69d0, FUTEX_WAIT, 27932, NULLHello, World
) = 0
munmap(0x7f0bbfa6c000, 140063364) = 0
close(3) = 0
exit_group(0) = ?
+++ exited with 0 +++
Run Code Online (Sandbox Code Playgroud)
因此,正如您在上面看到的,在正常strace调用中,只会进行一次futex调用,该调用正在等待字符串地址。
因此,我strace使用-f参数运行以查看所有线程:
[pid 28249] pread64(3, …Run Code Online (Sandbox Code Playgroud) 我正在阅读一些有关JVM的文章,并发现了一些令人困惑的信息。
例如此处:http : //www.cs.cmu.edu/~jcarroll/15-100-s05/supps/basics/history.html
它说:“实际上,Java编译器通常被称为JVM编译器(对于Java虚拟机)”。
此外,如果Java编译器是否是JVM的一部分,我将找不到确切的答案。我知道JVM是解释器,但我读到它也进行了一些编译。而且,据我所知,JVM是JRE的一部分。JDK的javac部分和JDK的JRE部分。
那么javac是JVM的一部分吗?我认为不是,但是不确定。
在 Ubuntu 上,man jps说
jps - 列出目标系统上已检测的 Java 虚拟机 (JVM)。
“经过检测的 Java 虚拟机”是什么意思?
$ jps -v
29584 Jps -Dapplication.home=/usr/lib/jvm/java-11-openjdk-amd64 -Xms8m -Djdk.module.main=jdk.jcmd
Run Code Online (Sandbox Code Playgroud)
根据定义,jps 进程是 JVM 进程吗?
jps 是一个 ELF 文件,而不是从 Java 程序编译的 JVM 字节码程序:
$ file /usr/lib/jvm/java-11-openjdk-amd64/bin/jps
/usr/lib/jvm/java-11-openjdk-amd64/bin/jps: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=3f48c70ab711b493ee793c92c19b3a884896bb4d, stripped
$ jps -v
16462 Jps -Dapplication.home=/usr/lib/jvm/java-11-openjdk-amd64 -Xms8m -Djdk.module.main=jdk.jcmd
Run Code Online (Sandbox Code Playgroud)