文章目录
1、
JVM含义:
JRE是由Java API和JVM组成的。JVM的主要作用是通过Class Loader来加载Java程序,并且按照Java API来执行加载的程序。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。简单的说就是在内存中分出一块区域给JVM,JVM就是模拟真正计算机的功能。
我们在编辑器编辑Java代码时,运行main方法,会把我们的代码转换成.class的字节码文件(二进制),jvm就执行这些字节码文件,在通过解释器向平台输出,就可以在多种平台上不加修改地运行。不同的操作系统对应的解释器不一样,解释器就是为了让java实现跨平台。
(注意:java并不是能跨所有的平台,只是支持现有的大多数平台,像中国自己银河麒麟系统java也是支持的,因为银河麒麟基本上就是linux系统来的。但是如果是一个新的系统,JAVA解释器不支持的话,那么就无法在这个平台上操作了。)
JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码
和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。
Jvm定义了控制java代码解释执行和具体实现的五种规格:1、jvm指令系统;2、jvm寄存器;3、jvm栈结构;4、jvm碎片回收堆;5、jvm存储区
2.Jvm原理
jvm原理如
jvm执行过程如下图所示:
JVM是java的核心和基础,jvm是处于java编辑器和os平台之间的虚拟处理器。Jvm是一种基于下层操作系统和硬件平台并利用软件方法实现的抽象的
计算机,可以在上面执行字节码文件。
执行过程:
(1)最开始是编辑器生成JVM能识别的.class文件
(2)运行类加载机制
加载.class文件到内存中,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的java类型的全过程。
1)加载:将.class文件加载到内存,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成代表这个类的java.lang.Class的对象,作为 方法区类数据的访问入口,这个过程需要类加载器的参与。
2)链接:将java的二进制代码合并到JVM的过程;
验证:确保加载的类信息符合JVM规范,不存在安全问题;
准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配;
解析:虚拟机常量池的符号引用替换为字节引用过程;
3)初始化
初始化阶段是执行类构造器()方法的过程。类构造器()方法是由编译器自动收藏类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生;
当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初 始化;
虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步;
当范围一个Java类的静态域时,只有真正声名这个域的类才会被初始化;
Eg:加载机制示例:
代码如下
public class Demo01 {
public static void main(String[] args) {
A a = new A();
System.out.println(a.width);
}
}
class A{
public static int width=100; //静态变量,静态域 field
static{
System.out.println(“静态初始化类A”);
width = 300 ;
}
public A() {
System.out.println(“创建A类的对象”);
}
}
分析图:
说明:
内存中存在着栈,堆,方法区(特殊的堆)
1、JVM在加载Demo1时,现在方法区中产生Demo1对应的静态静态数据,同时在堆中产生一个java.lang.class的对象,用来代表Demo1类,然后通过对象可以访问类的二进制结构;
2、Main方法在执行时产生一个main方法的栈帧,一个方法对应一个栈帧,当main方法中调用其他方法时,会在栈里挨个往里压。
(注:每当启动一个新线程的时候,Java虚拟机都会为它分配一个java栈。java以栈帧为单位保存线程的运行状态。虚拟机只会对java栈执行两种操作:以栈帧为单位的压栈或者出栈。
java方法可以通过两种方式完成,一种通过return返回,成为正常返回;一种通过抛出异常而异常终止 。虚拟机都会将当前栈弹出java栈然后释放掉,这样上一个方法的栈帧就是当前栈帧了。
java栈上是此对应的java线程所私有的。因此不存在多线程情况下栈数据访问同步的问题。)
3、当调用A.width时,调用方法区数据。
——2017年2月20日
注
- 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。
- 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加笔者微信(o815441)。请备注“探讨技术问题”。欢迎交流、一起进步。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69829.html