一台机器上java虚拟机会存在多少个?

一直以来,我都认为,每台电脑上java虚拟机只存在一个;如果你启动多个java程序,这些程序都在一个虚拟机中运行。这是常规的想法,就像我们自己的电脑,电脑只有一台,可以跑很多个程序。
如果说有多个java虚拟机,显然说法有问题。

诸如此类的疑问;
在一台机器上启动两个tomcat,会有几个java虚拟机?
再如在elcipse中run一个main方法,会单独开一个java虚拟机吗?
执行一个class文件,会单独开一个java虚拟机吗?

下面来看一下实际情况;

Java 程序本质上是 class 文件描述的字节码,字节码的是在 JVM 中 执行 的。
每个 Java 进程都是一个 JVM 实例。
一旦程序结束,JVM 实例也就销毁了。

所以以java命令启动的,都会新增一个jvm进程;
所以:
1.启动2个tomcat,内部是java启动,会有2个jvm进程;
2.eclipse中的run,内部是java启动,会单独开一个jvm进程;
3.执行class文件,如果是java去执行就会开,如果仅仅使用现有jvm进程来load就不会增加;

实际情况是:运行多个java程序,没有多个java虚拟机,有多个java虚拟机的实例

有如下一段英文描述;

jvm实例的个数
Generally speaking, each application will get its own JVM instance and its own OS-level process and each JVM instance is independent of each other.

There are some implementation details such as Class Data Sharing, where multiple JVM instances might share some data/memory but those have no user-visible effect to the applications (except for improved startup time, hopefully).

A common scenario however is a single application server (or "web server") such as Glassfish or Tomcat running multiple web applications. In this case, multiple web applications can share a JVM.
    第一句话说:一般而言,每个应用程序将有它自己的JVM实例......

一个java的应用程序对应于一个JVM实例,当一个java程序运行的时候,一个jvm实例就诞生了;

下面来做小程序验证一下;
做3个小程序,代码如下;

public class test1 {
public static void main(String[] args) throws InterruptedException {while (true) {System.out.println("application 111");Thread.sleep(1000);}}
}public class test2 {
public static void main(String[] args) throws InterruptedException {while (true) {System.out.println("application 222");Thread.sleep(1000);}}
}public class test3 {
public static void main(String[] args) throws InterruptedException {while (true) {System.out.println("application 333");Thread.sleep(1000);}}
}

同时运行3个java程序;

看一下任务管理器;有3个java.exe;并不是 test1,test2, test3 3个程序;看这3个java.exe的描述,是一样的,Java(TM) Platform SE binary;

结束test2程序;java.exe少了一个;

如果都结束,3个java.exe都消失;

也就是;

每一个java程序对应一个jvm实例,都有自己的程序执行空间,每一个都有一套jvm虚拟机机制

一个java程序对应一个jvm实例,一个jvm对应一个堆;

堆内存用来存放运行时创建的对象。一般来讲,通过 new 关键字创建出来的对象都存放在堆内存中。由于 JVM 是基于堆栈的虚拟机,而每个 Java 程序都运行在一个单独的 JVM 实例上,每一个实例唯一对应一个堆,一个 Java 程序内的多个线程也就运行在同一个 JVM 实例上,因此这些线程之间会共享堆内存,鉴于此,多线程在访问堆中的数据时需要对数据进行同步。

java虚拟机有多种实现版本;java -version命令中可以看到java虚拟机的名称;

Java HotSpot<TM> 64-Bit Server VM,这个是java虚拟机的名字;

一台机器上有几个java虚拟机相关推荐

  1. 在多台机器上搭建Hadoop的分布式环境

    2019独角兽企业重金招聘Python工程师标准>>> 分布式环境搭建之环境介绍 之前我们已经介绍了如何在单机上搭建伪分布式的Hadoop环境,而在实际情况中,肯定都是多机器多节点的 ...

  2. window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法

    window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装 ...

  3. 更改多个版本java_window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法...

    window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装 ...

  4. php和mysql不在一台机器上_MySQL_在同一台机器上运行多个 MySQL 服务,**************************************** - phpStudy...

    在同一台机器上运行多个 MySQL 服务 ********************************************************** 第一部分, 在一台服务器构建多mysql ...

  5. 用户信息检索另一台服务器,客户机上一用户访问另一台机器上的informix数据库...

    客户机上一用户访问另一台机器上的informix数据库[@more@] ip=126 : informix 数据库服务器(INFORMIXSERVER 为 primary_ins1) ip=64 : ...

  6. 一台机器上运行多个ActiveMq

    2019独角兽企业重金招聘Python工程师标准>>> 由于业务需要一台机器上运行多个ActiveMq,这里主要说一下有什么地方不重复: 1.brokerName名称不能重复 2.端 ...

  7. 多个php一个机器,如何利用docker在同一台机器上搭建多套php开发环境?

    首先是一个容器要包含完整的程序加依赖(出去中间件),拿 LNMP 举例子:docker 提供的是 Linux 环境,容器中要包含 Nginx 和 Php,然后再单独部署一个 MySQL 其次,如果多个 ...

  8. 在同一台机器上启动多个JBoss A-MQ JVM

    因此,我最近没有写过博客-只是很忙. 但是,我新年的决心是写一些博客,分享一些我经常遇到的事情,即使这些简单的事情可能会帮助一些人. 因此,对于本条目,我将展示一种在单台机器上启动多个JBoss A- ...

  9. 同一台机器上安装2个SDE服务

    同一台机器上安装2个SDE服务 环境:Windows Server 2008 R2 x64+Oracle 10g+ArcSDE 9.3 适用于数据库中SDE表空间以及SDE用户已经创建. 1:拷贝C: ...

最新文章

  1. Android -- 程序启动画面 Splash
  2. 震旦ad208如何进入维修模式_今天才知道!华为手机维修时要开启这个功能,防止隐私被他人查看...
  3. spring mvc logback
  4. diskgenius linux版_纯净版Windows10系统安装详细教程
  5. npm学习(二)之如何防止权限错误
  6. Android开发之代码开发部分字符串变色
  7. u-boot移植随笔:u-boot的内存分布图
  8. [D3] Start Visualizing Data Driven Documents with D3 v4
  9. htmlspecialchars_decode 与 html_entity_decode
  10. Linux操作系统——进程管理
  11. Face photo recognition using sketch (人脸画像合成)
  12. 计算机D盘无法读取,D盘目录或文件被损坏且无法读取的愿意以及解决办法
  13. 3线spi屏幕驱动方式
  14. Pull Request 的概述
  15. java设计模式--装饰器设计模式(javaIO设计使用)
  16. android 扫描二维码支付,Android 扫码盒子全局接收付款码(全局事件上层接收多重下发)...
  17. 【本人秃顶程序员】Java程序员,你会选择25k的996还是18k的965?
  18. 【解决方案 二十六】DateGrip一键生成DML语句用于上线
  19. CPC客户端补正申请书提交
  20. 如何优化cocos2d/x程序的内存使用和程序大小【第一部分】

热门文章

  1. 对Tensor结果使用opencv2中的操作
  2. 异步任务AsyncTask
  3. 硬盘安装Windows 7和Ubuntu 10.04双系统
  4. automation服务器不能创建对象是什么意思_从运营商角度来考虑为什么NAT不能搭建服务器?...
  5. Java Vector与ArrayList的区别
  6. Java 技术篇-使用IDEA开发java代码实例演示,IntelliJ IDEA的安装与使用
  7. POJ1787多重背包中在最优方案下输出具体的选择方案
  8. [YTU]_2918( Shape系列-4)
  9. 计算机技术停滞,究竟什么原因让科技停滞不前呢?
  10. Jupyter不要自动启动浏览器(Firefox)