jvm内存模型+类加载机制+垃圾手机器

news2024/11/24 1:42:36

1、类加载器分类

        1、引导类加载器,负责加载支撑Jre/lib目录下的核心类库

        2、扩展类加载器:负责加载Jre/lib目录下的ext扩展类jar包

        3、应用程序类加载器:负责加载classpath下的类包

        4、自定义类加载器:负责加载用户自定义路径下的类包

2、jvm内存模型(运行时数据区)

1、程序技术器

2、java虚拟机栈(字节码级别)

        用于描述java方法执行的线程内存模型,每个方法被执行的时候,jvm都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个java方法执行完毕,这个栈帧就是在jvm中从入栈到出栈的过程。

        这里会诞生两种异常状况:

    1、如果线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflow异常。

     2、如果Jvm容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。

        局部变量表:编译期的基础数据类型、对象引用、returnAddress

3、本地方法栈(用于Natvie修饰的方法)

        和java虚拟机栈发挥作用非常相似,区别在于java虚拟机栈只是针对字节码服务,而本地方法栈则是用到本地Native方法服务。

        java如果需要调用其他语言解释方法的时候,则可以通过Natvie告知编译器应该需要使用其他语言解释。

4、java堆(多个线程直接共享区域)

        所有对象实例和数据都应该在堆上分配(垃圾收集器内存:新生代、老年代、永久代、Eden空间、From Survior空间、To Survivor空间等),多个线程直接共享区域

        -Xmx和-Xms

        如果在Java堆中没有内存完成实例分配、并且堆也无法再扩展时,会抛出OutOfMemoryError异常。

5、方法区 (多个线程直接共享区域)

        用于储存类型信息、常量、静态变量、即时编译器编译之后的代码缓存等数据,(永久代内存管理)

         -XX:MaxPermSize

         如果方法区无法满足新的内存分配,将抛出OutOfMemoryError异常。

6、运行时常量池

        实际上也是方法区的一部分,用于存储编译期生成类的字面量与符号引用,可以管理运行期的常量内存(运行时常量池)

       受方法区的影响, 如果方法区无法满足新的内存分配,将抛出OutOfMemoryError异常。

3、直接内存(非运行时数据区)

       使用Native来分配堆外内存,不受java堆大小限制,但会受本机总内存限制(物理内存、SWAP分区和分页文件),通过java堆里面的DirectByteBuffer对象操作NIO的channel与缓冲区的I/O方式。可以提高显著提高通道和缓冲区的读写性能,但是分配回收的需要更大的代价。

         如果直接内存无法满足新的内存分配,将抛出OutOfMemoryError异常。

5、分代收集机制:(堆内存模型)

        

        新生代:(Eden From(S1) To(S2))

Major GC/Old GC

        老年代(Tenured)

Full GC

        收集整个Java堆/方法区。

垃圾收集过程:

         Minor GC/Yong GC过程

        1、收集GC root可达对象,分配到Eden区,

        2、当Eden区满了情况下,将Eden中GC root可达的对象通过标记复制法复制到From区(S0),同时通过标记清除法清除Eden区。

        3、当From区(S0)满了的情况下,将From区依旧被GC root可达的对象复制到To区(S1)区,

同时标记清除To区。

        4、当To区满了情况下,To区被GC root可到的对象复制到From区,同时标记清除To区。

        5、对于躲过一次Minor GC的GC root可达的对象,使用引用计数+1,当引用次数达到15之后,进入老年代收集

 Major GC/Old GC

        当老年代区域满了的情况下,不会使用标记复制方法,而是使用标记整理法,即将GC root可达的对象向内存空空间一端移动,然后使用标记清除法清除掉边界以外的内存。

        这样的好处是,不用像minc gc 使用s1区和s2区,可以直接节约掉50%空间,而且不会频繁出现复制操作,效率更好。

6、对象回收

        1、引用计数法:在对象中添加一个引用计数器,如果有一个地方引用这个对象,计数+1,当引用失效,计数-1,当对象的计数器为0的时候,回收对象。

        2、可达性分析法:

                 从GC Roots开始,向下搜索引用,没有任何引用链的情况下,证明GC Root不可达到这个对象,回收对象。

                可作为GC Roots对象

                        1、java虚拟机栈中引用的对象,包括参数、局部变量、临时变量

                        2、方法区中的静态变量、常量引用

                        3、JNI、native引用

                        4、java虚拟机内部的引用,基础数据类型包装对象引用、异常对象、系统类加载器

                        5、sunchronized关键字持有的对象。

                强引用关系存在永远不会被回收。new

                A a = new Aclass();

                a=null;

                a之后不能再被引用,jvm会回收。

                软引用关系会在发生内存溢出之前进行两次回收,如果还没有足够的内存,内存还是会溢出的。SoftReference,可实现缓存。

                弱引用关系对象,不管内存够不够,都会被回收掉。WeakReference。

                虚引用,该引用无法获取一个对象的实例,只是为了能在这个对象被回收时收到一个系统通知。PhantomRefrence

7、垃圾收集器

        1、清除算法

        2、复制算法

        3、整理算法

8、垃圾收集器

         新生代收集器:Serial    ParNew   Parallel Scavenge
        老年代收集器:Serial Old     CMS     Parallel Old
        堆内存垃圾收集器:G1(Garbage First)

        CMS :并发收集器,基于标记-清除法实现的,

        1、初始标记:只是标记一下GC root 直接关联的对象,会发生停顿。

        2、并发标记:垃圾回收线程会遍历和GC root关联所有可达对象,和用户线程是直接并发执行的,因此不会停顿用户线程的。

        3、重新标记:并发情况下,会发生用户线程执行而导致并发标记发生变动的记录,更新标记记录,会发生停顿并且会比初始标记时间更长。

        4、并发清除:垃圾回收线程会清除标记清除GC root不可达的对象,可以和用户线程并发执行。

        缺点:碎片化内存比较严重,必须预留一定的老年代内存空间来分配内存,不能等待占用100%的情况下才触发回收,如果预留的空间不足以满足用户分配的空间,将会触发一次并发失败,此时将会冻结用户线程,临时启用Serial Old重新收集老年代线程,这样停顿时间会非常严重

        -XX:CMSInitiatingOccu-pancyFraction可以设置预留空间,慎重。需要生产反复设计

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

值得思索的:ArrayList和线性表,你确定错过这次机会

线性表: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条…

Go项目实战:01-聊天室+map竞争需要上锁

实现一个聊天室(群): 功能分析: 1、上线下线2、聊天:其他人和自己都可以看到聊天消息3、查询当前的聊天室用户所有人的名字4、可以修改自己的名字5、超时潜水踢出机制 技术点分析: 1、socket tcp编程2、…

Adam算法及python实现

文章目录算法介绍代码实现结果展示参考算法介绍 Adam算法的发展经历了:SGD->SGDM->SGDNA->AdaGrad->AdaDelta->Adam->Adamax的过程。它是神经网络优化中的常用算法,在收敛速度上比较快,比SGD对收敛速度的纠结上有了很大的…

单商户商城系统功能拆解46—应用中心—足迹气泡

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

基于微信小程序的课程分享平台-计算机毕业设计

项目介绍 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整…

[附源码]Node.js计算机毕业设计高校就业管理信息系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

学生竞赛网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 模块划分:通知类型、通知信息、学院信息、学生信息、学科信息、竞赛信息、报名信 息、成果上传、评分排名 管…

YOLOv5小目标切图检测

当我们在检测较大分辨率的图片时,对小目标的检测效果一直是较差的,所以就有了下面几种方法: 将图片压缩成大尺寸进行训练( 想法:没显存,搞不来)添加小检测头(想法:P5模型…

【爬虫实战项目】Python爬虫批量下载相亲网站数据并保存本地(附源码)

前言 今天给大家介绍的是Python爬虫批量下载相亲网站图片数据,在这里给需要的小伙伴们代码,并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本数据爬取的人会…

数据结构---树和二叉树

树和二叉树定义二叉树二叉树的物理结构链式存储数组二叉树应用查找维持相对顺序二叉树的遍历深度优先遍历前序遍历中序遍历后序遍历二叉树广度优先遍历层序遍历定义 有且仅有一个特定的称为根的节点。当n>1时,其余节点可分为m(m>0)个互…

数据结构与算法——Java实现栈、逆波兰计算器(整数加减乘除)

目录 一、栈 1.1 基本介绍 1.2 栈的思路分析 1.3 栈的代码实现 二、栈实现综合计算器 2.1 思路分析 2.2 代码实现(中缀表达式实现) 三、栈的前缀(波兰)、中缀、后缀(逆波兰)表达式 3.1 表达式的介绍…

访问pcie总线地址内容

调用代码如下: uint32_t value;void * addr;printk("------1--------\n");addr0x2730000;struct resource *res;char const *name dev_name(&pdev->dev);printk("dev_name%s\n", name);res request_mem_region(addr, 16, "name1&…

【语音之家公开课】SRD: A Dataset and Benchmark Perspective

本次语音之家公开课邀请到陈果果进行分享Speech Recognition Development: A Dataset and Benchmark Perspective。 公开课简介 主题:Speech Recognition Development: A Dataset and Benchmark Perspective 时间:12月15日(周四&#xff09…

web网页设计期末课程大作业:美食餐饮文化主题网站设计——HTML+CSS+JavaScript美食餐厅网站设计与实现 11页面

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

C# IO及文件管理

一 System.IO ① System.IO名字空间; ② 提供了许多用于; ③ 文件和数据流进行读写操作的类; 二 流的分类 1 Stream类 按存取位置分:FileStream,MemeryStream,BufferedStream; 2 读写类 BinaryReader和BinaryWriter; TextRe…

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之打包

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之打包 大家好,前两篇文章大概介绍了下上手 Compose Desktop 和自定义绘制时遇到的一些问题,项目的最终实现效果如下: 视频代码写好了,该弄的动画也弄了,该请求的网络数…

【数据结构】八大排序算法详解

🧑‍💻作者: 情话0.0 📝专栏:《数据结构》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 排序前言一…

汇编语言第一章:基础知识

1. 基础知识 机器语言 机器语言是机器指令的集合,是一台机器可以正确执行的命令。现在一般电子计算机的机器指令是一列二进制数字。机器指令集是机器语言。 汇编语言 机器语言难以辨别和记忆,所以产生了汇编语言。汇编语言的主体是汇编指令。 操作&…

on-device training

又搬来个好玩呃 说来又想试试了 , 仅用256KB就实现单片机上的神经网络训练(training,notinference),从此终端智能不再是单纯的推理,而是能持续的自我学习自我进化 On-Device Training under 256KB Memory 说到神经网络训练&#…

编译原理实验四

编译原理实验四 实验要求 cminus-f的词法分析和语法分析部分已经完成,最终得到的是语法分析树。而为了产生目标代码,还需要将语法分析树转为抽象语法树,通过抽象语法分析树生成中间代码(即IR),最后使用中间代码来进行优化并生成…