JVM - 内存分配

news2024/9/20 0:52:26

目录

JVM的简化架构和运行时数据区

JVM的简化架构

运行时数据区

PC寄存器

Java栈

Java堆

方法区

运行时常量池

本地方法栈

栈、堆、方法区交互关系

Java堆内存模型和分配

Java堆内存概述

Java堆的结构

对象的内存布局

对象的访问定位

Trace跟踪和Java堆的参数配置

Trace跟踪参数

GC日志格式

Java堆的参数

元空间的参数


  • JVM的简化架构和运行时数据区

  • JVM的简化架构

  • 运行时数据区

    • 包括:PC寄存器、Java虚拟机栈、Java堆、方法区、运行时常量池、本地方法栈等
  • PC寄存器

  • PC(Program Counter)寄存器说明:
    • (1)每个线程拥有一个PC寄存器,是线程私有的,用来存储指向下一条指令的地址
    • (2)在创建线程的时候,创建相应的PC寄存器
    • (3)执行本地方法时,PC寄存器的值为undefined
    • (4)是一块较小的内存空间,是唯一一个在JVM规范中没有规定OutOfMemoryError的内存区域
  • Java栈

  • 栈由一系列帧(Frame)组成(因此Java栈也叫做帧栈),是线程私有的
  • 帧用来保存一个方法的局部变量、操作数栈(Java没有寄存器,所有参数传递使用操作数栈)、常量池指针、动态链接、方法返回值等
  • 每一次方法调用创建一个帧,并压栈,退出方法的时候,修改栈顶指针就可以把栈帧中的内容销毁
  • 局部变量表存放了编译期可知的各种基本数据类型和引用类型,每个slot存放32位的数据,long、double占两个槽位
  • 栈的优点:存取速度比堆快,仅次于寄存器
  • 栈的缺点:存在栈中的数据大小、生存期是在编译期决定的,缺乏灵活性
  • Java堆

  • 用来存放应用系统创建的对象和数组,所有线程共享Java堆
  • GC主要就管理堆空间,对分代GC来说,堆也是分代的
  • 堆的优点:运行期动态分配内存大小,自动进行垃圾回收;
  • 堆的缺点:效率相对较慢
  • 方法区

  • 方法区是线程共享的,通常用来保存装载的类的结构信息
  • 通常和元空间关联在一起,但具体的跟JVM实现和版本有关
  • JVM规范把方法区描述为堆的一个逻辑部分,但它有一个别名称为Non-heap(非堆),应是为了与Java堆区分开
  • 运行时常量池

  • 是Class文件中每个类或接口的常量池表
  • 在运行期间的表示形式,通常包括:类的版本、字段、方法、接口等信息
  • 在方法区中分配
  • 通常在加载类和接口到JVM后,就创建相应的运行时常量池
  • 本地方法栈

  • 在JVM中用来支持native方法执行的栈就是本地方法栈
  • 栈、堆、方法区交互关系

  • Java堆内存模型和分配

  • Java堆内存概述

  • Java堆用来存放应用系统创建的对象和数组,所有线程共享Java堆
  • Java堆是在运行期动态分配内存大小,自动进行垃圾回收
  • Java垃圾回收(GC)主要就是回收堆内存,对分代GC来说,堆也是分代的
  • Java堆的结构

  • 新生代用来放新分配的对象
  • 新生代中经过垃圾回收,没有回收掉的对象,被复制到老年代
  • 老年代存储对象比新生代存储对象的年龄大得多
  • 老年代存储一些大对象
  • 整个堆大小 = 新生代 + 老年代
  • 新生代 = Eden + 存活区
  • 从前的持久代,用来存放Class、Method等元信息的区域,从JDK8开始去掉了,取而代之的是元空间(MetaSpace)
  • 元空间并不在虚拟机里面,而是直接使用本地内存
  • 对象的内存布局

  • 对象在内存中存储的布局(这里以HotSpot虚拟机为例来说明)
  • 分为:对象头、实例数据和对齐填充
  • 对象头,包含两个部分:
    • (1)Mark Word:存储对象自身的运行数据,如:
      • HashCode、GC分代年龄、锁状态标志等
    • (2)类型指针:对象指向它的类元数据的指针
  • 实例数据
    • 真正存放对象实例数据的地方
  • 对齐填充
  • 这部分不一定存在,也没有什么特别含义,仅仅是占位符
  • 因为HotSpot要求对象起始地址都是8字节的整数倍,如果不是,就对齐
  • 对象的访问定位

  • 在JVM规范中只规定了reference类型是一个指向对象的引用,但没有规定这个引用具体如何去定位、访问堆中对象的具体位置
  • 因此对象的访问方式取决于JVM的实现
  • 目前主流的有:使用句柄或使用指针两种方式
  • 使用句柄:
  • Java堆中会划分出一块内存来做为句柄池,reference中存储句柄的地址
  • 句柄中存储对象的实例数据和类元数据的地址,如下图所示:

  • 使用指针:
  • Java堆中会存放访问类元数据的地址
  • reference存储的就直接是对象的地址,如下图所示:

  • Trace跟踪和Java堆的参数配置

  • Trace跟踪参数

  • 可以打印GC的简要信息:-Xlog:gc
  • 打印GC详细信息:-Xlog:gc*
  • 指定GC log的位置,以文件输出:-Xlog:gc:garbage-collection.log
  • 每一次GC后,都打印堆信息:-Xlog:gc+heap=debug
  • GC日志格式

  • GC发生的时间,也就是JVM从启动以来经过的秒数
  • 日志级别信息,和日志类型标记
  • GC识别号
  • GC类型和说明GC的原因
  • 容量:GC前容量->GC后容量(该区域总容量)
  • GC持续时间,单位秒
  • 有的收集器会有更详细的描述,比如:user表示应用程序消耗的时间,sys表示系统内核消耗的时间、real表示操作从开始到结束的时间
  • Java堆的参数

  • Xms:初始堆大小,默认物理内存的1/64
  • Xmx:最大堆大小,默认物理内存的1/4
  • Xmn:新生代大小,默认整个堆的3/8
  • -XX:+HeapDumpOnOutOfMemoryError:OOM时导出堆到文件
  • -XX:+HeapDumpPath:导出OOM的路径
  • -XX:OnOutOfMemoryError:在OOM时,执行一个脚本
  • -XX:NewRatio:老年代与新生代的比值
  • 如果xms=xmx,且设置了xmn的情况下,该参数不用设置
  • -XX:SurvivorRatio:Eden区和Survivor区的大小比值
  • 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor占整个新生的1/10
  • -Xss:通常只有几百K,决定了函数调用的深度
  • 元空间的参数

  • -XX:MetaspaceSize:初始空间大小
  • -XX:MaxMetaspaceSize:最大空间,默认是没有限制的
  • -XX:MinMetaspaceFreeRatio:在GC之后,最小的Metaspace剩余空间容量的百分比
  • -XX:MaxMetaspaceFreeRatio:在GC之后,最大的Metaspace剩余空间容量的百分比

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

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

相关文章

【漏洞真实影响分析】Apache Kafka Connect 模块JNDI注入(CVE-2023-25194)

系列简介: 漏洞真实影响分析是墨菲安全实验室针对热点漏洞的分析系列文章,帮助企业开发者和安全从业者理清漏洞影响面、梳理真实影响场景,提升安全应急响应和漏洞治理工作效率。 漏洞概述 Apache Kafka Connect服务在2.3.0 至 3.3.2 版本中&…

sql server安装并SSMS连接

博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞&#xff…

vue3使用vis绘制甘特图制作timeline可拖动时间轴,时间轴中文化

本文写作顺序:效果展示——子组件封装——父组件传值 仅js的原始图(回归初始化)、撤销(上一步)功能实现,样式需要自己调整 目录前言:参考文档文章一、实现效果:二、安装插件及依赖&a…

0代码实现接口自动化测试 —— RF框架实践

robotframework是一款关键字自动化测试框架,可能做各种类型的自动化测试。本文介绍通过 robotframework 来实现接口测试。 01、安装接口请求的第三方库 pip install robotframework-requests 在python安装目录的Lib\site-packages可以看到 02、接口关键字基础 ro…

【操作系统】操作系统IO技术底层机制和ZeroCopy

1.DMA技术详解 (1)应用程序 从 磁盘读写数据 的时序图(未用DMA技术前) (2)什么是DMA 技术 (Direct Memory Access) 直接内存访问,直接内存访问是计算机科学中的一种内存访问技术。…

设计模式之美总结(开源实战篇)

title: 设计模式之美总结(开源实战篇) date: 2023-01-10 17:13:05 tags: 设计模式 categories:设计模式 cover: https://cover.png feature: false 文章目录1. Java JDK 应用到的设计模式1.1 工厂模式在 Calendar 类中的应用1.2 建造者模式在 Calendar …

Pyton接口自动化相关【易报错问题及解决方法】

Pyton接口自动化相关【易报错问题及解决方法】 目录:导读 Python怎么链接数据库 python 链接数据库时报错 TypeError: %d format: a number is required, not str 是因为端口号写成字符串格式的了 python exists判断文件是否存在 pycharm下查看日志文件中文乱码…

【数据挖掘实战】——电力窃漏电用户自动识别

【数据挖掘实战】——电力窃漏电用户自动识别一、背景和挖掘目标二、分析方法与过程1、初步分析2、数据抽取3、探索分析4、数据预处理5、构建专家样本三、构建模型1、构建窃漏电用户识别模型2、模型评价3、进行窃漏电诊断拓展思考项目代码地址:https://gitee.com/li…

LaoCat带你认识容器与镜像(实践篇二下)

实践篇主要以各容器的挂载和附加命令为主。 本章内容 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 Docker > 20.10.22 接上章内容,接下来该章围绕Docker安装并运行之RabbitMQ、ElasticSearch,大部分命令来源于DockerHub官网&#xf…

Apache日志分析器

您的Apache HTTP服务器生成的日志数据是信息的宝库。使用这些信息,您可以判断您服务器的使用情况、找出漏洞所在,并设法改进服务器结构和整体性能。审核您的Apache日志可在以下情况派上用场,其中包括:识别和纠正频繁出现的错误以增…

github相关

1.本地项目上传到远程github 1.1github上创建项目 1)github上创建项目 2)复制地址 1.2上传自己的项目 1)本地项目目录下执行 git init “git init”命令用于创建git仓库,其可以在一个已有的非git项目的根目录下执行,把已有项目初始化成为git仓库&…

微服务实战--高级篇:多级缓存:Nginx本地缓存、Redis、Tomcat、JVM缓存、数据库

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时…

模型部署综述

https://github.com/leeguandong/KuaiZaihttps://github.com/leeguandong/KuaiZaiAI 框架部署方案之模型部署概述 - 知乎文小P 家的 1011010 概述模型训练重点关注的是如何通过训练策略来得到一个性能更好的模型,其过程似乎包含着各种“玄学”,被戏称为“…

全局异常处理--Java实战项目篇

系列文章目录 Java后端开发功能模块思路 Spring Boot自动配置–如何切换内置Web服务器 Spring Boot读取配置文件内容的三种方式 该系列文章持续更新,更多的文章请点击我的主页查看哦! 文章目录系列文章目录前言一、出现的问题二、解决问题的方法1. 添加…

iPhone更新iOS 16.3出现应用卡死、闪退的问题怎么办?

在升级最新的 iOS 16.3 系统后,有些用户可能遇到了个别应用无法正常打开,卡死的异常情况。大家可以尝试通过如下方式解决问题。 1.重新启动应用: 如果应用出现卡死或闪退,可从 iPhone 屏幕由底往上滑(或连续按两次 H…

Java变量和数据类型,超详细整理,适合新手入门

目录 一、什么是变量? 二、变量 变量值互换 三、基本数据类型 1、八种基本数据类型 2、布尔值 3、字符串 四、从控制台输入 一、什么是变量? 变量是一种存储值的容器,它可以在程序的不同部分之间共享;变量可以存储数字、字…

C语言进阶——通讯录模拟实现

🌇个人主页:_麦麦_ 📚今日名言:只有走在路上,才能摆脱局限,摆脱执着,让所有的选择,探寻,猜测,想象都生机勃勃。——余秋雨《文化苦旅》 目录 一、前言 二、正…

让我百思不得其解的infer究竟是怎么推导类型的?

情景再现 有这么一个条件类型的基本语法: T extends U ? X : Y; 如果占位符类型U是一个可以被分解成几个部分的类型,譬如数组类型,元组类型,函数类型,字符串字面量类型等。这时候就可以通过infer来获取U类型中某个部分的类型。 …

95后外贸SOHO,年入7位数,他究竟是怎么做的?

外贸SOHO,一年到底能挣多少钱?有人说:“勤勤恳恳,年薪也就十来万吧”;也有人说:“100万而已我早就已经挣到了”;还有人说:“谁说新手难出头?我做跨境半年赚200万&#xf…

Linux设备驱动移植

目录 一、设备树 1.1设备树 1.2设备树文件 1.3设备树语法 1.4Linux内核驱动移植 二、网卡驱动 2.1在make menuconfig界面中选中要安装的驱动 2.2在设备树中添加/修改相应的设备信息 2.3修改时钟 2.4修改eMMc 2.5编译测试 一、设备树 1.1设备树 设备树是一种描述硬…