1.jre:java运行环境 提供一个JVM和一些基础类库。
2.只安装jre以后,机器就具备了运行java程序的条件。但是不具备开发java程序的条件。安装JDK以后,在c:/program files/java/下有一个jre,在c:/program files/java/jdk/jre下还有一套jre,也就是说安装完jdk后系统出现了两套jre,这是为什么呢?
答案:JDK中的很多工具(如javac java)都是使用java本身开发的,这些工具都位于jdk安装目录\tools.jar中,因此要有一个JRE环境支持这些工具的运行,jdk目录下的那套jre就是为支持这些工具运行的。

既然系统中有两套jre,那么由谁来决定使用那一套呢?这个任务落在了java.exe身上。
当在命令行输入java.exe命令执行一个java程序时,它会安装下面方式来寻找合适的JRE:
1.首先查找自己的目录是否有JRE。
2.查看父目录是否有JRE。
3,查询系统配置(如在 windows系统中,查看注册表中的HKEY_LOCAL_MACHINE\software\java\Java Runtime Environment项目)

3.JVM Java Virtual Machine(java虚拟机) 它是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。java虚拟机有自己完善的硬件架构,如处理器,堆栈,寄存器等,还具有相应的指令系统。

JVM屏蔽了与具体操作系统平台相关的信息,使得java程序只需要生成在java虚拟机上运行的目标代码,就可以再多种平台上不加修改地执行。

JVM的结构: JVM主要包含两个子系统和两个组件。两个子系统分别是Class loader子系统和Execution engine(执行引擎)子系统;两个组件分别是Runtime data area(运行时数据区域)组件和Native interface(本地接口)组件。

1.Class loader子系统的作用:根据给定的全限定名类名(如:java.lang.Object)来装载class文件的内容到Runtime data area中的method area(方法区域).java程序员可以extends java.lang.ClassLoader类来写自己的Class loader(一般一些大的J2EE中间件都会提供自己的类加载器 如WebLogic tomcat).(相当于计算机中的I/O系统)
2.Execution engine子系统的作用:执行classes中的指令。任何JVM sepcification实现(JDK)的核心都是Execution engine,不同的JDK例如Sun的JDK和IBM的JDK好坏主要就取决于他们各自实现的Execution engine的好坏。(这部分相当于JVM的CPU)
3.Native Interface组件:与native libraries交互。是与其他语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也容易出现JVM无法控制的native heap OutOfMemory.(这部分可以想象成JVM的外设接口)
4.Runtime Data Area组件:这就是我们常说的JVM的内存了。它主要分为五个部分:
a.HEAP堆内存:用来存放java实例对象。
b.Method Area方法区:被装载的java类信息也就是字节码信息存放于此。
c.Java Stack栈空间:用于存放每个运行的Java线程的局部变量,操作数,中间结果,以及执行上下文信息(JDK5.0之前大小为256K,之后为1M)。
d.Program Count程序计数器:每一个java线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行 指令的地址,这里的地址可以是一个本地指针,也可以使在方法区中相对于应用该方法起始指令的偏移值。
e.Native Method Stack本地方法栈:保存本地方法进入区域地址。
以上五部分只有Heap和Method Area是被所有线程共享使用的,而Java stack,Program counter和Native method stack是以线程为粒度的,每个线程独自拥有自己的部分。

【Java的类加载器】
Java语言室一种先天具备动态性的语言。之所以具备动态性正是由于Java类装载器的存在。
1.类加载器的两种装载方式: 预先载入和按需载入
通常基础类库需要预先载入(常驻内存 GC不会回收) 自定义类库需要按需载入(使用时载入,使用完毕有垃圾收集器负责释放)
小技巧:可以通过java -verbose:class查看命令在执行时,JVM都加载了哪些类。

java的JVM机制的更多相关文章

  1. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  2. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  3. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  4. 深入解析java虚拟机-jvm运行机制

    转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...

  5. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  6. Java虚拟机JVM内存分区及代码执行机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt230 1.  JVM体系结构 图1 JVM体系结构    方法区:存放JVM ...

  7. 【JVM】深度分析Java的ClassLoader机制(源码级别)

    原文:深度分析Java的ClassLoader机制(源码级别) 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()方法. 源码分析 public abst ...

  8. Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  9. java的锁机制

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...

随机推荐

  1. (转)WIN7更改用户名访问共享文件夹

    原文地址: http://ryy8013.blog.163.com/blog/static/71729589201210610533778/ 一直以来,windows7客户端访问windows ser ...

  2. VC++ UTF-8与GBK格式转换

    // 注释:多字节包括GBK和UTF-8 int GBK2UTF8(char *szGbk,char *szUtf8,int Len) { // 先将多字节GBK(CP_ACP或ANSI)转换成宽字符 ...

  3. Interesting Applications in Machine Learning and Computer Vision

    1.Visually Indicated Sounds 网址:http://vis.csail.mit.edu/ 通过视频预测敲打的声音 2.AI Porn Video Editor 代码网址:htt ...

  4. Git之忽略文件(ignore file)

      1.    环境 Windows XP SP3 + TortoiseGit + msysGit 2.  ignore files的三种方法 以下涉及的ignore文件均为如下格式: # 以'#'开 ...

  5. au3 制作自动安装wps 特别是:控件下的edit 要修改路径

    #RequireAdmin#Region ;**** 由 AccAu3Wrapper_GUI 创建指令 ****#AccAu3Wrapper_Icon=bitbug_favicon (2).ico#A ...

  6. 【SNMP】SNMP概述

    SNMP概述 SNMP(Simple Network Management Protocol,简单网络管理协议)是目前UDP/IP网络中应用最为广泛的网络管理协议,它提供了一个管理框架来监控和维护互联 ...

  7. 第六十七篇、OC_UITableView head下拉图片放大的效果

    (一) 布置UITableview 我们首先要通过设置UITableview的内容偏移 self.tableView.contentInset 来为图片视图留出位置,这里我们的图片高度暂定为280 ; ...

  8. CookieHelper JS封装Cookie 存取方法

    微信的一些页面会去获取授权,然后在回调到页面,但是这样的话通过url传递的参数有可能丢失掉,我采用存储cookie的方式来传值 建一个CookieHelper.js文件 function Cookie ...

  9. Row_Number实现分页(适用SQL)

    1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2:再查询该集合的 第 1 ...

  10. jqure 获取地址栏的参数

    从一个页面跳转到另外一个页面传参,我们用jqure得到参数需要两部分: 处理浏览器地址栏参数的方法: function GetQueryString(name) { var reg = new Reg ...