博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java的JVM机制
阅读量:5217 次
发布时间:2019-06-14

本文共 2071 字,大约阅读时间需要 6 分钟。

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都加载了哪些类。

转载于:https://www.cnblogs.com/fjhh/p/5370617.html

你可能感兴趣的文章
转载--文章(感谢米粒儿博主分享) 关于 Json.net序列化时间问题
查看>>
冲刺第一阶段总结
查看>>
《启示录:打造用户喜爱的产品》—— 读书笔记
查看>>
剑指OFFER之重建二叉树(九度OJ1385)
查看>>
DL中epoch、batch等的意义【转载】
查看>>
纯c 2048
查看>>
Android分包原理
查看>>
田维经典语录(二)
查看>>
js模板引擎——artTemplate的使用问题
查看>>
双端队列
查看>>
JS事件冒泡
查看>>
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
查看>>
台达PLC modbus 不支持04功能码
查看>>
python学习笔记--装饰器
查看>>
0603 分页存储过程 思维导图
查看>>
Sqlmap与burpsuite动态更新某些参数
查看>>
发布一个JavaScript工具类库jutil,欢迎使用,欢迎补充,欢迎挑错!
查看>>
20180315 代码错题(5)
查看>>
多线程死锁
查看>>
HDU 5671 Matrix
查看>>