zoukankan      html  css  js  c++  java
  • java JVM

    每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责加载程序中的类型(类和接口),并赋予唯一的名字。每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中包含的指令。
    数据区中的一部分是整个程序共有,其他部分被单独的线程控制。每一个Java虚拟机都包含方法区(method area)和堆(heap),他们都被整个程序共享。Java虚拟机加载并解析一个类以后,将从类文件中解析出来的信息保存与方法区中。程序执行时创建的 对象都保存在堆中。 
    Java虚拟机中的类加载器分为两种:原始类加载器(primordial class loader)和类加载器对象(class loader objects)。原始类加载器是Java虚拟机实现的一部分,类加载器对象是运行中的程序的一部分。不同类加载器加载的类被不同的命名空间所分割。
    像其他对象一样,类加载器对象和Class对象都保存在堆中,被加载的信息被保存在方法区中。
         1、加载、连接、初始化(Loading, Linking and Initialization)
    类加载子系统不仅仅负责定位并加载类文件,他按照以下严格的步骤作了很多其他的事情:
              1)、加载:寻找并导入指定类型(类和接口)的二进制信息
              2)、连接:进行验证、准备和解析
                   ①验证:确保导入类型的正确性
                   ②准备:为类型分配内存并初始化为默认值
                   ③解析:将字符引用解析为直接饮用
              3)、初始化:调用Java代码,初始化类变量为合适的值

    此图看出jvm内存结构

    JVM内存结构主要包括两个子系统和两个组件。两个子系统分别是Classloader子系统和Executionengine(执行引擎)子系统;两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件。

    类加载机制

    JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

     

    双亲委派模型的工作过程?

    1、当前 ClassLoader 首先从自己已经加载的类中,查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。    一定程度上防止自有的类被篡改

    每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。

    2、当前 ClassLoader 的缓存中没有找到被加载的类的时候

    委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到 bootstrap ClassLoader。
    当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

    
    
  • 相关阅读:
    Postman之token动态获取
    AJAX省市县三级联动的实现
    Javamail简单使用案例
    JavaWeb之JSP入门
    js小例子之二级联动
    git常用命令
    centos下安装pip-python
    Pyspider抓取静态页面
    Python中__init__()方法注意点
    2、Pyspider使用入门
  • 原文地址:https://www.cnblogs.com/upward/p/11295125.html
Copyright © 2011-2022 走看看