深入Java虚拟机(-)

每个JVM都是一个独立的进程。

由ClassLoader将Java的字节码文件加载到JVM中

1、每启动一个程序就启动了一个JVM,程序运行结束JVM就消亡。

JVM退出的几种场景:1、调用System.exit();

2、程序运行结束

3、程序遇到异常或者错误,如果main方法会将异常抛出给虚拟机

4、操作系统终止JVM

类的加载、连接、初始化。

1、加载:查找并加载类的二进制数据。

类的加载指的是将.class文件的二进制数据读入到内存当中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区的数据结构。同一个类的所有对象,只对应一个Class对象。Class类时整个反射机制的入口

2、连接:

验证:确保被加载类的正确性

准备:为类的静态变量分配内存、并将其初始化为默认值

解析:把类的符号引用转变为直接引用

3、初始化:为类的静态变量赋予正确的初始值。

Java程序对类的使用分为两种:主动使用和被动使用

主动使用:(1)创建类的实例(2)访问某个类或者接口的静态变量(3)调用类的静态方法

(4)反射:Class.forName();(5)初始化一个类的子类,可以看做是对父类的主动使用。

(6)Java虚拟机启动时被标明为启动类的类:包含main方法的类或者一个Java程序启动的入口

方法区存储的是Java类的数据结构,堆区存储的是类的实例对象。

类加载器分为两种:

(1)启动类的加载器:BootStrap/Extention/System

如果某个类的getClassLoder方法返回null,则说明该类是由根类加载器加载的。

(2)自定义类的加载器:ClassLoader

当被装载的类引用了其他的类的时候,虚拟机就会用装载第一个类的装载器来装载其他被引用的类。运行时Java程序中的每一个类都有他自己的命名空间。

Java虚拟机中的线程分为两类:守护线程和非守护线程。守护线程通常是由Java虚拟机自己使用的,比如执行垃圾回收任务的线程;Java程序也可以把它创建的线程标记为守护线程,Java程序中的初始线程(开始于main方法的线程)就是一个非守护线程。

Java程序初始类中的main方法,将作为程序初始线程的起点,程序中任何其他线程都是由该线程启动。

只要有任何非守护线程还在运行,则Java程序就还在运行,当所有的非守护线程结束时,Java程序也自动结束。

Java虚拟机的组成部分:类装载器,执行引擎,运行时数据区(方法区、堆区、栈区、PC寄存器、本地方法区)、本地方法接口。

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/iteye_10306/article/details/82484893
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞