通过两个不同的命令行调用java是否涉及两个不同的JVM或两个相同JVM的独立实例。
答案 0 :(得分:23)
JVM是Java虚拟机,一种加载类(代码)和共享对象(数据)的内存空间。 JVM等同于操作系统进程。
当您在命令行中键入java...
时,您正在执行一个独立的进程,该进程在内存中加载Java类,Java和您的基类(来自.class文件或.jar)。
另一个java...
命令将使用自己的内存加载不同的进程,并自行加载类。
实例字混淆:当你说'同一个JVM的两个实例'时。通常将JVM的实例称为单独的进程,它是一个加载的独立JVM。如果你说:两个进程正在运行JVM 1.5,那么,它是相同的JVM,它是相同的版本,但它们是不同的进程,不同的“实例”,在所有意义上都是独立的。
Webapp混淆:一个webapp(通过示例)只是一组实例化的类和对象,参与Web服务器中的某些URL。您可以使用10个不同的应用程序启动Tomcat - 即10个不同的类和对象,每个类都参与不同的请求,但实际上它们共享相同的内存空间(操作系统进程)。 webapp无法触及其他webapp的对象,因为没有人给它引用其他对象(并且这些类在某种程度上是隐藏的,但这是另一个故事:class-loading)。
答案 1 :(得分:2)
你的问题有什么不同?我会说:两个不同的JVM实例。 :)
java
命令的每次运行都会调用一个新的JVM实例。正在运行的java应用程序可以运行新的Java Threads(就像Tomcat对Web应用程序一样)。
答案 2 :(得分:2)
答案 3 :(得分:1)
两个独立的JVM。你可以在同一个JVM中运行很多东西(比如说同一个Tomcat实例提供的10个webapp),但是只有1个java命令可以启动tomcat。
答案 4 :(得分:1)
如果您从同一源路径中的JDK / JRE版本1.6启动Sun的java.exe两次,您将获得两个独立且不同的JVM实例。除非您通过应用程序进行配置,否则它们之间不会共享。如果你想要运行两个不同的JVM,你必须从一个位置启动一个类型的java.exe(比如说1.5),而从另一个位置启动一个java.exe(版本1.6)。