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. LearnMVC5-GettingStarted

    原创文章,转载必需注明出:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learnmvc5-gettingstarted/ 本人是 ...

  2. msql_DDL_创建table

    • 语法: create table 表名(• 列名1 列类型 [<列的完整性约束>],• 列名2 列类型 [<列的完整性约束>],• ... ... ); • PRIMARY ...

  3. codeforces 675E E. Trains and Statistic(线段树+dp)

    题目链接: E. Trains and Statistic time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  4. poj 3728 The merchant 倍增lca求dp

    题目: zdf给出的题目翻译: 从前有一个富饶的国度,在这里人们可以进行自由的交易.这个国度形成一个n个点的无向图,每个点表示一个城市,并且有一个权值w[i],表示这个城市出售或收购这个权值的物品.又 ...

  5. 10 Best TV Series Based On Hacking And Technology

    Technology is rapidly becoming the key point in human lives. Here we have discussed top TV shows whi ...

  6. Entityframework Code First 系列之数据注释

    上一篇<Entityframework Code First 系列之项目搭建>讲了搭建一个Code First的控制台项目.里面有一些内容并没有扩展出来讲,因为篇幅有限.这篇针对上面内容中 ...

  7. Ajax上传文件进度条显示

    要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...

  8. windows下,python+scrapy环境搭建

    •安装lxml(官网给出的地址http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml,下载whl文件安装) •安装zope.interface https:// ...

  9. DWZ (JUI) 教程 table 排序

    dwz排序是后台排序,不是前台的js排序,他的流程和搜索,分页是一样的,当你点击排序的按钮时,从新发送请求刷新当前的navTable 和 dialog. <th width="60&q ...

  10. sql server 锁学习

    insert 默认加的锁是 不允许select,update  但是可以insert update 默认加的锁是 不允许 update 可以 select ,insert