zoukankan      html  css  js  c++  java
  • JVM类加载机制理解

    JVM的内存结构:
    线程共享:堆(存放创建的各种对象),方法区(存放类信息,静态变量,常量池)
    线程私有:栈(每个线程都有自己的栈空间,存放每个方法的局部变量),程序计数器(记录当前字节码指令的位置,执行到拿哪一条字节码指令),本地方法栈(跟栈类似,不同的是执行的native方法)
     

    JVM什么时候会加载一个类?

    代码用到这个类的时候,就加载

     
    加载类的过程是什么?
    1.加载
    2.验证 (检验加载进的字节码,是否符合规范)
    3.准备(给 静态修饰的变量分配空间,设置默认值)
    4.解析(符号引用变为直接引用,程序运行的时候,根据头指针,找到JVM指令码的地址)
    5.初始化(执行类的初始化代码)
    6.使用 
    7.卸载
     

     

     

    堆和栈的区别?

    1.管理方式:栈自动释放 ,堆需要进行GC

    2.空间:栈比堆空间占用空间小,单个线程的栈空间一般是M级的,堆一般时G级

    3.碎片:栈产生的碎片远小于堆

    4.分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数malloc进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。

    5.效率:栈的效率比堆的效率高

     类加载器和双亲委派模型:

    1.启动类加载器:加载 JDK 目录下的核心类库

    2.拓展类加载器: JRE   ‘lib/ext’ 目录下的父类

    3.应用程序类加载器: “classPath”环境指定的路径下的类

    4.自定义类加载器: 根据你自己的需求加载类

     

     

     

     

     

  • 相关阅读:
    [noip2013]华容道
    [tyvj 1061] Mobile Service (线性dp 滚动数组)
    [bzoj 2726] 任务安排 (斜率优化 线性dp)
    [洛谷 P2365] 任务安排 (线性dp)
    [poj 3666] Making the Grade (离散化 线性dp)
    【模板】manacher算法
    [tyvj 1071] LCIS
    [NOIP 2012] 国王游戏
    [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)
    [NOI 2002] 银河英雄传说 (带权并查集)
  • 原文地址:https://www.cnblogs.com/Jemb/p/11625391.html
Copyright © 2011-2022 走看看