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)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试八股总结】超文本传输协议HTTP(二)

参考资料 :小林Coding、阿秀、代码随想录 一、HTTP缓存技术 将资源(如网页、图像、脚本等)的副本存储在客户端或中间代理服务器上,以便将来的请求可以直接从缓存中获取,而不必重新从服务器下载资源。这有助于减少网…

ArcGIS 10.8中文版详细安装教程(附安装包)

ArcGIS 10.8中文版详细安装教程(附安装包) 关键词:ArcGIS 10.8中文版安装 1.概述 ArcGIS Desktop 10.8中文版是由ESRI公司开发的一款专业的地理信息系统,一套完整的桌面GIS软件套件,它包含ArcMap、ArcCatalog、ArcG…

增加网站搜索引擎排名的6个准则

怎样提高网站排名首页 在竞争激烈的网络世界中,网站的排名对于吸引流量和提升曝光至关重要。登上搜索引擎结果页面的首页,意味着更多的曝光和点击率。以下是一些方法,可以帮助您提高网站在搜索引擎中的排名,让其跻身首页&#xf…

多功能知识付费源码下载-实现流量互导多渠道变现(带详细安装教程)

资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线…

一、Docker部署GitLab(详细步骤)

Docker部署GitLab(详细步骤) 一、拉取镜像二、启动容器三、修改配置四、修改密码五、浏览器访问 一、拉取镜像 docker安装教程:https://qingsi.blog.csdn.net/article/details/131270071 docker pull gitlab/gitlab-ce:latest二、启动容器 …

深入理解C/C++的内存管理

在C和C中,高效的内存管理是编写性能优化和资源高效利用程序的关键。本文将深入探讨C/C内存管理的各个方面,包括内存的分布、C语言和C中的动态内存管理方式,以及new和delete操作符的使用 C/C内存分布 C和C程序的内存可以分为以下几个区域&…

windows上配置Redis主从加哨兵模式实现缓存高可用

一、哨兵模式 哨兵(sentinel)是Redis的高可用性(High Availability)的解决方案:由一个或多个sentinel实例组成sentinel集群可以监视一个或多个主服务器和多个从服务器。当主服务器进入下线状态时,sentinel可以将该主服务器下的某…

深入浅出 -- 系统架构之单体架构

单体架构(Monolithic Architecture) 单体架构的定义 单体架构(Monolithic Architecture)是一种传统的软件架构模式,将整个应用程序作为一个单一的、统一的单元进行开发、部署和扩展。在单体架构中,所有的功…

精品PPT-2023年无人驾驶汽车车联网网络安全方案

以下是部分PPT内容,请您参阅。如需下载完整PPTX文件,请前往星球获取: 无人驾驶安全架构是一个复杂的系统,它涉及到多个关键组件和层次,以确保无人驾驶车辆在各种情况下都能安全、可靠地运行。以下是一些主要的无人驾驶…

探索未来智慧酒店网项目接口架构

在数字化时代,智慧酒店已成为酒店业发展的重要趋势之一。智慧酒店网项目接口架构作为支撑智慧酒店运营的核心技术之一,其设计和优化对于提升用户体验、提高管理效率具有重要意义。本文将深入探讨智慧酒店网项目接口架构的设计理念和关键要素。 ### 智慧…

【蓝桥杯选拔赛真题55】C++最长路线 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

目录 C最长路线 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C最长路线 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 有一个N*M的矩阵,且矩阵…

金融中的数学知识

随机偏微分方程相比普通偏微分方程具有额外的随机项,反映了其描述的现象具有随机性质

CVPR24_ArGue: Attribute-Guided Prompt Tuning for Vision-Language Models

Abstract 尽管软提示微调在调整视觉语言模型以适应下游任务方面表现出色,但在处理分布偏移方面存在局限性,通过属性引导提示微调(Attribute-Guided,ArGue)来解决这个问题 Contributions 与直接在类名之前添加软提示…

物联网实战--入门篇之(六)嵌入式-WIFI驱动(ESP8266)

目录 一、WIFI简介 二、基础网络知识 三、思路讲解 四、代码分析 4.1 状态机制 4.2 客户端连接 4.3 应用数据接收处理 4.4 数据发送 4.5 主函数调用 4.6 网络连接ID分配 五、总结 一、WIFI简介 WIFI在我们生活中太常见了,手机电脑都可以用WiFi连接路由器进行上…

【C++】C++中的list

一、介绍 官方给的 list的文档介绍 简单来说就是: list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中…

DashOJ-8.奇偶统计

题目链接: 题目详情 - 奇偶统计 - DashOJ 思路: (while循环加if分支语句) 巧用死循环 while(1) 然后在里面第一句就判断输入的数字是否等于0 if(x0) ,如果 等于0就直接break跳出循环 或者用 while(cin>>x) 代…

后端SpringBoot+Mybatis 查询订单数据表奇怪报错加一

排错过程: 看报错意思是SQL语句存在错误,然后使用图形化工具运行这个SQL语句 其实这里稍微细心想一下就能发现问题,但是当时没深入想,就觉得order表前加了数据库名字影响不大,所以感觉SQL语句是没问题的,然…

STM32八种I/O口模式

STM32八种I/O口模式 文章目录 STM32八种I/O口模式前言一、stm32八种I/O类型二、区别1.模拟输入2.浮空输入3.上拉输入4.下拉输入5.推挽输出6.开漏输出7.复用推挽输出8.复用推挽输出 总结 前言 作为两年嵌入式软件攻城狮,还没仔细去理解过STM32的GPIO的八种使用模式&…

力扣爆刷第111天之CodeTop100五连刷41-45

力扣爆刷第111天之CodeTop100五连刷41-45 文章目录 力扣爆刷第111天之CodeTop100五连刷41-45一、232. 用栈实现队列二、4. 寻找两个正序数组的中位数三、31. 下一个排列四、69. x 的平方根五、8. 字符串转换整数 (atoi) 一、232. 用栈实现队列 题目链接:https://le…

引脚数量最少的单片机

引脚数量最少的单片机 2款SOT23-6封装单片机介绍 参考价格 PMS150C-U06 整盘单价:0.19688,该芯片为中国台湾品牌PADAUK(应广) SQ013L-SOT23-6-TR 整盘单价:0.27876,该芯片为国产:holychip(芯圣电子) 上述价格为2024…