JVM的学习笔记

一、JVM的启动和终止

当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多么复杂,该程序启动的所有线程,所有变量都处于该Java虚拟机进程里,它们都使用该JVM进程的内存区。当系统出现以下几种情况时,JVM进程将被终止。

  1. 程序运行到最后正常结束;
  2. 程序运行到使用System.exit()代码处结束程序;
  3. 程序运行过程中遇到未捕获的异常或者错误而结束;
  4. 程序所在的平台强制结束了JVM进程。

二、类的加载、连接和初始化

1、类的加载

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

无论类的示例有多少个,该类的Class对象只有一个,且通过查看源码知道,Class的构造方法为私有的,只有JVM才能创建该对象。

/*
     * Constructor. Only the Java Virtual Machine creates Class
     * objects.
     */
    private Class() {}

加载.class文件的方式:从本地系统中直接加载自己编译后的.class文件或者从zip,jar等归档文件中加载.class文件

类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口

类加载器的分类:

Java虚拟机自带的加载器

  1. 根类加载器(Bootstrap)
  2. 扩展类加载器(Extension)
  3. 系统类加载器(System)

用户自定义的类加载器

  1. java.lang.ClassLoader的子类

类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误),如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

2、类的连接

类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。

类的验证:

  1. 类文件的结构检查
  2. 语义检查
  3. 字节码验证
  4. 二进制兼容性的验证

类的准备

类的解析

 类的初始化

类的初始化步骤

 

 

 

 

类的加载器机制

类加载器用来把类加载到Java虚拟机中。类的加载机制采用父亲委托机制,这种机制能更好的保证Java平台的安全。

在此机制中,除了Java虚拟机自带的根类加载器以外,其余的类的加载器都有且只有一个父加载器。

 

posted @ 2016-08-22 21:40  LyJs  阅读(261)  评论(0编辑  收藏  举报