一、        JVM的生命周期

1.      JVM实例相应了一个独立执行的java程序它是进程级别

a)    启动。启动一个Java程序时。一个JVM实例就产生了。不论什么一个拥有public
static void main(String[] args)函数的class都能够作为JVM实例执行的起点

b)    执行。main()作为该程序初始线程的起点,不论什么其它线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程。main()属于非守护线程。守护线程通常由JVM自己使用。java程序也能够标明自己创建的线程是守护线程

c)    消亡。当程序中的全部非守护线程都终止时。JVM才退出;若安全管理器同意,程序也能够使用Runtime类或者System.exit()来退出

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

二、        JVM的体系结构

 

1.      类装载器(ClassLoader)(用来装载.class文件)

2.      运行引擎(运行字节码,或者运行本地方法)

3.      执行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)

 

三、        JVM类载入器

JVM整个类载入过程的步骤:

1.      装载

装载过程负责找到二进制字节码并载入至JVM中,JVM通过类名、类所在的包名通过ClassLoader来完毕类的载入,相同,也採用以上三个元素来标识一个被载入了的类:类名+

包名+ClassLoader实例ID。

2.      链接

链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类。

完毕校验后。JVM初始化类中的静态变量。并将其值赋为默认值。

最后对类中的全部属性、方法进行验证,以确保其须要调用的属性、方法存在,以及具备应的权限(比如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误信息。

3.      初始化

初始化过程即为运行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发运行:

调用了new。

反射调用了类中的方法;

子类调用了初始化。

JVM启动过程中指定的初始化类。

JVM类载入顺序:

JVM两种类装载器包含:启动类装载器和用户自己定义类装载器。

启动类装载器是JVM实现的一部分;

用户自己定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。

JVM装载顺序:

Jvm启动时,由Bootstrap向User-Defined方向载入类;

应用进行ClassLoader时。由User-Defined向Bootstrap方向查找并载入类。

1.      Bootstrap ClassLoader

这是JVM的根ClassLoader,它是用C++实现的,JVM启动时初始化此ClassLoader,并由此ClassLoader完毕$JAVA_HOME中jre/lib/rt.jar(Sun
JDK的实现)中全部class文件的载入。这个jar中包括了java规范定义的全部接口以及实现。

2.      Extension ClassLoader

JVM用此classloader来载入扩展功能的一些jar包。

3.      System ClassLoader

JVM用此classloader来载入启动參数中指定的Classpath中的jar包以及文件夹,在Sun JDK中ClassLoader相应的类名为AppClassLoader。

4.      User-Defined ClassLoader

User-DefinedClassLoader是Java开发者继承ClassLoader抽象类自行实现的ClassLoader。基于自己定义的ClassLoader可用于载入非Classpath中的jar以及文件夹。

ClassLoader抽象类的几个关键方法:

(1)      loadClass

此方法负责载入指定名字的类,ClassLoader的实现方法为先从已经载入的类中寻找,如没有则继续从parent ClassLoader中寻找,如仍然没找到。则从System ClassLoader中寻找,最后再调用findClass方法来寻找。如要改变类的载入顺序。则可覆盖此方法

(2)      findLoadedClass

此方法负责从当前ClassLoader实例对象的缓存中寻找已载入的类。调用的为native的方法。

(3)      findClass

此方法直接抛出ClassNotFoundException,因此须要通过覆盖loadClass或此方法来以自己定义的方式载入对应的类。

(4)      findSystemClass

此方法负责从System ClassLoader中寻找类,如未找到。则继续从Bootstrap ClassLoader中寻找。如仍然为找到,则返回null。

(5)      defineClass

此方法负责将二进制的字节码转换为Class对象

(6)      resolveClass

此方法负责完毕Class对象的链接,如已链接过。则会直接返回。

 

四、        JVM运行引擎

在运行方法时JVM提供了四种指令来运行:

(1)invokestatic:调用类的static方法

(2)invokevirtual:调用对象实例的方法

(3)invokeinterface:将属性定义为接口来进行调用

(4)invokespecial:JVM对于初始化对象(Java构造器的方法为:<init>)以及调用对象实例中的私有方法时。

基本的运行技术有:

解释,即时编译,自适应优化、芯片级直接运行

(1)解释属于第一代JVM,

(2)即时编译JIT属于第二代JVM,

(3)自适应优化(眼下Sun的HotspotJVM採用这样的技术)则吸取第一代JVM和第二代

JVM的经验,採用两者结合的方式

開始对全部的代码都採取解释运行的方式。并监视代码运行情况,然后对那些常常调用的方法启动一个后台线程,将其编译为本地代码。并进行优化。

若方法不再频繁使用,则取消编译过的代码,仍对其进行解释运行。

 

五、        JVM执行时数据区

第一块:PC寄存器

PC寄存器是用于存储每一个线程下一步将运行的JVM指令,如该方法为native的。则PC寄存器中不存储不论什么信息。

第二块:JVM栈

JVM栈是线程私有的,每一个线程创建的同一时候都会创建JVM栈。JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack
Frame。非基本类型的对象在JVM栈上仅存放一个指向堆上的地址

第三块:堆(Heap)

它是JVM用来存储对象实例以及数组值的区域。能够觉得Java中全部通过new创建的对象的内存都在此分配,Heap中的对象的内存须要等待GC进行回收。

(1)      堆是JVM中全部线程共享的。因此在其上进行对象内存的分配均须要进行加锁,这也导致了new对象的开销是比較大的

(2)      Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local
Allocation Buffer),其大小由JVM依据执行的情况计算而得,在TLAB上分配对象时不须要加锁。因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配。在这样的情况下JVM中分配对象内存的性能和C基本是一样高效的。但假设对象过大的话则仍然是直接使用堆空间分配

(3)      TLAB仅作用于新生代的Eden Space,因此在编写Java程序时。通常多个小的对象比大的对象分配起来更加高效。

第四块:方法区域(Method Area)

(1)在Sun JDK中这块区域相应的为PermanetGeneration,又称为持久代。

(2)方法区域存放了所载入的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发者在程序中通过Class

对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域。同一时候方法区域也是全局共享的,在一定的条件下它也会被GC。当方法区域须要使用的内存超过其同意的大小时,会抛出OutOfMemory的错误信息。

第五块:执行时常量池(Runtime Constant Pool)

存放的为类中的固定的常量信息、方法和Field的引用信息等。其空间从方法区域中分配。

第六块:本地方法堆栈(Native Method Stacks)

JVM採用本地方法堆栈来支持native方法的运行,此区域用于存储每一个native方法调用的状态。

 

六、        JVM垃圾回收

GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器。因为GC须要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后。依照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC相应用造成的暂停

(1)对新生代的对象的收集称为minor GC。

(2)对旧生代的对象的收集称为Full GC。

(3)程序中主动调用System.gc()强制运行的GC为Full GC。

不同的对象引用类型, GC会採用不同的方法进行回收,JVM对象的引用分为了四种类型:

(1)强引用:默认情况下,对象採用的均为强引用(这个对象的实例没有其它对象引用,GC时才会被回收)

(2)软引用:软引用是Java中提供的一种比較适合于缓存场景的应用(仅仅有在内存不够用的情况下才会被GC)

(3)弱引用:在GC时一定会被GC回收

(4)虚引用:因为虚引用仅仅是用来得知对象是否被GC

(转载)Jvm工作原理学习笔记的更多相关文章

  1. Jvm工作原理学习笔记(转)

    一.         JVM的生命周期 1.       JVM实例对应了一个独立运行的java程序它是进程级别 a)     启动.启动一个Java程序时,一个JVM实例就产生了,任何一个拥有pub ...

  2. java Jvm工作原理学习笔记

    一.         JVM的生命周期 1.       JVM实例对应了一个独立运行的java程序它是进程级别 a)     启动.启动一个Java程序时,一个JVM实例就产生了,任何一个拥有pub ...

  3. JVM类加载原理学习笔记

    (1)类的生命周期包括了:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Usin ...

  4. 一篇笔记整理JVM工作原理

    首先要了解的 >>数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了 ...

  5. 一篇笔记带你梳理JVM工作原理

    首先要了解的 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用, ...

  6. JVM工作原理和特点(一些二逼的逼神面试官会问的问题)

    作为一种阅读的方式了解下jvm的工作原理 ps:(一些二逼的逼神面试官会问的问题) JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完毕,通过以下4步来完毕JVM环境. ...

  7. Java 详解 JVM 工作原理和流程

    Java 详解 JVM 工作原理和流程 作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java ...

  8. JVM工作原理

    作为一种阅读的方式了解下jvm的工作原理 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JV ...

  9. 2017.10.24 Java 详解 JVM 工作原理和流程

    JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界 ...

随机推荐

  1. Windows Phone 8初学者开发—第7部分:本地化应用程序

    原文 Windows Phone 8初学者开发—第7部分:本地化应用程序 第7部分:本地化应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phon ...

  2. python 中函数参数传递形式

    python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...

  3. Agg学习笔记

    很久前就听一大牛说起Agg,据说是一个架构极度牛B的2D引擎,沉寂了许久,最后花了两周时间走马观花地把它过了一遍.果然如那大牛所言,这家伙简直就是巧夺天工的艺术品.今天稍稍瞄了一下Google扔出来的 ...

  4. (3)选择元素——(2)文档对象模型(The Document Object Model)

    One of the most powerful aspects of jQuery is its ability to make selecting elements in the DOM easy ...

  5. 循环之while

  6. 给EditText中的图片加监听

    package com.example.helloword; import android.app.Activity; import android.content.Context; import a ...

  7. UITableView 协议中常用的方法

    UITableViewDataSource 协议中常用方法 1.设置右边 索引值 - ( NSArray *)sectionIndexTitlesForTableView:( UITableView ...

  8. Kali Linux 安全渗透教程&lt;第三更&gt;1.2 安全渗透所需工具

    了解了渗透測试的概念后.接下来就要学习进行渗透測试所使用的各种工具.在做渗透測试之前.须要先了解渗透所需的工具.渗透測试所需的工具如表1-1所看到的: 表1-1  渗透所需工具 splint unhi ...

  9. AWS要进入中国了

    去年底就开始有这个传言见诸于某些媒体,说网站支持中文了要进中国了,也有说这不代表什么是谣言 这几天又听到有消息说比较靠谱就半年内的事儿 其实如果没有政策阻碍的话进中国是迟早的事情,原因如下 Amazo ...

  10. oracle常用函数以及调用入参为record的存储过程的方法,

    转自:http://www.cnblogs.com/zhangronghua/archive/2007/08/20/862812.html SQL中的单记录函数1.ASCII返回与指定的字符对应的十进 ...