JVM知识总结(内存结构)

news2024/12/23 17:46:56

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

内存模型

内存结构

堆:

  • 存放对象实例, 几乎所有的对象实例以及数组都在这里分配内存。

虚拟机栈:

  • 栈帧:用于支持虚拟机进行方法执行的数据结构。
    • 存储了方法的局部变量表, 操作数栈,动态连接和返回地址等地址。
    • 每个方法从调用到执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。
    • 栈内存为线程私有的空间, 每个线程都会创建私有的栈没存, 生命周期与线程相同。
    • 除了一些 Native方法调用是通过本地方法栈实现的, 其他所有Java方法调用都是栈来实现的。

本地方法栈:

  • 和虚拟机栈非常相似,区别如下:

    • 虚拟机栈执行 Java 方法服务。

    • 本地方法栈使用到的 Native方法(例如 C++ 程序)服务。

方法区:

  • 各个线程共享的内存区域。
  • 存储已经被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据。
  • 具体实现: 永久代,元空间。

永久代和元空间的区别:

  • JDK1.8之前是永久代。

  • JDK1.8之后是元空间。

  • 存储位置:

    • 永久代使用的内存区域是 JVM进程所使用的区域,大小受 JVM的大小限制。
    • 元空间使用的是物理内存区域,元空间大小只受物理内存大小的限制。
  • 存储内容不同:

    • 永久代主要存储方法区存储内容中的数据。
    • 元空间只存储类的元信息,而静态变量和运行时常量池都在堆中。

程序计数器:

  • 一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。
  • 每条线程都有一个独立的程序计数器,各线程之间的计数器互不影响,为线程私有。

程序计数器的作用:

  • 多线程的情况下,用来记录当前执行的位置,当线程切换回来时能正确运行。
  • 字节码解释器通过改变程序计数器来以此读取指令,从而实现代码的流程控制: 如: 选择, 循环, 顺序执行, 异常处理等。

程序计数器是唯一不会出现OutOfMemoryError异常的内存区域,其生命周期随着线程的创建而生,线程的销毁为亡。

在这里插入图片描述

在这里插入图片描述

堆结构

基于分代收集理论设计,分为年轻代和老年代,其中年轻代又分为Eden区和Survivor 0区和Survivor 1区(Survivor0和Survivor1也叫From和To区)

  • 默认情况下,老年代占总的堆内存的2/3,年轻代占1/3

在这里插入图片描述

什么E:S0:S1默认是8:1:1

新生代中有98%的对象是朝生夕灭的,每次MionrGC后存活的对象应该小于等于2%。

所以采用复制算法的新生代似乎可以不用将内存分成大小相等的两块了,但考虑到实验偏差以及实际情况的多样性。

默认预留了10%的内存用于存放存活对象。

堆内存大小

初始内存默认为电脑物理内存大小的1/64,最大内存默认为电脑物理内存的1/4,但是堆空间的大小可以调节。

符号引用

在JVM中,一个类的方法名、类名、修饰符、返回值等等都是一系列的符号,而这些符号都是一个个的常量,存储在常量池中。

同时这些个符号被加载到内存后,都有对应的内存地址,而这些内存地址就是直接引用。

动态链接

符号引用一部分会在类加载阶段或者第一次使用的时候就被转化为直接引用,这种转化被称为静态解析。

另外一部分将在每一次运行期间都转化为直接引用,这部分就称为动态连接。

方法出口

方法出口就是方法执行完成后,需要返回的一些信息。

一般来说,方法正常退出时,方法的PC计数器的值就可以作为返回地址,栈帧中很可能会保存这个计数器值。

而方法异常退出时,返回地址是要通过异常处理器表来确定的,栈帧中就一般不会保存这部分信息。

操作数栈

就是存放方法运行过程中产生的一些临时数据,目的是为了计算,以栈的数据结构进行存储。

局部变量表

方法内部的变量都是存放在局部变量表中。

如果是对象类型,局部变量表中存放的是堆给对象分配的内存地址,也就是指针,而不是对象直接存在局部变量表中。

元空间

在JDK1.7之前,HotSpot 虚拟机把方法区当成永久代(方法区的落地实现)来进行垃圾回收。

JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,而不是虚拟机内存中。

HotSpots取消了永久代,那么是不是也就没有方法区了呢?

  • 不是,方法区是一个规范,规范没变,它就一直在,只不过取代永久代的是元空间(Metaspace)而已。

它和永久代有什么不同的?

存储位置不同:

  • 永久代在物理上是堆的一部分,和新生代、老年代的地址是连续的,而元空间属于本地内存。

存储内容不同:

  • 在原来的永久代划分中,永久代用来存放类的元数据信息、静态变量以及常量池等。
  • 现在类的元信息存储在元空间中,静态变量和常量池等并入堆中,相当于原来的永久代中的数据,被元空间和堆内存给瓜分了。

在这里插入图片描述

为什么要废弃永久代,引入元空间?

在原来的永久代划分中,永久代需要存放类的元数据、静态变量和常量等。

它的大小不容易确定,因为这其中有很多影响因素,比如类的总数,常量池的大小和方法数量等,-XX:MaxPermSize 指定太小很容易造成永久代内存溢出。

移除永久代是为融合HotSpot VM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。

  • 永久代会为GC带来不必要的复杂度,并且回收效率偏低。

废除永久代的好处:

由于类的元数据分配在本地内存中,元空间的最大可分配空间就是系统可用内存空间,不会遇到永久代存在时的内存溢出错误。

将运行时常量池从PermGen分离出来,与类的元数据分开,提升类元数据的独立性。

将元数据从PermGen剥离出来到Metaspace,可以提升对元数据的管理同时提升GC效率。

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

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

相关文章

Candance Allegro 入门教程笔记:如何绘制原理图和原理图库?

文章目录 一、用 Capture CIS 17.4 绘制原理图库 一、用 Capture CIS 17.4 绘制原理图库 1、安装完Candance Allegro 17.4后,我们所需的原理图工具以及PCB工具如下图所示:【Capture CIS 17.4】和【PCB Editor 17.4】 2、打开原理图工具:Captu…

React性能之--如何避免组件重复渲染?

在react中,我们会发现存在组件会重复渲染,虽然说如果项目不大的话,这点影响不大,但是我们还是尽量避免组件渲染比较好,养成好习惯,尽可能让不管是大小项目,都让性能尽可能优化 。那我们如何避免…

Spring-创建bean

preInstantiateSingletons v1.0 preInstantiateSingletons tips:最终调用getBean使用的是RootBeanDefinition进行构建的 public void preInstantiateSingletons() throws BeansException {if (logger.isTraceEnabled()) {logger.trace("Pre-instantiating sin…

圣诞节星星飘落的效果(微信小程序版)

圣诞节快到啦~🎄🎄🎄🎄咱们也试着做做小程序版本的星星✨飘落效果吧 在微信小程序内如何实现雪花飘落,星星飘落的效果呢~ 先来个效果图: 1576672109245.gif 一步一步来:…

【稳定ACM出版、EI检索|武汉场线上线下结合】2024年第五届医学人工智能国际学术会议(ISAIMS 2024,8月13-17)

第五届医学人工智能国际学术会议(ISAIMS2024)将于2024年8月13-17日于荷兰阿姆斯特丹自由大学召开,国内分会场将于2024年10月25-27日于中国武汉召开。 本届会议将继续围绕人工智能在医学领域的最新研究成果,为来自国内外高等院校、…

智能化的Facebook未来:AI如何重塑社交网络的面貌?

随着人工智能(AI)技术的飞速发展,社交网络的面貌正在经历深刻的变革。Facebook(现Meta Platforms)作为全球最大的社交媒体平台之一,正积极探索如何利用AI技术来提升用户体验、优化内容管理并推动平台创新。…

全红婵夺冠后答记者问,太风趣了

8月6日晚,在巴黎结束的跳水女子10米台比赛中,17岁的中国选手全红婵以425.60分的高分成功卫冕,帮助中国代表团获得第22枚金牌。赛后采访时有记者想煽情,故意问到全红婵的哥哥来现场为她加油,结果小女子竟然毫无表情地回…

【python】Pandas处理Excel表格用法分析与最佳实践

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

AI大模型03:Function Calling

接口Interface (1)人际交互接口 UI (User Interface) (2)应用程序编程接口 API (Application Programming Interface) 接口能通的关键:是两方都要遵守约定。 &#xff0…

EI检索,2天录用,3天见刊!截稿在即,这本水刊你还不投吗?

点击关注:关注GZH【欧亚科睿学术】,GET完整版2023JCR分区列表! 🎉 🎉 🎉 🎉 恭喜!这本毕业水刊仅2天录用!3天见刊! 重要时间节点如下 2024-08-03 Sub…

360安全大模型为什么是“非卖品”?

大模型虽然不是万能的,但是没有大模型又是万万不能的。以AI大模型为动力引擎,AI正在重塑各行各业,并快速“飞入寻常百姓家”。 AI安全 以“模”制“模” 2024年全国两会,“人工智能”首次被写入政府工作报告。报告中提出&#xff…

Vue3 搭建前端工程,并使用idea配置项目启动

1 下载node.js 先下载 node.js LTS 并安装:node.js 的 npm,用于管理前端项目包依赖,这里以 14.17.3 这个版本为例。如果已经安装过 node.js,可以在设置中找到应用,点进去搜索 node.js 即可卸载 node.js 14.17.3 安装…

人生感悟|该如何最大化提升个人价值?

哈喽,你好啊,我是雷工! 你肯定也听到过这个观点:人际关系的本质是价值交换,社会的本质就是价值互换。 我们立足社会,无论是上班还是创业,本质上都是在互换价值。 那么我们该如何最大化提升我…

Linux IPC-管道

前言 前面我们已经对进程概念、进程控制做了介绍!本期开始将来介绍进程的最后一章进程间通信,即如何让两个进程进行通信!本博客主要介绍管道! 本期内容介绍 • 初识进程间通信 • 管道 一、初识进程间通信 1、进程间通信的概念…

基于Java+SpringBoot+Vue的教师工作量管理系统

基于JavaSpringBootVue的教师工作量管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式&#x1f345…

OpenAi not returning result and exited with code=0

题意:OpenAi 没有返回结果,程序以代码 0 退出 问题背景: Im trying to use OpenAI, but I cant get a result. Im accessing the API via Visual Studio Code. I have downloaded these extensions for Visual Studio Code: Code Runner and…

Bash考古以及 StackOverflow的2024年度技术统计报告

0.缘起 前段时间,有一次调试.sh时废了好大功夫,单独执行各行指令,可以,但是存储为.sh就不行了,最终发现,我漏加了文件头部的那个声明: #!/bin/bash https://wikimili.com/en/Stephen_R._Bourne…

代发考生战报:考试通过 H12-831科目

代发考生战报:考试通过 H12-831科目,同事2人分别2天考HCIP续认证,考试题基本都是题库里的,印象有1-2个题是新题,也许是自己没记准,题库更新很及时,题库看会了考试很简单,考试半个小时…

认识Modbus RTU与Modbus TCP

(选自成都纵横智控-Modbus RTU与Modbus TCP协议区别详解 ) Modbus RTU 和 Modbus TCP 是两种常用的工业通信协议,用于连接电子设备,但它们在多方面有所不同。以下是它们的详细比较: Modbus RTU 协议类型: …

【精通Redis】Redis持久化和复制

文章目录 前言一、Redis持久化1.1 RDB快照手动触发自动触发save和bgsave的区别 1.2 AOF持久化appendonly配置 二、Redis复制2.1 开启Redis主从复制2.2 Redis复制的启动过程 前言 本文主要讨论Redis的持久化方式和复制特性。Redis的持久化方式有两种,一种叫RDB&…