JAVA JVM内存模型和GC分配和回收

Java 的JVM简介

JVM是(Java Virtual Machine)Java虚拟机的缩写。

JVM是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

 在Java程序运行时,所有的.class类需要加载到JVM中才能执行代码逻辑。不是直接和操作系统交互,需要jvm通过java类库解释给操作系统。


​ 


类加载器 ClassLoader

用来查找和加载Class文件到Java虚拟机内存中,并将这些静态数据转换成方法区运行时数据结构,然后在堆中形成代表这个类的Class对象,作为方法区中类数据的访问入口。

类加载器所做的工作实质是把类文件从硬盘读取到内存中。

Java中类加载器主要分为两种,即系统类加载器和自定义类加载器。其中系统类加载器包括3种,分别是Bootstrap ClassLoader、Extensions ClassLoader和Application ClassLoader。

  • 引导类加载器(Bootstrap ClassLoader):用C语言实现无法被Java代码访问。负责JDK核心库,比如java.lang、java.util等。
  • 拓展类加载器(Extension ClassLoader):负责系统类额外功能,如jar包。
  • 应用程序类加载器(Application ClassLoader):实现累AppClassLoader,负责加载当前程序的Classpath目录。
  • 自定义类加载器(Custom ClassLoader):由开发人员自己定义。

 双亲委派机制

类加载器查找Class采用双亲委派模式,即先判断该Class文件是否已经加载,如果没有则委派给父加载器进行查找,如果最顶层没有查找到则向下尝试加载类。

双亲委派机制优缺点

优点: 避免类的重复加载,保证类加载的安全性。假设自定义String类替换系统String类,显然会造成安全隐患。
缺点: 子加载器可以使用父加载器加载的类,而父加载器不能使用子加载器加载的类。


运行时数据区域

Java虚拟机在执行程序过程中会把它所管理的内存划分为不同的数据区域。

  • 线程隔离区为:程序员计数器、Java虚拟机栈、本地方法栈;
  • 线程共享区为:Java堆、方法区。 

程序计数器(Program Counter Register)

也叫PC寄存器,是一块较小的内存空间。

JVM的多线程,就是在启动时会创建一个程序计数器,保持执行的jvm指令。通过轮流切换并分配处理器执行时间的方式来实现的,在某一时刻只有一个处理器执行一条线程中的指令。

  • 程序计数器总是指向下一条将被执行指令的地址。
  • 生命周期与线程的生命周期保持一致。

Java 虚拟机栈(Java Virtual Machine Stacks)

每个线程都有一个私有的虚拟机栈,它的生命周期和线程相同,与线程同时创建和结束。

  • 线程结束栈内存自动释放,因此不存在垃圾回收问题。

一个虚拟机栈包含多个栈帧。栈帧用来存储局部变量表、动态链接、方法出口等信息。

  • 当线程执行一个方法时,压入一个新的栈帧到该线程的虚拟机栈中。

  • 如果线程请求分配的栈容量超过虚拟机最大容量,会抛出StackOverflowError;
  • 如果创建新的线程或栈扩展时无法申请足够内存,会抛出OutOfMemoryError。

本地方法栈(Native Method Stack)

java里面native关键字修饰的方法,说明java的作用范围达不到,需要去调用底层c/c++语言的库。会进入本地方法栈,然后到本地方法库。

本地方法栈也会抛出 StackOverflowError和OutOfMemoryError异常。


Java 堆(Java Heap)

堆是线程共享的运行时内存区域,用来存放对象的实例,并且这些对象被垃圾回收器管理。

这些受管理的对象无法显式地销毁,从内存回收角度堆粗略分为新生代、老年代和永久代(不存在垃圾回收,关闭jvm释放内存)。

方法区(Method Area)

方法区是被所有线程共享的运行时内存区域,用来存储的是被虚拟机加载的类结构信息:运行时常量池、静态变量(static)、方法信息(修饰符、方法名、返回值、参数等)、字段等。

方法区是Java堆的逻辑组成部分,它可以选择不实现垃圾收集。方法区并不等同于永久代。

当方法区内存空间不满足内存分配需求时,会抛出OutOfMemoryError。

运行时常量池:并不是JVM运行时数据区域的其中一份子,属于方法区的一部分。


垃圾回收器:GC

Garbage Collection,通常被称作GC。GC主要工作是做内存分配和回收。

GC采用的是分代收集算法来回收垃圾的,Java堆作为GC主要管理区域,被细分为新生代和老年代,再细致一点新生代又可以划分为Eden区、From Survivor空间、To Survivor空间。空间划分后,GC就可以为新对象分配内存空间了。

GC通过垃圾标记算法来区分对象的存活和死亡,如何标记呢?

JVM的垃圾回收是根据可达性分析算法引用计数算法来标记对象是否存活的。

垃圾标记算法:可达性分析算法和引用计数算法

可达性分析算法:也称为根搜索算法。这个算法的基本思想就是选定一些对象作为根GC Roots ,然后以这些"GC Roots"的对象作为起始点,向下去搜索叶节点,如果目标对象到GC Roots是连接着的,就称该目标对象是可达的,否则为不可达,也就是被回收的对象。如下图:

引用计数器算法: 为每个对象都添加一个计数器,每多一个引用指向对象,计数器就加1,当计数器为0的对象,就是可回收的对象。

在JDK1.2之后,Java引用分为强引用、软引用、弱引用、虚引用。

垃圾收集算法 :标记清除算法 、 复制算法、标记压缩算法、分代收集算法

标记清除算法

分为两个阶段:标记和清除。比较好理解,首先标记所有需要回收的对象,然后回收所有被标记的对象。

缺点:效率不高。会产生大量不连续的内存碎片,也就会没有连续内存提供给较大的对象,导致容易触发新的一次垃圾回收动作。

复制算法

将内存划分为两个相等区域,每次只使用其中一块。当这块内存不够使用时,就将还存活的对象复制到另一块内存中,然后把这块内存一次清理掉。

优点:效率比较高,也避免了内存碎片。
缺点:因为另一半内存一直是空的,比较浪费空间。

为什么广泛应用于新生代中?因为复制算法的效率与存活对象数目有直接关系,如果存活对象很少效率就会很高。而新生代中绝大多数对象的生命周期都很短。

标记整理算法

是标记-清除算法的升级版,也叫标记-压缩算法。在标记可回收对象后,将存活对象向着一端移动,使他们紧凑排列在一起,然后清理掉边界以外的内存。

优点:避免了内存碎片和内存利用效率低。广泛应用于老年代中。
缺点:增加了一个移动的成本。

分代收集算法

分代的概念:因为JVM各种对象生命周期各不相同,大部分对象生存时间很短暂,少部分对象生存时间很长,因此GC针对不同生命周期的对象划分不同的区域,并采取不同的收集算法。

新生代:存活率低-复制算法。划分为Eden区、From Survivor空间、To Survivor空间
老年代:区域大存活率高-标记清除+标记整理算法混合实现

 注意:在GC之后,还存活的对象,进入幸存区(Survivor),谁空谁是To,可以交换位置,当一个对象经历了15次GC,还存活,就进入老年区。

(控制对象经过Minor GC次数晋升老年代的阈值:-XX:+MaxTenuringThreshold=15)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/517308.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python环境下基于离散小波变换的信号降噪方法

Mallat创造了小波分析中的经典理论之一,即多分辨率分析的概念。后来,在Mallat与Meyer的共同努力之下,他们又在这一理论的基础上发明了离散小波变换的快速算法,这就是Mallat塔式算法,这种算法可以大量减少计算时间。在之…

解锁未来:大模型GPT的应用架构与创新实践

在人工智能的黄金时代,大模型如GPT(Generative Pre-trained Transformer)已成为技术创新和应用发展的前沿。它不仅重新定义了人机交互的方式,还在多个领域内展现出了巨大的应用潜力。本文将深入探讨大模型GPT的应用架构&#xff0…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展,链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅,对这些领域进行详细解析,探讨它们的意义、应用场景以及未来发展趋势。 链游开发(Bl…

基于keepalived+gtid+双vip半同步主从复制的MySQL高性能集群

项目名称:基于keepalivedgtid双vip半同步主从复制的MySQL高性能集群 目录 项目名称:基于keepalivedgtid双vip半同步主从复制的MySQL高性能集群 项目规划图 1.配置4台MySQL服务器(1台master,2台slave,1台backup&a…

光伏无人机:绿色能源与航空技术的融合创新

在可再生能源和无人机技术快速发展的背景下,光伏无人机作为一种新兴的绿色航空器,正逐渐展现出其独特的优势和广阔的应用前景。本文将深入探讨光伏无人机的原理、优势以及其在多个领域的应用,展望其未来的发展趋势。 一、光伏无人机的原理 光…

基于微信小程序的外卖管理系统的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全…

【VSCode】修改插件地址

不想放在原始C盘下面C:\Users\{用户}\.vscode\extensions为了后续存储空间考虑,想通过添加环境变量创建名为VSCODE_EXTENSIONS的环境变量,内容指向vs Code扩展所在目录即可 直接配置环境变量,不要在有空格的文件夹下面 变量名称:…

『VUE』11. 操作数组的方法(详细图文注释)

目录 vue中操作数组的方法会修改原数组的 会进行渲染更新不修改原数组的 不会进行渲染更新 push自动渲染concat 赋值渲染总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 vue中操作数组的方法 vue中数组数据呈现在网页,只检测…

Android 系统大致启动流程

Android启动流程大体为:BootRom -> BootLoader -> Kernel -> Init -> Zygote -> SystemServer ->Launcher 1、Loader层 1.1、Boot ROM 电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行&#xff0…

通讯录(顺序表)保存数据

在通讯录的基础上加上三个函数实现数据的保存。 分别为录入数据,加入数据与保存数据。 加入数据 先检查通讯录空间是否足够,然后将结构体ab中的数据全部放入通讯录mn中。 注意:字符串的拷贝要使用函数strcpy而不能直接用 加入完成之后将通…

速通数据结构与算法第五站 栈队列

系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 4 速通…

unity学习(82)——profiler 限制帧率

实际测试发现当玩家个数增加时,客户端明显变的很卡,想知道为什么变卡了! 1.只有玩家自己的时候 2.两个时候感觉脚本的工作量增大了 拖了一会直接炸了!(数据包积压把内存搞炸,我第一次见) 3.我觉…

Flutter 画笔(Paint)、绘制直线(drawLine)

override bool shouldRepaint(CustomPainter oldDelegate) > true; } class MyPainter extends CustomPainter { override void paint(Canvas canvas, Size size) { //画背景 var paint Paint() …isAntiAlias false …strokeWidth30.0 …color Colors.red; c…

Loss【1】:Focal Loss

系列文章目录 文章目录 系列文章目录前言1. 什么是 Focal Loss2. 逐过程解析 Focal Loss3. Focal Loss 的 PyTorch 实现总结 前言 类别不平衡是一个在目标检测领域被广泛讨论的问题,因为目标数量的多少在数据集中能很直观的体现。同时,在分割中这也是一…

【C++STL详解 —— vector的模拟实现】

CSTL详解 —— vector的模拟实现 vector各函数接口总览vector当中的成员变量介绍默认成员函数**构造函数1:****构造函数2****构造函数3****拷贝构造函数**赋值运算符重载函数 迭代器相关函数begin和end 容量和大小相关函数size和capacityreserveresizeempty 修改容器…

spring boot后端controller中接收表单参数校验

校验分为两部分,一部分是前端的输入时就校验,一部分时后端接收参数时的校验。本文提到的是后端接收参数时的校验。这个后端校验的存在有什么意义呢? 比如我们设置前端在输入参数时限制输入不能为空,应该为3-20位非空字符&#xf…

ENSP华为防火墙WEB登录操作指南

ENSP华为防火墙WEB登录操作指南 华为防火墙登录WEB 1、华为防火墙配置:(需要在互联接口下放通https和ping) int g0/0/0 service-manage https permit service-manage ping permit 2、电脑需要配置虚拟网卡 3、虚拟网卡与云和防火墙配置的IP地…

JDK类加载器剖析

0.前言 我之所以深入研究 Java 类加载器,是为了解决一个奇怪的问题。流行出版物,也就是人们所认为的 Java 世界的灯塔,充斥着关于这个主题的相互矛盾和过时的信息。这种矛盾引发了我的调查 — — 在 Java 类加载器的迷宫中寻求清晰的答案。 …

音视频开发之旅(81)- 图片视频“黑边”检测与去除

目录 1.“黑边“的场景 2. 二值化--单一颜色边缘的图像 3. canny边缘检测霍夫直线变换--处理负责的边缘图像 4. 性能优化 5. 资料 在页面展示中,如果图片/视频有黑边,比较影响体验,我我们今天实现下对图片/视频进行黑边检测。检测到黑边…

校招说明书

3400字的详细说明,介绍了程序员类岗位校招的整体时间节点和招聘流程。还对一些常见的问题进行讨论,例如内推、offer和三方、实习等。 第一章介绍基本的术语,第二章介绍整个校招的重要流程及时间点,然后第三章介绍每次招聘要经过的…