一.JVM类加载机制

  首先需要了解一下类加载器(ClassLoader)

    ClassLoader是Java的一个核心组件,它主要作用是从系统外部获得Class二进制数据流,然后将数据流装载到系统,交给JVM进行连接,初始化等操作,所有的Class都是有ClassLoader进行加载的。

    点开ClassLoader类,如下图所示:

    

  类加载器种类

    启动类加载器(BootStrapClassLoader):它用来加载 Java 的核心类,如java.xxx。

    扩展类加载器(ExtensionsClassLoader):它负责加载JRE的扩展目录,如javax.xxx。

    应用类加载器(AppClassLoader):它一般用来加载程序所在目录下的类。

    自定义类加载器:通过继承ClassLoader类实现自定义类加载器。

  双亲委派机制:

    虚拟机是根据类的全限定名来加载类的,那么有个问题,如果同时存在两个或多个全限定名完全一致的情况下,该如何选择加载哪个类?如何判断该类是否被加载过了?这都是双亲委派机制能做的。

    下图是双亲委派机制的实现(这是ClassLoader中的loadClass方法),很明显,parent也是一个类加载器。

    

    双亲委派机制原理:

      1.一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,直到启动类加载器

      2.启动类加载器检查能不能加载(使用findClass()方法),能就加载(结束);否则,抛出异常,通知子加载器进行加载。

    双亲委派机制的优点是:

      1.安全,可避免用户自己编写的类动态替换Java的核心类,如java.lang.String
      2.避免全限定命名的类重复加载(使用了findLoadClass()判断当前类是否已加载)

  附:Java跨平台实现的原理:Java源码首先被编译成字节码(不同平台编译后的字节码是一样的,因此在不同平台上运行时不需要重新编译),再由不同平台的JVM进行解析,将字节码转换成具体平台上的机器指令。

  类加载流程:

    加载:通过ClassLoader加载class文件字节码,生成Class对象

    连接:检查加载的class文件的正确性和安全性;为类变量分配存储空间并设置类变量初始值;JVM将常量池内的符号引用转换为直接引用

    初始化:执行类变量赋值和静态代码块

  类加载的方式:

    隐式加载:通过new关键字来创建实例对象。

    显式加载:

      通过Class.forName()来加载类,它得到的是已经初始化完成的class

      通过类加载器的loadClass()方法来加载类,它得到的class还没有完成连接过程

二.JVM内存模型

  

  所有线程共享的内存数据区:方法区,堆。而虚拟机栈,本地方法栈和程序计数器都是线程私有的。

     1、存放于栈中的:

      每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(如变量的名字)。

      每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。

      方法的形式参数,方法调用完后从栈空间回收。

      引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC。

     2、存放于堆中的:

       存储的全部是对象,每个对象包含一个与之对应的class信息

      Jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身

     3、存放于方法区中的:

      存放线程所执行的字节码指令

      跟堆一样.被所有线程共享.方法区包含:static变量

  注意:Class实例在jdk1.6及之前是存放在方法区中, 在jdk1.7及之后存放在堆中

     常量池在jdk1.6及之前是存放在方法区中,在jdk1.7存放在堆中,在jdk1.8存放在元空间中

JVM类加载机制和内存模型的更多相关文章

  1. 面试官:小伙子,你给我讲一下java类加载机制和内存模型吧

    类加载机制 虚拟机把描述类的数据从 Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 类的生命周期 加载(Loadi ...

  2. JVM类加载机制详解(二)类加载器与双亲委派模型

    在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...

  3. JVM 类加载机制详解

    如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lan ...

  4. Java虚拟机(四):JVM类加载机制

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

  5. JVM类加载机制(转)

    原文出自:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运 ...

  6. JVM类加载机制详解

    引言 如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 在加载阶段,虚拟机需要完成以下三件事情: 1)通过一个类的全限定名来获取定义此 ...

  7. Java虚拟机(五):JVM 类加载机制

    一.JVM 类加载机制 JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 1. 加载: 加载是类加载过程中的第一个阶段,这个阶段会在内存中生成一个代表 ...

  8. 深入理解JVM虚拟机6:深入理解JVM类加载机制

    深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...

  9. JVM05——JVM类加载机制知多少

    我们已经讲过 JVM 相关的很多常见知识点,感兴趣的朋友可以在我的往期文章中查看.接下来将继续为各位带来 JVM 类加载机制.关注我的公众号「Java面典」了解更多 Java 相关知识点. 类生命周期 ...

随机推荐

  1. mvc导出数据到pdf

    using iTextSharp;using iTextSharp.text;using iTextSharp.text.pdf; , , ") { System.Collections.A ...

  2. [ML] Load and preview large scale data

    Ref: [Feature] Preprocessing tutorial 主要是 “无量纲化” 之前的部分. 加载数据 一.大数据源 http://archive.ics.uci.edu/ml/ht ...

  3. Oracle数据库导入(expdp)和导出(impdp)

    文档最后,列出了常用的一些导入导出的场景,以及一些导入导出的属性说明. 一.数据库导出(expdp) 使用sys或system账号登录oracle 通过"Window + R" 打 ...

  4. Linux系统管理_主题02 :管好文件(1)_2.3 拷贝、剪切、删除和创建文件_cp_mv_rm

    用法:cp [选项]... [-T] 源文件 目标文件 或:cp [选项]... 源文件... 目录 或:cp [选项]... -t 目录 源文件... 将源文件复制至目标文件,或将多个源文件复制至目 ...

  5. Button加在UITableViewHeaderFooterView的self.contentView上导致不能响应点击

    你有没有遇到过Button加在UITableViewHeaderFooterView的self.contentView上导致不能响应点击的情况,下面记录一下我遇到的原因和解决方法: 代码如下: - ( ...

  6. Java并发——volatile

    CPU的内存模型如下:

  7. What happens when you type an URL in the browser and press enter?

    What happens when you type an URL in the browser and press enter? 1. You type maps.google.com into t ...

  8. springboot-RequestMappingHandlerMapping

    作用:查看应用请求对应的ur和方法l情况 实例: RequestMappingHandlerMapping mapping =applicationContext.getBean("requ ...

  9. OSI七层模型非专业简介

    七层模型从下到上分别是:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. 1.第一层物理层:最简单理解,我们所看到的网线,就是物理层的.物理层是传输媒介,所以无线网络也算是物理层,在线路中 ...

  10. 【转】C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码

    本文原创地址:http://blog.csdn.net/ranbolwb/article/details/8083983 ,转载请保留本行. 本例子是上一篇 DataTable 导出 Excel 的进 ...