JVM篇详细分析

JVM总体图

JVM总体图在这里插入图片描述

程序计数器
线程私有的,每个线程一份,内部保存字节码的行号,用于记录正在执行字节码指令的地址。(可通过javap -v XX.class命令查看)
java堆
线程共享的区域,用来保存对象的实例,数组等。堆区域内存不够的场景下会爆出OOM异常。java8中堆里面分为年轻代和老年代,其中年轻代又分为Eden,S0,S1。老年代一般保存声明周期比较长的对象,年轻代中经过多次垃圾回收的survivor会进入老年代。
虚拟机栈
每个线程运行时所需要的内存就是虚拟机栈,特性为先进后出,每个栈由多个栈针组成,每个栈针对应其方法调用所需要的内存(参数,返回地址等)。每个线程中只能有一个活动栈针,对应当前正在执行的方法。 垃圾回收不涉及栈内存,垃圾回收只是堆内存,当栈针弹出后,内存就被自动释放了。一个栈默认内存为1024K。一般递归调用不恰当的话会爆出java.lang.StackOverflowError问题。
方法区/元空间
方法区是各个线程共享的内存区域,其主要存储类的信息和运行时常量池(可通过javap -v查看,主要是一张表,虚拟机根据这张常量表找到要执行的类名、方法名、常量信息等)。虚拟机启动时创建该区域,关闭时自动释放,当内存不够的时候,会报出异常OutOfMemoryError:Metaspace。
直接内存
并不属于虚拟机的内存结构,其属于操作系统的内存,不由JVM进行管理,常见于NIO操作,用于数据缓冲区。分配回收成本高,读写性能高。该内存区域系统可以访问,java代码也可以访问,用于java代码完成文件拷贝等操作。
类加载器
作用是将字节码文件加载到JVM中。主要分为四类:

  • 启动类加载器主要负责加载核心类
  • 扩展类加载器主要负责加载jre/lib/ext文件夹下的内容
  • 应用类加载器主要负责加载自己定义的类
  • 自定义类加载器主要负责自己实现定义类加载规则

类加载时的双亲委派机制(应用->扩展->启动)可以避免某一个类被重复加载,当父类被加载后无需重复加载,保证了唯一性。
垃圾回收
垃圾回收主要是指堆中的对象。如果一个对象没有任何引用指向他了,就可以被定为垃圾。

  • 引用计数法:每被引用一次增加计量次数,为零则可回收。
  • 可达性分析:GC root出发遍历,看能不能找到,找不到的话就是垃圾。

垃圾回收算法

  • 标记清除算法:速度较快,但容易内存碎片化。
  • 复制算法:将整个内存分为了两个相等的区域,存活对象复制另一个区域。要两块空间,内存使用率较低。
  • 标记整理算法:标记清除后统一移动整理到连续空间,效率较低。

JVM的分代回收
java8中堆中的新生代和老年代比例为1:2。其中新生代里面又分为8:1:1。回收大体过程(最多15次)(AB->C)->(AC->B)。

  • MinorGC:发生在新生代。STOP-THE-WORLD(STW),暂停所有线程,等待垃圾回收完成。
  • Mixed GC:新生代+部分老年代垃圾回收。
  • FullGC:新生代+完整老年代,STW时间长,应尽量避免。

垃圾回收器

  • 串行垃圾回收器:Serial等,STOP-THE-WORLD(STW),暂停所有线程,等待垃圾回收完成。
  • 并行垃圾回收器:Parallel(JDK8默认)等,STOP-THE-WORLD(STW),暂停所有线程,等待垃圾回收完成
  • G1(JDK9后默认
  • GMS(并发垃圾回收器):使用标记清除算法,针对老年代。

G1垃圾回收器(JDK9后默认
划分多个区域,每个区域都可以分为Eden、survivor、old、humongous(用于存储大对象)区域。该回收器采用复制算法

  • 年轻代垃圾回收:Eden->survivor,采用复制算法,要STW。
  • 年轻代垃圾回收+并发标记:当老年代占比内存超过45%后会触发并发标记。
  • 混合收集:优先收集垃圾较多的old区域。

四种引用类型

  • 强引用:只有所有的GC root都找不到才会被回收。
    在这里插入图片描述

  • 软引用:强引用对像所关联的对象引用,内存不足时仅有软件用引用的对象可被回收。

在这里插入图片描述

  • 弱引用:垃圾回收时,不论内存是否充足,都会被回收。
    在这里插入图片描述

  • 虚引用:配合队列使用,当被回收时,释放外部资源。在这里插入图片描述

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

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

相关文章

搭建企业微信知识库,这些注意事项你必须知道

| 企业微信知识库是什么? 简单来说,企业微信知识库就是一个集中存储、管理和分享企业内部信息的置于企业微信中的系统。你可以把它想象成一个超级大的“资料库”,里面装满了公司的各种知识、文档、流程、经验等等。这个“资料库”不仅方便员工…

劳保鞋厂家与您聊聊:从事电力行业工作人员穿什么功能的劳保鞋

电力行业属于危险系数较高的行业,工作人员在工作中面临电力的潜在危险,如电击、高温、机械伤害、高空作业等风险。这就要有专业的安全设备,才能尽可能的保护电力工作人员的安全,真真正正起到防范的作用。因此,穿着合适…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)、logisim工具

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费,70元。据说可以导出 Verilog ! logisim及其衍生版本 都需要安装java环境。 http://www.cburch.com/logisim/ 是原版, 下载页面&#…

Java的静态代理与jdk动态代理

代理 我们经常利用代理进行解耦以及控制对实际对象的访问等工作。例如,我们可以通过代理对方法的调用进行更精细的控制(例如加上日志、权限控制等),而无需修改实际对象的代码。代理的作用是无侵入式的给代码增加功能。有些事情是…

【分布式】——CAPBASE理论

CAP&BASE理论 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/tree-learning-notes ⭐⭐⭐⭐⭐⭐ Spring专栏👉https://blog.csdn.net/weixin_53580595/category_12279588.html Sprin…

物联网实战--入门篇之(一)物联网概述

目录 一、前言 二、知识梳理 三、项目体验 四、项目分解 一、前言 近几年很多学校开设了物联网专业,但是确却地讲,物联网属于一个领域,包含了很多的专业或者说技能树,例如计算机、电子设计、传感器、单片机、网…

C++万物起源:类与对象(二)

一、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗? 并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。 默认成员函数:用户没有显式实现,…

DataX-Oracle新增writeMode支持update

目录 前言 第一步下载源码 第二步修改源码 1、Oraclewriter 2、WriterUtil 2.1、修改getWriteTemplate方法 2.2、新增onMergeIntoDoString与getStrings方法 3、CommonRdbmsWriter 3.1、修改startWriteWithConnection 3.2、修改doBatchInsert 3.3、修改fillPreparedStatem…

红酒:红酒分类与消费者教育的重要性

在红酒的世界里,品种繁多,口感各异。对于消费者而言,了解红酒的分类以及接受相关的消费者教育至关重要。云仓酒庄雷盛红酒作为业界的持续发展者,深知这一点,致力于为消费者提供品质的教育内容,帮助他们更好…

Verilog语法之case语句学习

case分支语句是一种实现多路分支控制的分支语句。与使用if-else条件分支语句相比,采用case分支语句来实现多路控制会变得更加的方便直观。 case分支语句通常用于对微处理器指令译码功能的描述以及对有限状态机的描述。Case分支语句有“case”、“casez”、“casex”…

MybatisPlus学习总结

MybatisPlus.xmind 一、MybatisPlus快速入门 1.基本介绍 官网: 简介 | MyBatis-Plus MyBatis Plus是一个基于MyBatis的增强工具,它简化了MyBatis的使用,提供了一系列的增强功能,使开发更加方便快捷。 MyBatis Plus的主要特点包括&#xff…

3月23日笔记

广播域与泛洪范围是相同的 广播:在同一个泛洪范围内,强迫交换机泛洪(主动) 泛洪(被动) ARP的工作原理:ARP先通过广播发送请求包,所有收到该广播包的设备都会将其中的源IP和源MAC相…

《Vision mamba》论文笔记

原文出处: [2401.09417] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model (arxiv.org) 原文笔记: What: Vision Mamba: Efficient Visual Representation Learning with Bidirectional St…

【Python】#2 基本数据类型

文章目录 一、数字类型1. 整数类型2. 浮点数类型tips&#xff1a;为什么浮点数计算的小数部分经常“错误”&#xff1f;如 为什么0.10.20.3在计算机中不为真 3. 复数形式<classcomplex>4. 数字类型的操作符与部分函数tips: 数字类型的类型提升tips:Python中除法 基本数据…

电商控价的效果有哪些

品牌在做价格治理时&#xff0c;肯定是不再希望线上平台出现低价、窜货链接&#xff0c;但现实却难如品牌所愿&#xff0c;有几个难以实现的原因&#xff0c;首先&#xff0c;电商平台链接上架下架是很容易的&#xff0c;此刻将链接治理下架&#xff0c;下一刻店铺可能又会再上…

《QT实用小工具·二》图片文字转base64编码

1、概述 源码放在文章末尾 base64编码转换类 图片转base64字符串。base64字符串转图片。字符转base64字符串。base64字符串转字符。后期增加数据压缩。Qt6对base64编码转换进行了重写效率提升至少200%。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifn…

python pytz是什么

pytz模块常用于时区的转换&#xff0c;常常配合datetime一起使用。我们知道datetime除了data方法生成的时间是没有时区概念&#xff0c;其他如time、datetime等都是有时区概念&#xff0c;即指定了tzinfo信息。 >>> import datetime >>> datetime.datetime.n…

【机器学习】深入探讨基于实例的学习及K-最近邻算法

深入探讨基于实例的学习及K-最近邻算法 在机器学习的众多策略中&#xff0c;基于实例的学习方法因其简单性和高效性而备受关注。这种方法的核心理念在于利用已知的数据实例来预测新数据的标签或属性。本文将深入探讨其中的两个重要概念&#xff1a;最近邻算法和K-最近邻算法&a…

浏览器工作原理与实践--块级作用域:var缺陷以及为什么要引入let和const

在前面《07 | 变量提升&#xff1a;JavaScript代码是按顺序执行的吗&#xff1f;》这篇文章中&#xff0c;我们已经讲解了JavaScript中变量提升的相关内容&#xff0c;正是由于JavaScript存在变量提升这种特性&#xff0c;从而导致了很多与直觉不符的代码&#xff0c;这也是Jav…

考研数学|高效刷透汤家凤《1800》经验分享

当然不需要换老师&#xff0c;如果你在基础阶段连汤老师的课都听不进去&#xff0c;那么换其他老师的话&#xff0c;很大可能也是白搭。 如果你现在对于1800还是一筹莫展的话&#xff0c;那么很明显&#xff0c;这反映出前期基础不扎实&#xff0c;没有真正理解和掌握这部分内…