a)        执行。

main()作为该程序的初始线的起点。无论由线程开始在其他线程。

JVM有两个内螺纹:守护线程和非守护线程,main()它是一个非守护线程。常由JVM自己使用。java程序也能够标明自己创建的线程是守护线程

b)        消亡。当程序中的全部非守护线程都终止时,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中寻找。如仍然没找到。则从SystemClassLoader中寻找,最后再调用findClass方法来寻找,如要改变类的载入顺序,则可覆盖此方法

(2)       findLoadedClass

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

(3)       findClass

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

(4)       findSystemClass

此方法负责从System ClassLoader中寻找类,如未找到,则继续从BootstrapClassLoader中寻找,如仍然为找到,则返回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 AllocationBuffer),其大小由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

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Java 内存架构的更多相关文章

  1. Java 内存模型和硬件内存架构笔记

    前言 可跟<主存存取和磁盘存取原理笔记>串着看 https://blog.csdn.net/suifeng3051/article/details/52611310 杂技 Java 内存模 ...

  2. Java并发编程里的volatile。Java内存模型核CPU内存架构的对应关系

    CPU内存架构:https://www.jianshu.com/p/3d1eb589b48e Java内存模型:https://www.jianshu.com/p/27a9003c33f4 多线程下的 ...

  3. 云时代架构阅读笔记六——Java内存模型详解(二)

    承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...

  4. 云时代架构阅读笔记五——Java内存模型详解(一)

    什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...

  5. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  6. JMM(java内存模型)

    What is a memory model, anyway? In multiprocessorsystems, processors generally have one or more laye ...

  7. Java内存模型深度解读

    Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型. 如果你想设计表现良好的并发 ...

  8. java内存泄漏的定位与分析

    1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...

  9. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

随机推荐

  1. Java对Xml进行操作的实例(转)

    这是一个用JAVA W3C DOM 进行XML操作的例子,包含了查询.增加.修改.删除.保存的基本操作.较完整的描述了一个XML的整个操作流程.适合刚入门JAVA XML操作的朋友参考和学习. 假设有 ...

  2. elf 文件格式探秘——程序运行背后的故事

    摘要:本文主要讲解elf文件格式,通过readelf命令结合底层的相关数据结构,讲解相关内容,分析程序运行的基本原理. 本文来源:elf 文件格式探秘——程序运行背后的故事 http://blog.c ...

  3. android &quot;Missing type parameter&quot; 错误

    近期在做android应该的时候出现这个问题,分析了一下日志,发现是在gosn解析的时候会出现,并且出现的时候非常诡异.于是去网上找相关资料. 发现这个问题还是比較常见的,原来是公布版本号和非正式公布 ...

  4. Linux下将UTF8编码批量转换成GB2312编码的方法

    Linux下将UTF8编码批量转换成GB2312编码的方法 在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换成GB2312编码,下面为大家介绍下在Linux ...

  5. jQuery获取url参数值

    $.extend({ getUrlVars: function () { var vars = [], hash; var hashes = window.location.href.slice(wi ...

  6. VMware WorkStation安装时提示The MSI failed

    以前安装过其他版本的VMware workstation卸载不完全造成的 先把所有VMware相关服务关闭,然后打开注册表,搜索所有VMware相关键值,删除掉,然后再安装就可以了 前提是你机器上没有 ...

  7. Node.js v0.10.31API手冊-控制台

    Node.js v0.10.31API手冊-文件夹 控制台 Object 用于向 stdout 和 stderr 打印字符.类似于大部分 Web 浏览器提供的 console 对象函数,在这里则是输出 ...

  8. 【翻译】Why JavaScript Is and Will Continue to Be the First Choice of Programmers

    花费2半小时,那么最终会被翻译.假设有问题,请提出,毕竟,自己的6不超过级别. 附加链接 Why JavaScript Is and Will Continue to Be the First Cho ...

  9. C++ 操作 MySQL

    使用VS2008如IDE, 准备操作: 1. 项目属性  C++ 其他包括文件夹 为 mysql 安装文件夹的include 如:"C:\Program Files (x86)\MySQL\ ...

  10. git pull VS git fetch&merge(good)

    从图中可以看到,git fetch和git pull的区别, git fetch 不会自动的将结果merge到本地,只是将远程版本同步到本地版本库,而不会merge到本地副本. git pull  将 ...