当前位置: 首页 > news >正文

JVM核心机制:类加载与内存结构详解

目录

JVM的组成部分都是分别做什么的?负责哪些内容的工作?

JVM类加载流程和内存结构总览

类加载过程

双亲委派模型及其好处

JMM(JavaMemoryModel)java内存模型

1、程序计数器

2、虚拟机栈&本地方法栈及栈帧操作

3、堆

4、方法区(为什么使用元空间替换永久代?)

JVM垃圾回收算法


JVM的组成部分都是分别做什么的?负责哪些内容的工作?

JVM类加载流程和内存结构总览

类加载过程

类加载过程有:载入、验证、准备、解析、初始化。这5个阶段一般是顺序发生的,但在动态绑定的情况下,解析阶段会发生在初始化阶段之后。

载入过程中,JVM需要做三件事情:

1)通过一个类的全限定名来获取定义此类的二进制字节流。

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3)在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。

载入阶段结束后,JVM外部的二进制字节流就按照虚拟机所设定的格式存储在方法区(逻辑概念)中了,方法区中的数据存储格式完全由虚拟机自行实现。

JVM会在验证阶段对二进制字节流进行校验,只有符合JVM字节码规范的才能被JVM正确执行。

JVM会在准备阶段对类变量(也称为静态变量,static关键字修饰的变量)分配内存并初始化,初始化为数据类型的默认值,如0、0L、null、false等。

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、成员方法等。

初始化阶段是类加载过程的最后一步。在准备阶段,类变量已经被赋过默认初始值了,而在初始化阶段,类变量将被赋值为代码期望赋的值

换句话说,初始化阶段是执行类的构造方法(javap中看到的 <clinit>() 方法)的过程。

双亲委派模型及其好处

双亲委派模型(ParentDelegationModel)是Java类加载机制中的一个重要概念。这种模型指的是一个类加载器在尝试加载某个类时,首先会将加载任务委托给其父类加载器去完成。

只有当父类加载器无法完成这个加载请求(即它找不到指定的类)时,子类加载器才会尝试自己去加载这个类。

  • 当一个类加载器需要加载某个类时,它首先会请求其父类加载器加载这个类。
  • 这个过程会一直向上递归,也就是说,从子加载器到父加载器,再到更上层的加载器,一直到最顶层的启动类加载器(BootstrapClassLoader)。
  • 启动类加载器会尝试加载这个类。如果它能够加载这个类,就直接返回;如果它不能加载这个类(因为这个类不在它的搜索范围内),就会将加载任务返回给委托它的子加载器。
  • 子加载器接着尝试加载这个类。如果子加载器也无法加载这个类,它就会继续向下传递这个加载任务,依此类推。
  • 这个过程会继续,直到某个加载器能够加载这个类,或者所有加载器都无法加载这个类,最终抛出ClassNotFoundException。

为什么要用双亲委派模型?

可以为Java应用程序的运行提供一致性和安全性的保障。

①、保证Java核心类库的类型安全

如果自定义类加载器优先加载一个类,比如说自定义的Object,那在Java运行时环境中就存在多个版本的java.lang.Object,双亲委派模型确保了Java核心类库的类加载工作由启动类加载器统一完成,从而保证了Java应用程序都是使用的同一份核心类库。

②、避免类的重复加载

在双亲委派模型中,类加载器会先委托给父加载器尝试加载类,这样同一个类不会被加载多次。如果没有这种模型,可能会导致同一个类被不同的类加载器重复加载到内存中,造成浪费和冲突。

JMM(JavaMemoryModel)java内存模型

Memory存储器;记忆

JMM描述的是一种抽象的概念,规定了一个线程怎么样可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。围绕原子性、有序性、可见性展开的。

1、程序计数器

是当前线程所执行的字节码的行号指示器,指向虚拟机字节码指令的位置。被分配了一块较小的内存空间。针对于非Native方法:是当前线程执行的字节码的行号指示器。针对于Native方法:则为undefined。每个线程都有自己独立的程序计数器,所以,该内存是线程私有的。这块区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。

2、虚拟机栈&本地方法栈及栈帧操作

        虚拟机栈为执行Java方法服务的,是描述方法执行的内存模型。 栈是线程私有的内存空间。每次函数调用的数据都是通过栈传递的。在栈中保存的主要内容为栈帧。它的数据结构就是先进后出。每当函数被调用,该函数就会被入栈,每当函数执行完毕,就会执行出栈操作。而当前栈顶,即为正在执行的函数。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、帧数据区等信息。本地方法栈是为native方法服务的。

3、堆

运行时数据区,几乎所有的对象都保存在java堆中。Java堆是完全自动化管理的,通过垃圾回收机制,垃圾对象会被自动清理,而不需要显示地释放。堆是垃圾收集器进行GC的最重要的内存区域。Java堆可以分为:新生代(Eden区、S0区、S1区)和老年代。在绝大多数情况下,对象首先分配在eden区,在一次新生代GC回收后,如果对象还存活,则会进入S0或S1,之后,每经历过一次新生代回收,对象如果存活,它的年龄就会加一。当对象的年龄达到一定条件后,就会被认为是老年代对象,从而进入老年代。

4、方法区(为什么使用元空间替换永久代?

逻辑上的东西,是JVM的规范,所有虚拟机必须遵守的。是JVM所有线程共享的、用于存储类信息,例如:类的字段、方法数据、常量池等。方法区的大小决定了系统可以保存多少个类。JDK8之前——永久代。JDK8及之后——元空间

永久代指内存的永久保存区域,主要存放Class和Meta(元数据)的信息,Class在被加载的时候被放入永久区域,它和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。如果系统使用了一些动态代理,那么有可能会在运行时生成大量的类,从而造成内存溢出。所以,设置合适的永久代大小,对于系统的稳定性是至关重要的。-XX:PermSize设置初始永久代大小。例如:-XX:PermSize=5mXX:MaxPermSize设置最大永久代大小,默认情况下为64MB。例如:-XX:MaxPermSize=5m

元空间在ava8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间的本质和永久代类似,元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用堆外的直接内存。因此,与永久代不同,如果不指定大小,默认情况下,虚拟机会耗尽所有的可用系统内存。-XX:MaxMetaspaceSize设置元空间默认初始大小。例如:-XX:MetaspaceSize=40m设置最大元数据空间。例如:-XX:MaxMetaspaceSize=40m

JVM垃圾回收算法

点击下面链接有详细总结

JVM内存垃圾回收算法

http://www.dtcms.com/a/361225.html

相关文章:

  • OpenHarmony智能语音框架深度拆解:从VAD到唤醒词打造你的AI语音智能体
  • 自动化软件测试工具Parasoft C/C++test如何实现运行时错误的检测与修复
  • 面试经典150题[021]:反转字符串中的单词(LeetCode 151)
  • 【XR技术概念科普】VST(视频透视)vs OST(光学透视):解码MR头显的两种核心技术路径
  • 「数据获取」《中国住户调查年鉴》(2000-2024)(获取方式看绑定的资源)
  • SQLark:一款面向信创应用开发者的数据库开发和管理工具
  • Jmeter实现参数化的4种方式
  • Windows神器,按键屏蔽
  • 【机器学习学习笔记】pandas基础
  • (纯新手教学)计算机视觉(opencv)实战十二——模板匹配(cv2.matchTemplate)
  • UE角色取消被Decal影响
  • Jetson AGX Orin平台R36.3.0版本1080P25fps MIPI相机图像采集异常调试记录
  • 基于单片机电动车充电桩/充电车棚环境监测设计
  • 基于RS-485接口的芯片的FPGA驱动程序
  • 吴恩达机器学习作业十二:协同过滤(电影推荐系统)
  • 广电手机卡到底好不好?
  • Git基础使用和PR贡献
  • .Net程序员就业现状以及学习路线图(二)
  • Android面试指南(六)
  • 大模型落地全流程实践:从技术选型到企业级部署
  • 音视频开发入门:FFmpeg vs GStreamer,新手该如何选择?
  • 松灵斯坦福Mobile ALOHA同款 | 通过低成本全身远程操作实现双手机器人移动操控学习
  • 01数据结构-红黑树
  • 永磁同步电机无速度算法--高频脉振方波注入法(测量轴系转子位置误差信号解耦处理)
  • Spark引擎中RDD的性质
  • 【牛客JZ31】—栈的压入弹出序列判断算法详解
  • 【73页PPT】MES应用介绍(附下载方式)
  • SpringBoot @RefreshScope 注解的极致玩法
  • SpringCloud-服务注册-服务发现
  • AI瘦身狂魔!微软推出原生1-bit大模型,性能不减,内存仅需同行零头!