每个应用程序如何创建 JVM 实例?
How is JVM instance created per application?
我知道每个 java 进程 运行 在它自己的 JVM 中。例如,当我在我的机器上 运行 jcmd
时,我看到
21730 sun.tools.jcmd.JCmd
77558 /usr/local/opt/jenkins-lts/libexec/jenkins.war --httpListenAddress=127.0.0.1 --httpPort=8080
99974
99983 org.jetbrains.jps.cmdline.Launcher /Applications/IntelliJ IDEA.app/Contents/lib/asm-all-7.0.1.jar:/Applications/IntelliJ IDEA.app/Contents/lib/lz4-java-1.6.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aether-connector-basic-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/plexus-utils-3.0.22.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aether-api-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/javac2.jar:/Applications/IntelliJ IDEA.app/Contents/lib/util.jar:/Applications/IntelliJ IDEA.app/Contents/lib/platform-api.jar:/Applications/IntelliJ IDEA.app/Contents/lib/qdox-2.0-M10.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jna.jar:/Applications/IntelliJ IDEA.app/Contents/lib/trove4j.jar:/Applications/IntelliJ IDEA.app/Contents/lib/nanoxml-2.2.3.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jdom.jar:/Applications/IntelliJ IDEA.app/Contents/lib/netty-common-4.1.41.Final.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aet
如何为每个应用程序创建 JVM?就像我用 java -jar jenkins.war
启动 jenkins 时会发生什么。某些进程是否从 JRE 文件夹复制 JVM 内容并初始化 JVM 实例?
当您启动像 java
这样的程序时,操作系统会创建一个“进程”。进程代表一个实时的 运行ning 程序。进程概念允许您同时 运行 程序的多个副本。每个进程都有自己的私有内存 space 和系统资源,如打开的文件或网络连接。每个进程都可以加载一组不同的动态链接库。对于 Java,大部分 jvm 都是在共享库中实现的,启动程序“java”在 运行 时加载。
细节是 OS 相关的并且会很快变得复杂。
进程启动时发生的事情之一是可执行文件被映射到内存中。 CPU 无法执行磁盘或其他外部存储器上的指令,因此必须先将程序“text”从磁盘复制到主存中。将文件映射到内存可以简化这一过程并提高效率:如果 CPU 需要访问实际上不在 RAM 中的内存位置,内存管理器单元 (MMU) 会发出“页面错误”。页错误导致数据被加载到 RAM 中。这比简单地将程序文本复制到 RAM 中更有效(如果不是所有的文本都一直需要的话会怎么样)并且还简化了整个系统(其他 OS 功能已经需要虚拟内存系统)
我知道每个 java 进程 运行 在它自己的 JVM 中。例如,当我在我的机器上 运行 jcmd
时,我看到
21730 sun.tools.jcmd.JCmd
77558 /usr/local/opt/jenkins-lts/libexec/jenkins.war --httpListenAddress=127.0.0.1 --httpPort=8080
99974
99983 org.jetbrains.jps.cmdline.Launcher /Applications/IntelliJ IDEA.app/Contents/lib/asm-all-7.0.1.jar:/Applications/IntelliJ IDEA.app/Contents/lib/lz4-java-1.6.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aether-connector-basic-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/plexus-utils-3.0.22.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aether-api-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/javac2.jar:/Applications/IntelliJ IDEA.app/Contents/lib/util.jar:/Applications/IntelliJ IDEA.app/Contents/lib/platform-api.jar:/Applications/IntelliJ IDEA.app/Contents/lib/qdox-2.0-M10.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jna.jar:/Applications/IntelliJ IDEA.app/Contents/lib/trove4j.jar:/Applications/IntelliJ IDEA.app/Contents/lib/nanoxml-2.2.3.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jdom.jar:/Applications/IntelliJ IDEA.app/Contents/lib/netty-common-4.1.41.Final.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/java/lib/aet
如何为每个应用程序创建 JVM?就像我用 java -jar jenkins.war
启动 jenkins 时会发生什么。某些进程是否从 JRE 文件夹复制 JVM 内容并初始化 JVM 实例?
当您启动像 java
这样的程序时,操作系统会创建一个“进程”。进程代表一个实时的 运行ning 程序。进程概念允许您同时 运行 程序的多个副本。每个进程都有自己的私有内存 space 和系统资源,如打开的文件或网络连接。每个进程都可以加载一组不同的动态链接库。对于 Java,大部分 jvm 都是在共享库中实现的,启动程序“java”在 运行 时加载。
细节是 OS 相关的并且会很快变得复杂。
进程启动时发生的事情之一是可执行文件被映射到内存中。 CPU 无法执行磁盘或其他外部存储器上的指令,因此必须先将程序“text”从磁盘复制到主存中。将文件映射到内存可以简化这一过程并提高效率:如果 CPU 需要访问实际上不在 RAM 中的内存位置,内存管理器单元 (MMU) 会发出“页面错误”。页错误导致数据被加载到 RAM 中。这比简单地将程序文本复制到 RAM 中更有效(如果不是所有的文本都一直需要的话会怎么样)并且还简化了整个系统(其他 OS 功能已经需要虚拟内存系统)