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都找不到才会被回收。
    在这里插入图片描述

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

在这里插入图片描述

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round #818 (Div. 2) A-C

人类智慧 A. 题意&#xff1a;求满足1<a,b<n且lcm(a,b)/gcd(a,b)<3的(a,b)的个数 转化 a/gcd*b*gcd<3 可以划归为1*2 1*1 2*1 3*1 1*3 则可以转变成一个统计倍数问题 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair&…

电脑最高可以装多少内存?电脑内存怎么装?

大家好&#xff0c;我是来自兼容性之家的&#xff01; 通常我们的家用电脑主机有8到16GB的运行内存。 极少数高端用户会使用32至64GB内存。 比较高端的工作站的内存在128GB左右。 同时&#xff0c;家用电脑的硬盘容量约为1TB。 那么你有没有想过一台电脑可以拥有的最大内存量…

Spring Boot 工程开发常见问题解决方案,日常开发全覆盖

本文是 SpringBoot 开发的干货集中营&#xff0c;涵盖了日常开发中遇到的诸多问题&#xff0c;通篇着重讲解如何快速解决问题&#xff0c;部分重点问题会讲解原理&#xff0c;以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题&#xff0c;既方便自己也方便他人&…

氮气柜常用的制作材质有哪些?

氮气柜主要用于存储对湿度敏感或需要在低氧环境中保存的精密部件、电子元器件、化学品、文物等&#xff0c;需要确保柜体的密闭性和内部环境的稳定&#xff0c;以防止氧化、受潮或变质。 常见的材质有冷轧钢板&#xff0c;冷轧钢板通过冷轧工艺使钢材组织更紧密&#xff0c;从而…

代码随想录算法训练营 Day31 贪心算法1

Day31 贪心算法1 理论基础 贪心算法的本质&#xff1a;找到每个阶段的局部最优&#xff0c;从而去推导全局最优 贪心的两个极端&#xff1a;要么觉得特别简单&#xff0c;要么觉得特别难 贪心无套路 不像二叉树、递归&#xff0c;有固定模式 贪心题目的思考方式 做题的时候…

漏洞挖掘 | SRC中信息收集姿势分享

前言 前前后后挖了四个月的EDUSRC&#xff0c;顺利从路人甲升到了网络安全专家&#xff0c;从提交的内容来看大部分还是以中低危为主&#xff0c;主打的就是弱口令和未授权。 在这过程中还是比较浮躁的&#xff0c;因此接下来的时间还是要好好沉淀一下自身的技术&#xff0c;学…

全局UI方法-弹窗二-列表选择弹窗(ActionSheet)

1、描述 定义列表弹窗 2、接口 ActionSheet.show(value:{ title: string | Resource, message: string | Resource, autoCancel?: boolean, confrim?: {value: string | Resource, action: () > void }, cancel?: () > void, alignment?: DialogAlignment, …

ubuntu下安装minconda

1.搜索清华源 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.搜索conda 3.选一个合适自己的下载到本地 4.将下载的文件传入到ubuntu中 bash Miniconda3-py311_23.11.0-1-Linux-x86_64.sh 安装 5.source ~/.bashrc 激活即可&#xff08;必要步骤&#xff09;

论文笔记:分层问题-图像共注意力问答

整理了2017 Hierarchical Question-Image Co-Attention for Visual Question Answering&#xff09;论文的阅读笔记 背景模型问题定义模型结构平行共注意力交替共注意力 实验可视化 背景 视觉问答(VQA)的注意力模型在此之前已经有了很多工作&#xff0c;这种模型生成了突出显示…

Ubuntu 系统下安装 Nginx

目录 一、Nginx是什么 ​二、Ubuntu 系统下安装 Nginx 1、安装包下载 2、上传服务器并解压缩 3、依赖配置安装 4、生成编译脚本 ​5、编译 6、开始安装 7、设置为随机自启动 7.1、创建 nginx.service 文件&#xff0c;将以下内容粘贴到文件中 7.2、将 nginx.service…

JAVA的NIO和BIO底层原理分析

文章目录 一、操作系统底层IO原理1. 简介2. 操作系统进行IO的流程 二、BIO底层原理1. 什么是Socket2. JDK原生编程的BIO 三、Java原生编程的NIO1. 简介2. NIO和BIO的主要区别3. Reactor模式4. NIO的三大核心组件5. NIO核心源码分析 一、操作系统底层IO原理 1. 简介 IO&#x…

3.亿级积分数据分库分表:ShardingSphere官方提供的平滑数据迁移方案介绍,有什么缺点呢?

前面的 2.亿级积分数据分库分表&#xff1a;增量数据同步之代码双写&#xff0c;为什么没用Canal&#xff1f; 博客中介绍了实现平滑数据迁移的两种方案&#xff1a;Canal监听MySQL的binlog、代码双写&#xff0c;也分别介绍了两种方案的实现原理及优缺点&#xff0c;最后基于…

BabySQL【2019极客大挑战】

知识点&#xff1a; 功能分析 登录界面一般是 where username and password 可以从username出手&#xff0c;注释掉and语句单引号闭合绕过 通过测试和报错信息发现是一个单引号读取输入可以单引号闭合绕过关键字过滤 or and 过滤 || &&替换双写绕过select from wher…

学习Fast-LIO系列代码中相关概念理解

目录 一、流形和流形空间&#xff08;姿态&#xff09; 1.1 定义 1.2 为什么要有流形? 1.3 流形要满足什么性质&#xff1f; (1) 拓扑同胚 (2) 可微结构 1.4 欧式空间和流形空间的区别和联系? (1) 区别&#xff1a; (2) 联系&#xff1a; 1.5 将姿态定义在流形上比…

ROUYI框架地址

1、原版系统地址与文档 https://gitee.com/dromara/RuoYi-Cloud-Plus?_fromgitee_search 源码地址 https://plus-doc.dromara.org/#/ruoyi-cloud-plus/home 后端地址 https://plus-doc.dromara.org/#/plus-ui/home 前端地址 前端代码地址&#xff1a; RuoYi-Vue-Plus: 多租户…

python机器学习-糖尿病数据挖掘_2024年版(三个实战案例,附代码数据)

作者Toby&#xff0c;原文来自公众号&#xff1a;python生物信息学&#xff0c;《python机器学习-糖尿病数据挖掘_2024年版》&#xff0c; 背 景 糖尿病医学描述&#xff1a;糖尿病是一组因胰岛素绝对或相对分泌不足和(或)胰岛素利用障碍&#xff0c;引起的碳水化合物、蛋白质…

142857,真的那么神秘吗?

揭开神秘学的面纱&#xff0c;掌握宇宙的法则&#xff0c;成为智慧的拥有者。 142857&#xff0c;一个看似普通的数字&#xff0c;却被认为是世界上最奇特的数、最恐怖的数、最诡异的数&#xff0c;因为它有如下的特性&#xff1a; 142857 1 142857 142857 2 285714 14…

多线程的学习1

多线程 线程是操作系统能够进入运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 进程&#xff1a;是程序的基本执行实体。 并发&#xff1a;在同一个时刻&#xff0c;有多个指令在单个CPU上交替执行。 并行&#xff1a;在同一时刻&#xff0c…

【EDA verilog 基础语法】

文章目录 前言一、逻辑值二、数字进制格式三、标识符四、数据类型1.寄存器类型&#xff1a;2.线网类型&#xff1a;3. 参数类型&#xff1a; 五、运算符1.算术运算符2.逻辑运算符3.条件运算符4.位运算符&#xff1a;5.移位运算符6.拼接运算符&#xff1a;7.运算符的优先级&…

系统分析师-数学与经济管理

系统架构设计师 系统架构设计师-软件开发模型总结 文章目录 系统架构设计师前言一、最小生成树二、最短路径三、网络与最大流量四、不确定型决策 前言 数学是一种严谨、缜密的科学&#xff0c;学习应用数学知识&#xff0c;可以培养系统架构设计师的抽象思维能力和逻辑推理能…