JVM及其垃圾回收机制(GC)

目录

一.JVM内存区域划分

二.JVM类加载机制

类加载过程

类加载的时机

双亲委派模型

三.JVM垃圾回收机制(GC)

GC工作过程

1.找到垃圾/判断垃圾

(1)引用计数【python/PHP】

(2)可达性分析【Java】

2.对象释放

(1)标记清除算法

(2)复制算法

(3)标记整理算法

(4)分代回收算法


JVM即Java虚拟机

一.JVM内存区域划分

JVM是一个应用程序,要从操作系统里申请内存。在启动的时候,会申请到一个很大的内存区域。JMV要根据需要,把整个空间分成几个部分,每个部分各自有不同的功能作用。

此处的栈,不是数据结构中的栈(后进先出),这里的栈是JVM的一个特定空间。对于JVM虚拟机,用来存储native方法之间的调用关系;对于本地方法栈,存储的是native方法之间的调用关系。

栈空间的内部包含多个元素,每个元素表示一个方法。每个元素称为一个“栈帧”,一个栈帧中包含这个方法的入口地址、参数、返回地址、局部变量.....

方法区:一个进程里只有一块,多个线程共用这一块

:每个线程有一份,每个进程有N个

:每个进程有N个

每个线程用自己的栈,多个线程用同一个堆。

基本原则:

1.局部变量在栈上

2.普通成员变量在堆上

3.静态成员变量在方法区(元数据区)

二.JVM类加载机制

类加载就是.class文件,从文件(硬盘)被加载到内存中(元数据区)的过程。

类加载过程

记忆:

加载:找到.class文件,读取文件内容

验证:根据jvm虚拟机规范,检查.class文件的格式是否符合要求

准备:给类对象分配内存空间(此时内存初始化全成0)

解析:对字符串常量进行初始化,把符号引用转换成直接引用。

初始化:调用构造方法,对类对象里的内容进行初始化。加载父类,执行静态代码块。

类加载的时机

不是Java程序一运行就把所有的类加载了,而是正真用到才加载。

1.构造类的实例

2.调用这个类的静态方法/使用静态属性

3.加载一个子类就需要先加载其父类

双亲委派模型

描述的是这个加载,找.class文件的基本过程

JVM默认提供了三个类加载器

首先加载一个类的时候,是先从ApplicationClassLoader开始,一层一层往上委托给自己的父亲。当没有父亲/父亲加载完,没有上级的类,才由本层进行加载。当轮到BootstrapClassLoader进行加载时,它会负责搜索自己负责的标准库相关的类,如果找到就加载。如果没有找到就继续由子类加载器加载。

这个顺序最主要的目的就是为了保证Bootstrap能够先加载,Application能够后加载。这样的机制可以保证当用户在自己的代码中创建了一个和标准库相同名字的类的时候,不会让jvm已有的代码混乱。

三.JVM垃圾回收机制(GC)

垃圾:不再使用的内存

垃圾回收机制:把不用的内存自动释放

GC主要针对堆进行释放的。GC是以“对象”为基本单位,进行回收的。

GC回收的是整个对象都不再使用的情况。

GC工作过程

1.找到垃圾/判断垃圾

判断对象是否有“引用”指向它。Java中是通过引用来使用对象的。如果一个对象没有引用指向了,就不会再被使用了。

(1)引用计数【python/PHP】

给每个对象分配了一个计数器,每次创建一个引用指向该对象,计数器+1;每次引用被销毁,计数器减-1。

局限:

1)内存空间浪费多,每个对象都需要分配一个计数器。(当对象本身很小时,多一个计数器的空间,会使空间的利用率大大降低)

2)存在循环引用的问题。(当两个对象相互指向时,此时销毁一个对象,两个对象的计数器都-1,但实际上销毁一个对象,另外的一个对象也会不存在)

(2)可达性分析【Java】

前提:Java中的对象都是通过引用来指向访问的。Java中的对象通过链式/树形结构,整体串起来(类比定义一个二叉树)

可达性分析,就是把所有这些对象被组织的结构视为是树,从根节点出发,遍历树,所有能被访问到的对象,标记为“可达”(不能访问到的就标记为“不可达”)

jvm通过上述遍历,把不可达的作为垃圾进行回收。

2.对象释放

(1)标记清除算法

简单粗暴,把标记的垃圾清除掉。但是被释放的空闲空间是零散的,不是连续的。

而申请内存时要求的是连续的空间。(总的空闲空间很大,但是每个具体的空间都很小,可能导致在申请较大一点的内存的时候就申请失败了)

(2)复制算法

复制算法解决的就是上述标记清除算法带来的“内存碎片”问题

缺点:

1.空间利用率低

2.如果垃圾比较少,有效对象多,复制成本就比较大

(3)标记整理算法

保证了空间利用率,同时也解决了内存碎片。但是效率并不高,搬运空间大时,效率会降低。

上述的三种算法,都有各自的缺点。所以把垃圾回收分成不同的场景,让三种算法对应不同的需求,扬长避短。为此提出了分代回收算法。

(4)分代回收算法

根据生命周期的长短,分别使用不同的算法。给对象引入“年龄”这个概念(年龄:熬过GC的轮次,经历一轮可达性分析的遍历,判断是否是垃圾)

年龄越大,这个对象存在的时间越久。

伊甸区到幸存区:复制算法

幸存区之后,也要周期性的接受GC的考验。如果变成垃圾就要被释放,如果不是垃圾就被拷贝到另外一个幸存区。俩个幸存区同一个时刻只用一个,两者之间来回拷贝。幸存区的体积不大,空间浪费也就不大。

两个幸存区之间:复制算法

如果对象在俩个幸存区之间已经来回拷贝许多次,这个时候就要进入老年代。老年代也要周期性扫描,,但是频率会更低。

老年代对象是垃圾时,使用标记整理的方式进行释放。

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

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

相关文章

Juniper PPPOE双线路冗余RPM配置

------------------ 浮动静态路由 set routing-options static route 0.0.0.0/0 next-hop pp0.0 qualified-next-hop pp0.1 preference 10 ----------------- RPM测试的内容,包括从哪个接口发起测试,测试ping等等 #指定探针类型用ICMP请求 #探测的目标地址 #探测间隔 #探测阈…

ElasticSearch中常见的分词器介绍

文章目录 ElasticSearch中常见的分词器介绍前言分词器的作用如何指定分词器分词器的组成分词器的类型标准分词器空格分词器简单分词器关键词分词器停用词分词器IK分词器NGram分词器正则匹配分词器语言分词器自定义分词器 ElasticSearch中常见的分词器介绍 前言 ElasticSearch是…

如何利用黑群晖虚拟机和内网穿透实现公网远程访问

文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

Linux系统上搭建高可用Kafka集群(使用自带的zookeeper)

本次在CentOS7.6上搭建Kafka集群 Apache Kafka 是一个高吞吐量的分布式消息系统,被广泛应用于大规模数据处理和实时数据管道中。本文将介绍在CentOS操作系统上搭建Kafka集群的过程,以便于构建可靠的消息处理平台。 文件分享(KafkaUI、kafka…

No193.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

ctfshow sql171-179

mysql 先打开我们本地的mysql,可以看到这些数据库 information_schema information_schema 库: 是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息比如数据库名,数据库表, SCHEMATA表: 提供了当前MySQL实例…

Golang 字符串处理汇总

1. 统计字符串长度:len(str) len(str) 函数用于统计字符串的长度,按字节进行统计,且该函数属于内置函数也不用导包,直接用就行,示例如下: //统计字符串的长度,按字节进行统计: str : "golang你好&qu…

​软考-高级-系统架构设计师教程(清华第2版)【第4章 信息安全技术基础知识(P160~189)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第4章 信息安全技术基础知识(P160~189)-思维导图】 课本里章节里所有蓝色字体的思维导图

postgresql实现job的六种方法

简介 在postgresql数据库中并没有想oracle那样的job功能,要想实现job调度,就需要借助于第三方。本人更为推荐kettle,pgagent这样的图形化界面,对于开发更为友好 优势劣势Linux 定时任务(crontab) 简单易用…

Redhat7设置国内可用yum源

问题: 因为最近安装了redhat7,在使用的时候提示系统未注册订阅,无法使用官方的yum源进行安装软件。为此,我使用centos7国内的yum源替换redhat的官方的yum源实现软件安装。 “This system is not registered with an entitlement …

【2011年数据结构真题】

41题 41题解答: (1)图 G 的邻接矩阵 A 如下所示: 由题意得,A为上三角矩阵,在上三角矩阵A[6][6]中,第1行至第5行主对角线上方的元素个数分别为5, 4, 3, 2, 1 用 “ 平移” 的思想,…

Outlook无法显示阅读窗格

Outlook无法显示阅读窗格 故障现象 Outlook主界面不显示阅读窗格 故障截图 故障原因 阅读窗格被关闭 解决方案 1、打开Outlook - 视图 – 阅读窗格 2、选择“靠右”或者“底部”,正常显示阅读窗格

同济 MBA 携手和鲸课程共建,以数智人才培养持续赋能企业数字化转型

数智化的浪潮席卷全球,我国产业界应如何做出应变?各企业又该如何深化数字化转型?在任重道远的持续探索中,数智人才培养作为企业实现成功转型的关键要素,已然成为大势所趋。 同济大学综合 MBA 项目高度重视工商管理人才…

什么是代理IP池?如何判断IP池优劣?

代理池充当多个代理服务器的存储库,提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务,而无需担心被检测或阻止的风险。代理池为各种在线活动(例如网页抓取、安全浏览等)提高后勤保障。 读完…

lua 时间差功能概略

简介 在进行程序设计过程中,经常需要对某些函数、某些程序片断从开始运行到运行结束所耗费的时间进行一些量化。这种量化实际上就是计算时间差。 获取函数耗时情景如下: function time_used() --开始计时-- do something at here. --结束计时--时间差&…

基于Python+Django的寻人失物失物招领系统

运行环境 开发语言:Python python框架:django 软件版本:python3.7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:PyCharm/vscode 前端框架:vue.js 项目介绍 寻人失物失物招领系统交流平台的主要使用…

浅析网络协议-HTTP协议

1.HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图…

MyBatis 反射工具箱:带你领略不一样的反射设计思路

反射是 Java 世界中非常强大、非常灵活的一种机制。在面向对象的 Java 语言中,我们只能按照 public、private 等关键字的规范去访问一个 Java 对象的属性和方法,但反射机制可以让我们在运行时拿到任何 Java 对象的属性或方法。 有人说反射打破了类的封装…

Redis应用之一自增编号

一、前言 前段时间同事用Redis实现收银台商品排行榜,我们都知道Redis最基础的功能是用来缓存数据,但其实它还有很多特性能解决很多实际问题,接下来几篇文章我们就聊聊Reids一些特性的应用,今天先聊一下借助Reids生成不会重复的订…

电源基础元件

文章目录 电源基础元件理想电压源理想电流源受控电源 电源基础元件 理想电压源 定义 其两端电压总能保持定值或一定的时间函数,其值与流过它的电流i无关的元件叫理想电压源 理想电压源的电压、电流关系 1.电源两端电压由电源本身决定,与外电路无关&…