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.hqwc.cn/news/172102.html

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

相关文章

Spring Cloud学习(六)【统一网关 Gateway】

文章目录 网关的功能搭建网关服务路由断言工厂Route Predicate Factory路由过滤器 GatewayFilter过滤器执行顺序跨域问题处理 网关的功能 网关功能: 身份认证和权限校验服务路由、负载均衡请求限流 在SpringCloud中网关的实现包括两种: gatewayzuul …

盘点72个Python网站项目Python爱好者不容错过

盘点72个Python网站项目Python爱好者不容错过 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/12twY8iZYhAG8BuyYXM7_bw?pwd8888 提取码:8888 项目名称 dailyfreshpython…

用excel计算矩阵的乘积

例如,我们要计算两个矩阵的乘积, 第一个矩阵是2*2的: 1234 第2个矩阵是2*3的: 5697810 在excel中鼠标点到其它空白的地方,用来存放矩阵相乘的结果: 选择插入-》函数: 选中MMULT,…

【PG】PostgreSQL高可用方案repmgr部署(非常详细)

目录 简介 1 概述 1.1 术语 1.2 组件 1.2.1 repmgr 1.2.2 repmgrd 1.3 Repmgr用户与元数据 2 安装部署 2.0 部署环境 2.1 安装要求 2.1.1 操作系统 2.1.2 PostgreSQL 版本 2.1.3 操作系统用户 2.1.4 安装位置 2.1.5 版本要求 2.2 安装 2.2.1 软件包安装 2.2…

数据结构—数组栈的实现

前言:各位小伙伴们我们前面已经学习了带头双向循环链表,数据结构中还有一些特殊的线性表,如栈和队列,那么我们今天就来实现数组栈。 目录: 一、 栈的概念 二、 栈的实现 三、 代码测试 栈的概念: 栈的概念…

通过 Elasticsearch 和 Go 使用混合搜索进行地鼠狩猎

作者:CARLY RICHMOND,LAURENT SAINT-FLIX 就像动物和编程语言一样,搜索也经历了不同实践的演变,很难在其中做出选择。 在本系列的最后一篇博客中,Carly Richmond 和 Laurent Saint-Flix 将关键字搜索和向量搜索结合起…

idea中搭建Spring boot项目(借助Spring Initializer)

创建新项目 启动端口 在项目配置文件application.properties中写入 #启动端口server.port8088编写测试方法 创建控制类文件夹–>便于规范我们新建一个controller包–>建一个HelloWorld.class package com.example.hellospringboot.controller;import org.springframew…

什么是安全平行切面

安全平行切面的定义 通过嵌入在端—管—云内部的各层次切点,使得安全管控与业务逻辑解耦,并通过标准化的接口为安全业务提供内视和干预能力的安全基础设施。安全平行切面是一种创新的安全体系思想,是实现“原生安全”的一条可行路径。 为什…

深度学习 YOLO 实现车牌识别算法 计算机竞赛

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 该项目较…

数据结构(超详细讲解!!)第二十三节 树型结构

1.定义 树型结构是一类重要的非线性数据结构,是以分支关系定义的层次结构。是一种一对多的逻辑关系。 树型结构是结点之间有分支,并且具有层次关系的结构,它非常类似于自然界中的树。树结构在客观世界中是大量存在的,例如家谱、…

空间数据结构笔记:层次包围盒树(Bounding Volume Hierarchy Based On Tree)

1 总览 层次包围盒树(BVH树)是一棵多叉树,用来存储包围盒形状。它的根节点代表一个最大的包围盒,其多个子节点则代表多个子包围盒。为了统一化层次包围盒树的形状,它只能存储同一种包围盒形状 2 AABB包围盒树&#x…

MyBatis解析全局配置文件

MyBatis解析全局配置文件 MyBaits基础应用: 文档:MyBatis 链接:http://note.youdao.com/noteshare?id5d41fd41d970f1af9185ea2ec0647b64 传统JDBC和Mybatis相比的弊病 传统JDBC ​ Connection conn null; PreparedStatement pstmt …