JVM学习一:JVM之类加载器概况
18年转眼就3月份都快结束了,也就是说一个季度就结束了;而我也因为年前笔记本坏了,今天刚修好了,那么也应该继续学习和博客之旅了。今年的博客之旅,从JVM开始学起,下面我们就言归正传,进入正题。
一、Java虚拟机与程序的生命周期
一个运行时的Java虚拟机(JVM)负责运行一个Java程序。
当启动一个Java程序时,一个虚拟机实例诞生;当程序关闭退出,这个虚拟机实例也就随之消亡.
如果在同一台计算机上同时运行多个Java程序,将得到多个Java虚拟机实例,每个Java程序都运行于它自己的Java虚拟机实例中。
在如下几种情况下,Java虚拟机将结束生命周期:
1.执行了System.exit()方法
2.程序正常执行结束
3.程序在执行过程中遇到了异常或错误而异常终止
4.由于操作系统出现错误而导致Java虚拟机进程终止
二、类加载器ClassLoader
上面我们提到了java 程序是基于JVM之上运行的,那么我们知道我们编写的java程序,首先java编译器将我们的源代码编译成为字节码,然后由JVM将字节码load到内存中,接着我们的程序就可以创建对象了,我们知道JVM将字节码load到内存之后将将建立内存模型(JVM的内存模型我们将在稍后阐述),那JVM是怎么将类load到内存中的呢?对了,是通过Classloader;也就是我们说的类加载器。在讲解具体类加载执行流程前,我们来看一段代码:
class Singleton{
private static Singleton singleton=new Singleton();
private static int counter1;
private static int counter2 = 0;
public Singleton() {
counter1++;
counter2++;
}
public static int getCounter1() {
return counter1;
}
public static int getCounter2() {
return counter2;
}
public static Singleton getInstance(){
return singleton;
}
}
public class ClassLoaderTest {
@SuppressWarnings("static-access")
public static void main(String[] args) {
Singleton singleton=Singleton.getInstance();
System.out.println("counter1:"+singleton.getCounter1());
System.out.println("counter2:"+singleton.getCounter2());
}
}
我们先猜测一下运行结果,然后我们再来调换一下单实例生成的顺序,将:
private static Singleton singleton=new Singleton();
private static int counter1;
private static int counter2 = 0;
修改为:
private static int counter1;
private static int counter2 = 0;
private static Singleton singleton=new Singleton();
然后我们会惊奇的发现,竟然结果是不一样的,这又是为什么呢? 学过JVM的的类加载器过程的估计一定知道了,但没有学过的,那么不要急,让我们一起来揭秘。
三、类的加载流程
紧接着上面的类型,让我们来看下类加载器到底是如何来加载的,流程如下:

即类加载经历了:加载 --> 连接 --> 初始化
1.加载:查找并加载类的二进制数据。
加载就是将二进制的字节码通过IO输入到JVM中,我们的字节码是存在于硬盘上面的,而所用的类都必须加载到内存中才能运行起来,加载就是通过IO把字节码从硬盘迁移到内存中。
详细分析见:《JVM学习二:JVM之类加载器之加载分析》:http://www.cnblogs.com/pony1223/p/8641015.html
2.连接:连接又分为三个步骤:
验证:确保被加载类的正确性。
即验证class文件是否符合JVM的要求。
准备:为类的静态变量分配内存,并将其初始化为默认值。
解析:把类中的符号引用转换为直接引用。
详细分析见:《JVM学习三:JVM之类加载器之连接分析》:http://www.cnblogs.com/pony1223/p/8641083.html
3.初始化:
为类的静态变量赋予正确的初始值,即在程序里为静态变量指定的初始值,或静态代码块中的赋值操作。
静态代码块是从上到下顺序执行的,可以对一个静态变量多次赋值,最后的结果为静态变量的初始值。
详细分析见:《JVM学习四:JVM之类加载器之初始化分析》:http://www.cnblogs.com/pony1223/p/8641181.html
参考资料:
圣思园张龙老师深入Java虚拟机系列
JVM学习一:JVM之类加载器概况的更多相关文章
- 【JVM学习笔记】系统类加载器
可以通过“java.system.class.loader"属性指定系统类加载器 默认情况下,该属性值为空: public class Test { public static void m ...
- 【JVM学习笔记】扩展类加载器
扩展类加载器独有的特点,代码如下 public class Sample { } public class Test { static { System.out.println("Test ...
- jvm三的三种类加载器
JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类.他们主要是分工不一样,各自负责不同的区域,另外也是为了实 ...
- JVM学习笔记(四):类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 一.类加载的时机1. 类从被加载到虚拟机内存 ...
- JVM体系结构之二:类加载器
一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的加载 ...
- JVM(三)从JVM源码角度看类加载器层级关系和双亲委派
类加载器我们都知道有如下的继承结构,这个关系只是逻辑上的父子关系. 我们一直听说引导类加载器没有实体,为什么没有实体呢? 因为引导类加载器只是一段C++代码并不是什么实体类,所谓的引导类加载器就是那一 ...
- JVM源码分析--ClassLoader类加载器
本人原创,转载请注明出处:https://www.cnblogs.com/javallh/p/10224187.html 1.JDK已有类加载器: BootStrap ClassLoader (启动类 ...
- JVM(15)之 类加载器
开发十年,就只剩下这套架构体系了! >>> 今天我们将类加载机制5个阶段中的第一个阶段,加载,又叫做装载.为了便于阅读,以下都叫做装载. 装载的第一步就是要获得二进制的字节 ...
- 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)
前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...
随机推荐
- react 父子组件互相通信
1,父组件向子组件传递 在引用子组件的时候传递,相当于一个属性,例如: class Parent extends Component{ state = { msg: 'start' }; render ...
- ubuntu11.04启动 及虚拟文件系统
虚拟文件系统(VFS)是由Sun microsystems公司在定义网络文件系统(NFS)时创造的.它是一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口.虚拟文件系统(V ...
- OkHttp使用教程——网络操作之OkHttp, Volley以及Gson
写这篇文章的动机 在安卓项目中有一个问题可能无法避免:网络.不管你是加载图片,请求API数据还是从因特网上获得一个字节,你都是在使用网络. 鉴于网络在安卓中的重要性与基础性,当今安卓开发者面临的问题之 ...
- dojo省份地市级联之省份Dao接口类(三)
dojo省份地市级联之省份Dao接口类 ProvinceDao.java: /** * 省份-Dao */ package com.you.dao; import java.util.List; im ...
- 为什么选择Netty作为基础通信框架?
在开始之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果两个多月过去了,他们的NIO服务端始终无法稳定,问题 ...
- HttpServletRequest对象
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- Windows系统还原失败心得
最近我的Windows10连续几天出现了蓝屏,怀疑是某软件的Bug造成的,于是想用系统还原功能回到前一段时间,我找到了那款软件安装的时间. 到了选择还原点界面,发现有5个还原点,最旧的一个刚好就是那款 ...
- 清橙A1202&Bzoj2201:彩色圆环
因为Bzoj是权限题,所以可以去清橙做一下 Sol 突然考了一道这样的题,考场上强行\(yy\)出来了 win下评测Long double爆零TAT 首先肯定是破环为链变成序列问题辣 那么就要求第一个 ...
- BZOJ第1页养成计划
嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000 BZOJ1001 BZOJ1002 BZOJ1003 BZOJ1004 BZOJ1005 ...
- c++面试遇到问题
1. C 和 C++ 区别 2. const 有什么用途 主要有三点: 1:定义只读变量,即常量 2:修饰函数的参数和函数的返回值 3: 修饰函数的定义体,这里的函数为类的成员函数, ...