ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

类加载机制

2021-05-16 14:32:31  阅读:105  来源: 互联网

标签:字节 线程 内存 GC 机制 方法 加载


一、类加载的过程

image

二、JVM体系结构

image

1. Class Loader

image

作用:

将Class文件字节码内容加载到内存中,并将这些静态数据转成方法区的运行时数据结构,然后在堆中生成一个代表整个类的Java.lang.Class对象,作为方法区中类数据的访问入口

种类:

image

2. 双亲委派机制
  • 类加载器收到类加载的请求
  • 将这个请求向上委托给父类加载器去完成,一直向上为委托,知道Bootstrap classloader
  • 若Bootstrap classloader能够加载,则加载结束,否则通知子类加载器去加载,直到最后加载完成。
作用:
  • 安全,防止核心类被随意修改,比如自己写的String类不会被加载
  • 避免重复加载,父类加载器已经加载过,则子类不需要再次加载
3. 执行引擎

将.class字节码文件编译/解释成计算机系统可以识别的机器语言,需调用本地方法接口来实现整个程序的功能。

4. 方法区/元空间(Method Area)
  • 存储已被虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码 等数据
  • 元空间在1.8中不再与堆是连续的物理内存,而是改为使用本地内存(Native memory)
永久代和元空间的区别?
  • 方法区在jdk1.8以前叫永久代,jdk1.8开始叫元空间
  • 永久代是存放在堆区的,元空间存在于直接内存
为什么要移除永久代?
  • 为了避免发生OOM异常,替换成元空间不占用堆内存
元空间的调优
  • 最小、最大元空间设置成一样大
  • 大小设置为物理内存的 1/32
  • 预留20%-30%的空间
常量池:

image

  1. 字面量
    字面量相当于 Java 语言层面常量的概念,如文本字符串,声明为 fina 的常量值等;
  2. 符号引用量
    符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
  • 类和接口的全限定名
  • 字段名称描述符
  • 方法名称描述符
5.栈(stack)

1、特点:
栈的最主要特点是后进先出(LIFO)。

栈是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表。栈的所有插入和删除操作均在栈顶进行,而栈底不允许插入和删除。

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

主管程序的运行,生命周期和线程同步。

存放内容:八种基本数据类型、对象的引用、实例的方法

栈中不存在垃圾回收,程序正在执行的方法一定在栈的顶部。

栈溢出:StackOverError

补充
队列(Queue):

特点:先进后出 (FIFO:First Input First Output)

当一个元素被添加到队列中时,它被添加到后面。当一个元素从队列中移除时,它将从前面移除。队列的两个主要操作就是入队(enqueue)和出队(dequeue)。入队意味着在队列的后面插入一个元素,而出队则意味着从队列的前面移除一个元素。

6. 本地方法栈

线程私有

本地方法栈与虚拟机栈类似,只不过虚拟机栈是为Java方法提供服务,本地方法栈是为native方法服务

7. 本地库接口

Native 的作用:调用C++语言的类库。程序在执行之前先要把java代码转换成字节码(class文件),jvm首先需要把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中 运行时数据区(Runtime Data Area) ,而字节码文件是jvm的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交由CPU去执行,而这个过程中需要调用其他语言的接口 本地库接口(Native Interface)来实现整个程序的功能。

8. 程序计数器
  • 当前线程所执行的字节码的行号指示器
  • 为了线程切换后能恢复到正确的位置。
  • 实现流程控制 和 记录执行位置
  • 线程私有
  • 每个线程有一个独立的程序计数器,线程之间互不影响。
  • 运行时数据区中唯一不会出现OOM的区域,没有垃圾回收
  • 只存下一个字节码指令的地址,消耗内存小且固定,无论方法多深,他只存一条。 只针对一个线程,随着线程的结束而销毁。
  • 如果线程执行的Java方法,则计数器记录正在执行的虚拟机字节码的指令的地址
  • 如果正在执行的本地方法,这个计数器值则应为空。(undefined)
9.堆(Heap)

一个JVM只有一个堆内存,堆内存的大小是可以调节的。
存放对象的实例,方法,常量。

堆的三个区域

image

GC

Minor GC是新生代GC,指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的,所以Minor GC非常频繁,一般回收速度也比较快。

Major GC/Full GC 是老年代GC,指的是发生在老年代的GC,出现Major GC一般经常会伴有Minor GC,Major GC的速度比Minor GC慢的多。

什么情况下会出发Minor GC和Full GC

https://blog.csdn.net/weixin_38750084/article/details/83280614

三、栈+堆+方法区的交互关系

image

问题:为什么Mian方法最先执行,但是最后结束?

image
其他:
因为内存中针对方法的调用使用栈的数据结构。
递归->可能导致方法将栈的空间占满,导致栈溢出(StackOverFlowError)错误。

标签:字节,线程,内存,GC,机制,方法,加载
来源: https://www.cnblogs.com/nlbz/p/14773766.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有