JVM理论知识

一、JVM内存结构

java的内存模型主要分为5个部分,分别是:JVM堆、JVM栈、本地栈、方法区还有程序计数器,他们的用途分别是:

  1. JVM堆:新建的对象都会放在这里,他是JVM中所占内存最大的区域。他又分为新生区还有老年区,刚new出来的对象放在新生区,等到内存不够的时候,再转移到老年区,这里面有一系列的GC算法,在后面讲到。
  2. JVM栈:他是以线程为单位进行存储的,所以他只对单个线程是可见的。JVM栈是基于栈的数据结构来存储的,每一个栈内元素是一个栈帧,一个方法被调用,就生成一个栈帧,栈帧里面保存着:局部变量表、操作栈、动态链接还有方法返回地址信息。
  3. 本地方法栈:jvm可以调用本地方法,通过JNI方法,这个区域就是用来保存本地调用的。
  4. 本地方法区(Method Area):本地方法区里面有方法常量池、保存类信息、保存方法信息的数据结构,在GC过程中,这里也是永久代数据保存的地方。
  5. 程序计数器:就像CPU的寄存器一样,他是记录线程切换时候机器码的行号和偏移量的,等方法回调能够正常回到方法。

0AFE4357-0574-426A-9B85-1B6ADAB4892C

二、JMM内存模型

Java的内存模型决定了线程间的通信方式,JMM的模型是由主存和本地内存构成,两个线程想要正常通行需要将本地内存中的变量刷到主存中,另一个线程才能正确读取得到,这个也是volitile关键词的原理所在。

JMM模型决定了线程见的通信,由于线程内的变量首先会存储在本地内存中,如果需要线程间通信,需要写入主存中,供其他线程读取。

由于JVM在执行程序时会产生重排序,所有需要引入volitile等关键词。

A5649FEC-33D3-4711-A776-1CB158A2E2B5

三、GC算法

1.可达性算法

1.1.引用计数算法

原理:对每个对象的引用计数,引用了则+1,释放了则-1;

1.2.GC root算法

给定一个GC root的集合的引用作为根出发, 通过引用关系遍历对象图,能被遍历到的(可达到的)对象就判定为存活, 其余对象(也就是没有被遍历到的)就自然被判定为死亡。

可以做GC root的是:

  1. 虚拟机栈(方法)中引用的对象;
  2. 类变量(静态变量)引用的对象;
  3. 常量引用的对象;
  4. JNI引用的对象;

2.GC算法

  1. 复制算法:从根集合开始扫描,将存活的对象复制到另一块空闲的区域
  2. 标记-清除算法:从根集合开始扫描,将存活的对象进行标记,将未标记的空间进行清空
  3. 标记-压缩算法:从根集合开始扫描,将存活的对象进行标记和清除,但清除后会将存活对象移动到空闲区域

对比:基于copy的算法适用于存活对象比较多的GC场景,Mark-sweep适合存活对象较少的场景。

copy based GC算法适合存活对象少的年轻代实现,mark-sweep GC算法适合再存活对象多的老年代实现。

四、GC回收器

衡量GC的指标主要是吞吐量、暂停时间。

吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间+垃圾收集时间)。比如:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

暂停时间是指一个时间段内应用程序线程暂停,让GC线程执行的状态。例如,GC期间100毫秒的暂停时间意味着在这100毫秒期间内没有应用程序线程是活动的。

GC回收器的种类:

(1)serial回收器:就是在GC回收的时候工作线程暂定,他是一个串行的回收器;

(2)parallel回收器:就是GC回收器是并发执行的,因此提升了GC的吞吐量,GC过程中会stop the world;

(3)CMS,他的全程是concurrent mark sweep,他的主要优势是在GC回收大多数时候不需要stop the world;

(4)G1:这个是从JDK7后推出的新的GC,在JDK1.9成为了默认的GC回收器;

9EF569E1-911B-4E92-80C1-36CE1626DD41

1.CMS回收器

CMS是并发标记清除GC回收器件,其目标是\获取最短GC停顿时间**,比较符合大型web server项目的使用场景。其GC阶段经过4个阶段:

  1. 初始标记:初始标记又GC root引用的对象,该过程会引发STW;
  2. 并发标记:这个是不需要STW,并发标记要回收的对象;
  3. 重新标记:这个节点重新标记并发阶段产生的新的要回收的对象;
  4. 并发清除;并发清除标记的要回收的对象;

8D5B5729-80F3-4DFB-954B-894679655185

CMS总结:

  1. 优点:(1)并发处理效率高;(2)GC的时候不会整体停顿STW,有效降低处理时延。
  2. 缺点:(1)并发清理时会降低CPU性能;(2)标记-清理可能会造成大量内存碎片;(3)并发清理阶段还会产生垃圾,这种垃圾称为浮动垃圾,需要下一次GC时才能清理掉。

2.G1回收器

G1回收器会将区域划分为region,每个region可以是新生代也可以是老年代,通过控制对region的回收,做到对垃圾回收导致的STW可控。垃圾回收的阶段前3个阶段和CMS一致,只是最后一个节点需要通过混合清除来回收新生代和老年代所有的对象:

  1. 初始标记;标记GC root对象,需要暂停所有用户线程,该过程会引发STW;
  2. 并发标记;标记GC root可达的对象。
  3. 最终标记;标记在并发标记阶段产生的需回收对象。
  4. 筛选回收:对各个Region的回收成本和价值进行排序,根据用心要求的GC停顿时间来选择需要GC的Region。

0E8450B5-984A-45DF-BEE6-6ABE93D82302

G1总结:

  1. 优点:(1)并发处理效率高;(2)整体停顿STW的时间可控;(3)新生掉和老年代都分为逻辑上的region,通过GC的复制算法解决内存碎片的问题;
  2. 缺点:引入了Remembered Set来保存内存引用信息,所以增加了内存占用,所以G1一般在大内存的服务端环境使用,起步内存大小为8G。

3.对比总结

总结:

  1. 选择GC主要考虑的是使用场景,一般嵌入式、内存较小的选择串行GC回收器;
  2. 对于需求吞吐量大的常见可以选择并行GC回收器;
  3. 对于需要时延少的场景可以选择CMS或者G1回收器;
  4. CMS回收器整体更侧重增大吞吐量,G1回收器整体是平衡了降低时延和增大吞吐量的要求;

对比:

  1. serial GC垃圾回收器:serial GC就是串行的GC
  2. CMS GC垃圾回收器:CMS经过(1)初始标记;(2)并发标记;(3)重新标记;(4)并发清除;四个阶段来完成
  3. G1 GC垃圾回收期:G1回收会将区域划分为region,G1通过(1)初始标记;(2)并发标记;(3)最终标记;(4)筛选回收;四个阶段完成,其中阶段四可以计算每个region的耗时来权衡总耗时,来达到一个平衡。总之回收时间可控;

五、对象实例化的过程

首先我们要明白JVM的作用是什么,那就是将.class文件加载到内存,并且实例化成对象,在实例化成对象的过程中,需要有哪些操作呢?

在进入这一步之前需要一些前置知识,包括java的54种引用类型和引用在内存中的指向等:

java引用的4种类型

(1)强引用:利用这种方式创建的对象是强应用,Object obj = new Object();这种引用在gc时候不会回收;

(2)软引用:软引用在一次gc时候不会回收,之后不一定??

(3)弱引用:弱引用在gc时候一定会被gc;

(4)虚引用:这个用的不多,所以不了解;

栈中引用指向堆中对象

对象实例化的过程:

(1)在new一个新的对象时,想在本地方法区中找是否有对于的类元信息,有的话直接调用相应的classloader进行加载,没有的话委托给他的父级classloader进行查找,这一步主要是将字节码文件通过字节流的心事加载进来;

(2)为对象分配内存空间。由于对象是存储在堆中,而引用是存在jvm栈中,所以栈中引用需要通过指针的方式只想堆中相应对象,这一步是需要在堆和栈中为对象分配内存空间。

(3)设置默认值和初始化。每一个基本数据都有默认值,所以在这一步,需要为变量设置默认值,同时为成员变量进行初始化操作。


参考资料

  1. JVM内存模型(JVMMM):https://www.huaweicloud.com/zhishi/arc-12588701.html
  2. JVM之配置参数详解和调优总结(二):https://www.huaweicloud.com/articles/b86de23d6c3d5a161b25b1013a388d8d.html
  3. jstat命令查看jvm的GC情况 (以Linux为例):http://blog.itpub.net/31543790/viewspace-2657093/
  4. JVM的架构与知识脉络图:https://mp.weixin.qq.com/s/RxzAePMS3ZSnqUY6cj6i7Q
  5. 《深入理解java虚拟机》
  6. ClassLoader讲的不错:https://juejin.im/post/5c04892351882516e70dcc9b?utm_source=gold_browser_extension
  7. 参考资料:https://mp.weixin.qq.com/s?src=11&timestamp=1638361551&ver=3470&signature=Gmx2ox8EgDaJsmgMjMMcQb9v87rY-5z9dx*YUJa62leRyG0FI7gXk9eU55UiHMWJ6NYs-7W8GRh2328dZ3mBCbr7O-rFCdNNwYT-8tfe*Ypw8wQ2vpTRfL2nN-28qgBx&new=1
  8. 弄明白CMS和G1,就靠这一篇了:https://cloud.tencent.com/developer/article/1647637
  9. JVM:(十六)垃圾回收器:https://blog.csdn.net/sd_960614/article/details/126900380

    本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

十、RabbitMQ集群

一、clustering 1、 使用集群的原因 单台RabbitMQ遇到内存崩溃、机器故障等情况会导致服务不可用单台RabbitMQ只能满足每秒1000条的消息吞吐量 2、搭建步骤 1、准备三台虚拟机 2、修改3台机器的主机名称 分别为node1、node2、node3 vi /etc/hostname 3、配置节点的hosts文…

PostgreSQL父子建表查询所有的子数据-利用自定义函数查询

pgsql 函数查询代码 select find_space_tree_list_by_nodeid(1,1) 查询结果示意图 获取子集函数代码 CREATE OR REPLACE FUNCTION "public"."find_space_tree_list_by_nodeid"("nodeid" varchar, "viewid" varchar)RETURNS "…

使用StorageClass动态创建pv

rook-ceph安装部署到位后,就可以开始来尝试使用StorageClass来动态创建pv了。 有状态的中间件在kubernetes上落地基本上都会用到StorageClass来动态创建pv(对于云上应用没有那么多烦恼,云硬盘很好用,但是对于自己学习和练习来说还…

DataWhale 机器学习夏令营第三期

DataWhale 机器学习夏令营第二期 学习记录一 (2023.08.18)1.赛题理解2.缺失值分析3. 简单特征提取4. 数据可视化离散变量离散变量分布分析 DataWhale 机器学习夏令营第三期 ——用户新增预测挑战赛 学习记录一 (2023.08.18) 已跑通baseline,换为lightgbm基线&#…

SpringCloud Ribbon中的7种负载均衡策略

SpringCloud Ribbon中的7种负载均衡策略 Ribbon 介绍负载均衡设置7种负载均衡策略1.轮询策略2.权重策略3.随机策略4.最小连接数策略5.重试策略6.可用性敏感策略7.区域敏感策略 总结 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端…

无涯教程-PHP.INI File Configuration函数

PHP配置文件php.ini是影响PHP功能的最终且最直接的方法。每次初始化PHP时都会读取php.ini文件。换句话说,无论是模块版本的httpd重新启动还是CGI版本的每次脚本执行都重新启动。如果未显示您的更改,请记住停止并重新启动httpd。 该配置文件已注释完整。键区分大小写,关键字值不…

使用mysql:5.6和 owncloud 镜像,构建一个个人网盘

一.拉取镜像 docker pull mysql:5.7 docker pull owncloud 二.创建容器 1.MySQL容器 docker run -d --name db1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456. -e MYSQL_DATABASEowncloud -e MYSQL_USERowncloud -e MYSQL_PASSWORDowncloud mysql:5.7 docker run: 创建和运行…

中英双语对话大语言模型:ChatGLM-6B

介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。…

【Kubernetes】Rancher管理集群

目录 1、安装 rancher 2、登录 Rancher 平台 3、Rancher 管理已存在的 k8s 集群 4、Rancher 部署监控系统 5、使用 Rancher 仪表盘管理 k8s 集群 以创建 nginx 服务为例 创建名称空间 namespace 创建 Deployment 资源 创建 service 1、安装 rancher 在 所有 node 节点下…

利用屏幕水印学习英语单词,无打扰英语单词学习

1、利用屏幕水印学习英语单词,不影响任何鼠标键盘操作,不影响工作 2、利用系统热键快速隐藏(ALT1键 隐藏与显示) 3、日积月累单词会有进步 4、软件下载地址: 免安装,代码未加密,安全的屏幕水印学习英语…

Visual Studio 2019 c++ 自定义注释 ----doxygen

可加入C 也可自定义。 <?xml version"1.0" encoding"utf-8"?> <CodeSnippets xmlns"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"><CodeSnippet Format"1.0.0"><Header><Title>注释…

深入理解Java线程

进程、线程和协程 进程 程序由指令和数据组成&#xff0c;但程序要运行就要将指令加载进CPU以及数据加载进内存&#xff0c;并且在指令运行过程中可能还会用到磁盘、网络等设备。进程就是用来加载指令、管理内存和IO的。当一个程序被运行&#xff0c;从磁盘加载这个程序的代码…

08-信息收集-架构、搭建、WAF等

信息收集-架构、搭建、WAF等 信息收集-架构、搭建、WAF等一、前言说明二、CMS识别技术三、源码获取技术四、架构信息获取技术五、站点搭建分析1、搭建习惯-目录型站点2、搭建习惯-端口类站点3、搭建习惯-子域名站点4、搭建习惯-类似域名站点5、搭建习惯-旁注&#xff0c;c段站点…

微信小程序使用npm引入三方包详解

目录 1 前言2 微信小程序npm环境搭建2.1 创建package.json文件2.2 修改 project.config.json2.3 修改project.private.config.json配置2.4 构建 npm 包2.5 typescript 支持2.6 安装组件2.7 引入使用组件 1 前言 从小程序基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或…

Redis高可用:主从复制详解

目录 1.什么是主从复制&#xff1f; 2.优势 3.主从复制的原理 4.全量复制和增量复制 4.1 全量复制 4.2 增量复制 5.相关问题总结 5.1 当主服务器不进行持久化时复制的安全性 5.2 为什么主从全量复制使用RDB而不使用AOF&#xff1f; 5.3 为什么还有无磁盘复制模式&#xff…

Three.js 实现模型材质局部辉光(发光,光晕)效果和解决辉光影响场景背景图显示的问题

1.Three.js 实现模型材质局部辉光&#xff08;发光&#xff0c;光晕&#xff09;效果 2.解决辉光效果影响场景背景图显示的问题 相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组…

LVS+Keepalived

本章结构 1、Keepalived概述 2、Keepalived体系&#xff0c;主要的模块 3、Keepalived工作原理 4、LVSKeepalived的部署 一、Keepalived概述 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 vrrp通信原理&#…

学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答

课后练习解答 增加按键3&#xff0c;按下后表示启动&#xff0c;选择的对应的功能的LED持续闪烁&#xff0c;表示正在工作&#xff0c;且在工作的时候无法切换功能。 需求分解 1 增加按键3 #define KEY3 P34 //增加按键32 按下后表示启动 电平控制3 工作状态锁定 表示正在…

2023国赛数学建模A题B题C题D题资料思路汇总 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022年数学建模c题思路_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛a题题目_UST数模…