2010-09-06 36 views
8

通过两个不同的命令行调用java是否涉及两个不同的JVM或两个相同JVM的独立实例。JVM的实例

+3

你知不知道这两个答复都是等价的? – Riduidel 2010-09-06 14:53:52

+0

你应该更具体。 JVM对你有什么不同,是什么?你要求什么区别? – splash 2010-09-06 15:01:02

回答

21

JVM是Java虚拟机,它是加载类(代码)和共享对象(数据)的内存空间。 JVM相当于一个操作系统进程。

当您在命令行中输入java...时,您正在执行一个独立的进程,用于加载内存中的Java类,来自Java和您的基类(来自.class文件或指示的.jar)。

另一个java...命令将使用自己的内存加载一个不同的进程,并自行加载类。

实例词混淆:当你说'两个相同的JVM实例'。通常将一个JVM的实例表示为一个单独的进程,即一个加载的独立JVM。如果您说:两个进程正在运行JVM 1.5,那么它们是相同的JVM,但它们是不同的进程,不同的“实例”,在所有意义上都是独立的。

Web应用程序混淆: Web应用程序(例如)只是一堆实例化的类和对象,在Web服务器中出现一些URL。您可以使用10个不同的应用程序启动Tomcat - 即10个不同的类和对象,每个类都有不同的请求,但实际上它们共享相同的内存空间(OS进程)。一个webapp不能触及其他webapp的对象,因为没有人给它提供对其他对象的引用(并且类以某种方式被隐藏,但是这是另一个叫做class-loading的故事)。

1

你的问题有什么不同?我会说:两个不同的JVM实例。 :)

java命令的每次运行确​​实会调用新的JVM实例。正在运行的Java应用程序可以运行新的Java线程(就像Tomcat用Web应用程序做的那样)。

+0

你是说两者都是不同的JVM? – JavaUser 2010-09-06 14:54:45

+0

是的,在不同的过程意义上。 – splash 2010-09-06 14:56:09

+0

我怎么能感觉到这个..你有任何代码或概念来实现这一点? – JavaUser 2010-09-06 15:00:41

1

两个独立的JVM。你可以在同一个JVM中运行大量的东西(比如说由同一个Tomcat实例提供的10个webapps),但是只有一个java命令来启动tomcat。

+0

那么你为什么说两个不同的JVM? – JavaUser 2010-09-06 14:56:18

+0

因为2个java命令将导致2个JVM实例。相反,如果您只启动一次tomcat并部署10次战争......只有1个JVM正在运行 – bwawok 2010-09-06 17:13:31

1

如果您从它们的JDK/JRE 1.6版本的JDK/JRE版本1.6开始,使用相同的源路径两次启动Sun的java.exe,那么您将获得两个独立且不同的JVM实例。除非通过应用程序对其进行配置,否则它们之间不会共享。如果你想要两个不同的JVM运行,你必须从一个位置启动一个类型的java.exe(比如1.5),并从另一个位置启动一个java.exe(1.6版本)。

相关问题