JVM原理

说JVM之前先来说一下Java中的堆和栈。
1:数据类型
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型

基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

1)基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress

2)引用类型包括:类类型,接口类型和数组。

2:堆与栈
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。
在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。

第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。

第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。

第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。
堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。

堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。


一:JVM的生命周期
1:JVM实例对应了一个独立运行的java程序它是进程级别
启动一个Java程序时,一个JVM实例就产生了,任何一个拥有
public static void 
main(String[] args)函数的class都可以作为JVM实例运行的起点

2.JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的

二、JVM的体系结构
1:类加载器(classloader)
用来加载.class文件
2:执行引擎
执行字节码或本地方法(native)
3:数据区
方法区,寄存器,堆,栈,本地方法栈

三:类加载器
classloader抽象类提供了几个关键的方法。
例如,
1)loadclass
此方法负责加载指定名字的类。
2)findClass,作用与loadclass相同。
3)defineclass
此方法负责将二进制的字节码转换为CLASS对象

四:执行引擎
JVM通过执行引擎来完成字节码的执行。
反射的关键是要实现动态的调用,最明显的方法就是动态的生成字节码,加载到JVM中并执行。
Class actionClass = Class.forName(xxxx);
调用本地方法,使用调用者所在的ClassLoader来加载Class对象
Method method = actionClass.getMethod("execute",null);
校验Class是否为public,以确定类的执行权限。没有则抛出异常。
Object action = actionClass.newInstance();
执行构造器对象的newinstance方法。
method.invoke(action,null);
五:数据区
1)PC寄存器
存储每个线程下一步将执行的JVM指令,如该方法为native,则不存任何信息。
2)JVM栈
JVM栈是私有的,每个线程创建的同时都会创建栈,JVM栈中存放的为当前线程中局部变量(八中基本类型和非基本类型的引用)
3)堆
JVM用来存储对象实例以及数组值的区域。

你可能感兴趣的:(jvm)