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.mzph.cn/news/54540.shtml

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

相关文章

2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;最长上升子序列 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 &…

【中危】Apache Ivy<2.5.2 存在XXE漏洞 (CVE-2022-46751)

漏洞描述 Apache Ivy 是一个管理基于 ANT 项目依赖关系的开源工具&#xff0c;文档类型定义(DTD)是一种文档类型定义语言,它用于定义XML文档中所包含的元素以及元素之间的关系。 Apache Ivy 2.5.2之前版本中&#xff0c;当解析自身配置、Ivy 文件或 Apache Maven 的 POM 文件…

设计模式--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

leetcode:338. 比特位计数(python3解法)

难度&#xff1a;简单 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0…

RedisDesktopManager(redis客户端,可输入用户名密码)

RedisDesktopManager&#xff08;redis客户端&#xff0c;可输入用户名密码&#xff09; Redis桌面管理器&#xff08;又名RDM&#xff09; - 是一个用于Windows&#xff0c;Linux和MacOS的快速开源Redis数据库管理应用程序。可以使用url连接或账号密码。 redis设置账号密码后…

[论文阅读笔记26]Tracking Everything Everywhere All at Once

论文地址: 论文 代码地址: 代码 这是一篇效果极好的像素级跟踪的文章, 发表在ICCV2023, 可以非常好的应对遮挡等情形, 其根本的方法在于将2D点投影到一个伪3D(quasi-3D)空间, 然后再映射回去, 就可以在其他帧中得到稳定跟踪. 这篇文章的方法不是很好理解, 代码也刚开源, 做一…

嵌入式设备应用开发(发现需求和提升价值)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 很多做技术的同学,都会陷入到技术的窠臼之中。对于如何做具体的产品、实现具体的技术,他们可能很感兴趣。但是做出来的东西做什么用,或者说是有没有竞争力,事实上他们不是很关心…

身为一个后端程序员如何快速制作后端管理系统的UI

前言 我的专业领域在后端开发上&#xff0c;前端我仅仅是熟悉&#xff0c;但是要从头开发一个前端UI界面有点难为人了。那么身为一个后端程序员我们怎么来开发后端管理系统UI界面呢&#xff1f; 方案1&#xff1a;现成的模版来套&#xff08;有一定的前端基础&#xff0c;只是…

搭建开发环境-Mac

概述 上一篇搭建开发环境-WSLUbuntu 记录了WSL 和Ubuntu 下开发环境的搭建。这一篇就说下Mac开发环境的搭建。 就像很多人误以为Mini 是专为女孩子设计的高颜值车&#xff0c;其实是一辆极其hardcore 的拉力车一样。 很多人都被Mac 那高颜值蒙蔽了&#xff0c;其实这是一台生产…

基于swing的旅游管理系统java jsp旅行团信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的旅游管理系统 系统有1权限&#xff1a;管…

flask获取请求对象的get和post参数

前言 get请求参数是在URL里面的&#xff0c;post请求参数是放在请求头里面的 get请求&#xff1a; index_page.route("/get") def get():var_a request.args.get("a", "jarvis")return "request:%s,params:%s,var_a:%s" %(request…

上传镜像到阿里云的ACR

1、开通阿里云ACR 2、在ACR 中创建命名空间 3、本地安装docker 4、登录到 开通ACR&#xff0c;需要配置访问凭证 [rootmaster ~]# docker login --username***lb registry.cn-beijing.aliyuncs.com Password: 5、给镜像打标签 [rootmaster ~]# docker images REPOSITORY …

【中危】Apache XML Graphics Batik<1.17 存在SSRF漏洞 (CVE-2022-44729)

zhi.oscs1024.com​​​​​ 漏洞类型SSRF发现时间2023-08-23漏洞等级中危MPS编号MPS-2022-63578CVE编号CVE-2022-44729漏洞影响广度极小 漏洞危害 OSCS 描述Apache XML Graphics Batik 是一个开源的、用于处理可缩放矢量图形(SVG)格式图像的工具库。 受影响版本中&#xff0…

prometheus + grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…

Jupyter Notebook 配置根目录

注&#xff1a;本文是在 Windows 10 上配置 Jupyter Notebook 打开的默认根目录&#xff0c;Linux 同。 步骤一&#xff1a;创建 Jupyter Notebook 配置文件 使用以下命令创建 Jupyter Notebook 配置文件&#xff08;如果尚未创建&#xff09;&#xff1a; jupyter notebook …

python连接Microsoft SQL Server 数据库

python代码 Author: tkhywang 2810248865qq.com Date: 2023-08-21 11:22:24 LastEditors: tkhywang 2810248865qq.com LastEditTime: 2023-08-21 11:29:30 FilePath: \PythonProject02\Microsoft SQL Server 数据库.py Description: 这是默认设置,请设置customMade, 打开koroFi…

Spring boot(一)

Spring Boot是一个构建在Spring框架顶部的项目。它提供了一种简便&#xff0c;快捷的方式来设置&#xff0c;配置和运行基于Web的简单应用程序。 它是一个Spring模块&#xff0c;提供了 RAD(快速应用程序开发)功能。它用于创建独立的基于Spring的应用程序&#xff0c;因为它需…

第61步 深度学习图像识别:多分类建模(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 截至上期&#xff0c;我们一直都在做二分类的任务&#xff0c;无论是之前的机器学习任务&#xff0c;还是最近更新的图像分类任务。然而&#xff0c;在实际工作中&#xff0c;我们大概率需要进行多分类任务。例如肺部胸片可不仅仅能诊断…

基于Java+SpringBoot+Vue前后端分离图书电子商务网站设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

css滚动条的使用

前言&#xff1a; css滚动条的使用。 1、使用案例1&#xff1a;背景不要&#xff0c;只展示一个滚动条 如果是默认整体&#xff0c;::就够用了&#xff0c;如果是某个元素&#xff0c;可以 .abc:: ,如果是scss这种的 &:: ::-webkit-scrollbar {width: 6px; } ::-webkit…