JVM 内存区域

JVM内存结构模型

在这里插入图片描述

程序计数器:
1.线程私有的,是一块较小的内存空间,当前线程所执行的字节码的行号指示器
2.每个线程都有一个独立的程序计数器,各线程之间程序计数器互不影响,独立存储
3.此内存区域是唯一一个在java虚拟机中没有OutOfMemoryError异常的区域Java虚拟机栈:
1.线程私有的,生命周期跟线程相同
2.虚拟机栈描述的是Java方法执行的内存模型。每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息
3.局部变量表存放了编译期间各种基本数据类型和对象引用,在编译期间完成内存分配
4.如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,但扩展时无法申请到足够的内存,将抛出OutOfMemoryError异常本地方法栈:
1.根Java虚拟机栈的作用类似,Java虚拟机栈为执行Java方法服务,而本地方法栈为Native方法服务
2.跟Java虚拟机一样,本地方法区也会抛出StackOverflowError和OutOfMemoryError异常Java堆:
1.线程共享的,存放对象的实例
2.Java虚拟机所管理的内存中最大的一块,可分为新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间
3.当堆中没有内存完成实例分配,且堆内存也无法再扩展时,将抛出OutOfMemoryError异常方法区:
1.线程共享的,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器后的代码等数据
2.当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常
内存分配方式
  虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行响应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可以完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。内存分配方式有两种:指针碰撞 和 空闲列表
  • 指针碰撞

    假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲那边挪动一段与对象大小相等的距离,这种分配方式称为"指针碰撞"
    在这里插入图片描述

  • 空闲列表

    如果Java堆中内存不是规整的,已使用和未使用内存相互交错,那么无法简单进行指针碰撞了,虚拟机就必须维护一个列表,记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为"空闲列表"
    在这里插入图片描述

PS:并发安全问题

例如正在给A对象分配内存,指针还没来得及修改,此时对象B又同时使用了原来的指针来分配内存的情况。两种解决方案:
1.CAS对分配内存空间同步处理-虚拟机采用CAS失败重试的方式保证更新操作的原子性
2.TLAB(本地线程分配缓冲:Thread Local Allocation Buffer)把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存
对象的内存布局

在这里插入图片描述

对象的访问定位
使用对象需要通过栈上的reference数据来操作堆上的具体对象,对象访问方式也是取决于虚拟机实现而定的。目前主流的访问方式有使用"句柄"和"直接指针"两种。

1.句柄:Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了"对象实例数据"与"对象类型数据"各自的具体地址信息
在这里插入图片描述

优点:reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的示例数据指针而reference本身不需要修改

2.直接指针:Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址
在这里插入图片描述

优点:速度更快,它节省了一次(对象实例数据)指针定位的时间开销

JVM参数设置
-Xmx:堆最大值
-Xms:堆初始值
当-Xmx和-Xms设置一样时,可避免堆自动扩展-Xss:栈大小-XX:PermSize 方法区初始值
-XX:MaxPermSize 方法区最大值-XX:+HeapDumpOnOutOfMemoryError:可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转存储快照以便事后进行分析

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

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

相关文章

计算机毕业设计项目选题推荐(免费领源码)PHP+MySQL在线网络教育平台66984

目 录 摘要 1 绪论 1.1 课题背景 1.2意义 1.3HTML介绍 1.4JavaScript 运行模式 1.5css3工作原理 1.6论文结构与章节安排 2 在线网络教育平台分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 3 2.2.2数据修改流程 4 2.2.3数据删除流程 4 2.3 系统功能分析 …

前端案例-css实现ul中对li进行换行

场景描述: 我想要实现,在展示的item个数少于4个的时候,则排成一行,并且均分(比如说有3个,则每个的宽度为33.3%),如果item 个数大于4,则进行换行。 效果如下&#xff1a…

分布式搜索引擎ES

文章目录 初识elasticsearch了解ES倒排索引正向索引倒排索引正向和倒排 es的一些概念文档和字段索引和映射mysql与elasticsearch 安装ES部署kibana安装IK分词器扩展词词典停用词词典 索引库操作mapping映射属性索引库的CRUD创建索引库和映射查询索引库修改索引库删除索引库 文档…

手机开机入网流程 KPI接通率和掉线率

今天我们来学习手机开机入网流程是怎么样的。以及RRC连接和重建流程(和博主之前讲TCP三次握手,四次挥手原理很相似)是什么样的,还有天线的KPI指标都包括什么,是不是很期待啊~ 目录 手机开机入网流程 ATTACH/RRC连接建立过程 KPI接通率和掉…

云计算和跨境电商:数字化未来的基石

云计算和跨境电商两者结合,共同塑造着当今数字化时代的商业未来。这两个领域的发展,为企业提供了前所未有的机会,使他们能够扩展国际业务、提高效率,以及为全球市场提供更多产品和服务。本文将深入探讨云计算如何成为跨境电商的数…

Antd React Form.Item内部是自定义组件怎么自定义返回值

在线演示https://stackblitz.com/edit/stackblitz-starters-xwtwyz?filesrc%2FSelfTreeSelect.tsx 需求 当我们点击提交,需要返回用户名和选中树的id信息,但是,我不关要返回树的id信息,还需要返回选中树的名称 //默认返回的 {userName:梦洁,treeInfo:leaf1-value } //但是需…

《软件工程与计算》期末考试真题范例及答案

今天分享一套针对《软件工程与计算》这本书的真题案例,有关《软件工程与计算》23章内容的重点知识整理,已经总结在了博客专栏中,有需要的自行阅读: 《软件工程与计算》啃书总结https://blog.csdn.net/jsl123x/category_12468792.…

SpringEvent事件通知机制

“Spring Event” 是 Spring 框架通过事件驱动的编程模型来处理应用程序中的事件。开发者可以定义自己的事件,然后在应用程序中触发这些事件。Spring 框架提供了用于发布和监听事件的机制,以实现松散耦合的组件间通信。 有两个核心组件: 事…

红色旅游AR互动体验将景区推向更广泛的市场

AR技术的出现使得各展厅观众可以在虚拟和现实的层面进行互动,利用AR和VR技术,将展览地点扩展到特定的虚拟领域,实现了"无触觉"交互体验,增强现实技术和展馆的对接更加激发人们了解新事物的兴趣。 一、AR景区&#xff1a…

手把手教你实现贪吃蛇

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:实现贪吃蛇 > 毒鸡汤:时间并不可真…

Flutter笔记:绘图示例 - 一个简单的(Canvas )时钟应用

Flutter笔记 绘图示例 - 一个简单的(Canvas )时钟应用 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_2855…

SOME/IP学习笔记2

1. SOME/IP 协议 SOME/IP目前支持UDP(用户传输协议)和TCP(传输控制协议), PS:UDP和TCP区别如下 TCP面向连接的,可靠的数据传输服务;UDP面向无连接的,尽最大努力的数据传输服务&…