位置: IT常识 - 正文

深入理解JVM第二章-自动内存管理(深入理解jvm第三版pdf百度云)

编辑:rootadmin
什么时候能带着理解的目标看JVM? 这个问题是我从学习Java开始,即大二上册开始,一直抱有的问题,我在网上搜索了很多次,都没有告知我明确的答案,我想现在我可以勉强给个答案,我觉得: 操作系统学习过一遍 计算机组成原理学习过一遍 有一定的汇编语言基础 Java SE有着扎实的基础 有一定的并发编程基 ... 什么时候能带着理解的目标看JVM?

这个问题是我从学习Java开始,即大二上册开始,一直抱有的问题,我在网上搜索了很多次,都没有告知我明确的答案,我想现在我可以勉强给个答案,我觉得:

操作系统学习过一遍

计算机组成原理学习过一遍

有一定的汇编语言基础

Java SE有着扎实的基础

有一定的并发编程基础【因为虚拟机的设计都需要考虑高并发状态】

为什么要学习Java内存区域和内存溢出异常?

Java程序员把控制内存的权力交给了Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机的内存管理机制,修正错误将会成为艰难的一项工作。

运行时数据区域有哪几类?什么时候会发生OOM?程序计数器

定义:程序计数器是当前线程所执行的字节码的行号指示器(程序控制流指示器),程序的分支、循环、跳转、异常处理和线程恢复等继承功能都依赖它来实现。特别的是,如果线程正在执行一个Java方法,那么它记录着虚拟机字节码指令的地址;如果执行的是本地(关键字native)方法,那么它记录着空值。

生命周期:它是线程私有的内存,每条线程都有一个独立的程序计数器,各条线程之间互不影响,独立存储;随用户线程的启动和结束而建立和销毁。

OOM:没有任何可能出现OOM的情况。

虚拟机栈

什么是栈帧?

每个方法被执行时,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等方法有关的信息【参考汇编语言栈的作用】。

什么是局部变量表?

局部变量表存储了方法执行过程中所有的局部变量,包括:基本数据类型、对象引用、方法返回地址(指向一条字节码指令的地址)。

定义:每一个线程中,存储栈帧的栈就是虚拟机栈。每一个方法从被调用到执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

生命周期:它是线程私有的内存,生命周期与线程相同。

OOM:栈深度超出了虚拟机的最大深度,抛出StackOverflow。而假如虚拟机栈支持动态扩展,则虚拟机栈无法申请到足够的内存时,会抛出OutOfMemoryError(OOM)。

本地方法栈

和虚拟机栈大致一样,只不过本地方法栈存储的是本地方法(关键字native)的栈帧,而虚拟机栈存储的是Java方法的栈帧。

定义:几乎所有的对象实例以及数组都在堆上分配。(new关键字)

为什么说是几乎所有?

随着即时编译技术及逃逸分析技术的日渐强大,栈上分配、标量替换(应该是两种编译优化技术)已经导致对象实例有可能不在堆中而在栈中了!

什么是经典分代?

新生代和老年代,在GC回收算法中它们会成为主角哦。

在我看来,为什么堆的生命周期没有那么绝对?

大多对象实例是线程共享的(这个很明显吧,这是线程安全问题存在的根本原因),但也有少部分是线程私有的,比如:ThreadLocal<T>它就是线程私有的堆内存区域和TLAB(下面会讲)。

从这,对自己说一句,可以明显看出的是,大多事务都不绝对,一切都是为了更好的运行而设计的,而不是为了规则本身而设计的,别太死板。生命周期由GC回收算法控制。

OOM:堆内存不足以进行对象实例内存分配并且堆再也无法动态拓展时,会抛出OOM。

方法区

这是最难理解的内存分配区域,极其劝退,我前六次都被它劝退了,概念很绕,hh。概括来说,就是这里存储着有关类的一切信息!

永久代、元空间和方法区是什么关系?

永久代、元空间都是方法区的一种实现。在永久代被废除后,方法区的实现就采用元空间。

永久代和元空间有什么不同?

存储位置不同,永久代是堆的一部分,和新生代,老年代地址是连续的,而元空间属于本地内存;

存储内容不同,元空间存储类的元信息,而静态变量和常量池等并入堆中。相当于永久代的数据被分到了堆和元空间中。

但是,同样的,对概念别太死板,虽然现在方法区的实现是元空间,但是,堆中的那部分数据仍然是属于方法区的,也就是堆和方法区(又称非堆)其实并没有那么清晰的界限,都只不过是为了对内存进行更好的分配罢了。

定义:它存储着虚拟机加载的类型信息、常量、静态变量和即时编译器编译后的代码缓存等长期存在的数据。

解释什么是常量池?

字符串常量池:存放字符串常量和字符串常量引用(intern存入的字符串常量引用,new方法会创建一个字符串对象同时存入一个字符串常量到池中)的内存区域,里面字符串常量不会重复。原本被归类于方法区,因为长期不会被回收;后被归类于堆,因为方法区太小,容不下这尊大佛了。

Class常量池:用于存放编译器生成的Class文件中的各种字面量(Literal)和符号引用(Symbolic References);

运行时常量池:运行时常量池可以在运行期间将符号引用解析为直接引用,由运行时常量池存储这些直接引用。也就是说,运行时常量池存储着Class常量池运行期间存入的符号引用,以及由符号引用解析出来的直接引用,还包括运行期间产生的新的常量(关于字符串String中的intern方法,如果字符串常量池中已经存在此字符串常量,不变;而如果不存在,字符串常量池存入此字符串常量的引用)

OOM:当方法区(运行时常量池)无法满足新的内存分配需求时,会抛出OOM。

什么是直接内存?

非JVM管理的一块内存区域。

什么是NIO?

NIO是一种基于通道于缓冲区的IO方式,它可以使用Native函数库直接分配堆外内存,然后通过堆中的DirectByteBuffer对象作为这块内存的应用进行操作,显著提高了Java应用程序的性能。(偷偷占了多的内存能不显著吗?)

产生OOM的原因?

显然,直接内存超出了JVM可以管理的内存区域,因为这是它偷的内存。理想假设,本机只有2GB的运行内存,而我分配给了虚拟机2GB,但本机2GB因为NIO直接内存的存在,实际没有2GB了,那么当JVM动态拓展内存区域时,内存就不够了,就会出现OOM。

对象是如何创建的?

对象内存的分配方式有哪些?

指针碰撞:把指针向空闲空间方向挪动一段与对象大小相等的距离。

空闲列表:虚拟机维护一个列表,记录哪块内存是可用的,从列表中利用分配算法找到一块足够大的空间划分给对象实例,并更新列表,会产生外部碎片。

具体选择哪种方式取决于虚拟机的垃圾回收策略,这种两种内存方式参考了操作系统的内存分配策略。

内存分配的并发问题如何解决?

同步处理:利用CAS算法(Compare And Swap)配上失败重试机制,保证分配内存操作的原子性。

TLAB:Thread Local Allocation Buffer,每个线程先在线程的本地缓冲区中分配,本地缓存区用完了再利用同步处理分配线程的本地缓存区。

可以使用-XX:+/-UseTLAB来配置TLAB。

对象实例在堆中的内存分布布局?

对象头、实例数据和对齐填充。

对象头存储着什么信息?

一部分是用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁(客户端锁定)、偏向线程ID、偏向时间戳等。

另一部分用于存储类型指针,即对象指向它的类型元数据的指针,通过这个来确定对象是哪个类的实例。(反射会用到)如果是数组,还会存储数组的长度,因为一般的对象实例通过元数据信息已经可以确定大小,而数组不行。

实例数据存储着什么信息?

程序代码里所定义的各种类型的字段内容。

为什么要对齐填充?

就和计网IP数据报以及计组里学的一样,数据最好封装成字节的整数倍,方便CPU读取。

对象如何进行访问定位?使用句柄

如果使用句柄访问,在java堆中将划分出一块内存来作为句柄池。reference中存储的就是对象的句柄地址,而句柄中包含对象实例数据与类型数据具体地址信息。

直接访问

使用直接访问,在java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息。reference中直接存储对象地址即可。

句柄访问和直接访问的优缺点

句柄访问在引用和具体数据之间增加了一层转换关系,这层转换关系使得对象在被移动的时候(如垃圾回收)只需要改变转换关系,即改变句柄池中的引用指向即可。而引用本身不需要被修改。使用直接访问最大的好处就是快,因为相对于句柄访问减少了一次指针定位的时间。由于java是面向对象语言,对象访问非常频繁,因此这种访问开销积少成多也非常可可观。hotspot虚拟机使用的就是直接访问方式。

本文链接地址:https://www.jiuchutong.com/zhishi/313361.html 转载请保留说明!

上一篇:phpcms v9判断用户是否登录(php判断数据库用户名是否存在)

下一篇:织梦生成文章内容缩略图时自动加上绝对路径教程(织梦内容页模板修改)

  • vivo x27怎么下载来电铃声(vivo手机怎么下载)

    vivo x27怎么下载来电铃声(vivo手机怎么下载)

  • 华为tasan00是什么手机型号

    华为tasan00是什么手机型号

  • 三星音乐播放器不见了(三星音乐播放器app下载)

    三星音乐播放器不见了(三星音乐播放器app下载)

  • 三星s10充电速度太慢了怎么办(三星s10 5g充电测试)

    三星s10充电速度太慢了怎么办(三星s10 5g充电测试)

  • 苹果11两个卡怎么放(苹果11两个卡怎么关机一个卡)

    苹果11两个卡怎么放(苹果11两个卡怎么关机一个卡)

  • qq音乐听书会员有什么用(qq音乐听书会员和绿钻区别)

    qq音乐听书会员有什么用(qq音乐听书会员和绿钻区别)

  • 苹果几是双卡双待(苹果几是双卡双待5G)

    苹果几是双卡双待(苹果几是双卡双待5G)

  • 苹果打不开接收的录音(苹果手机无法接收信息是什么原因)

    苹果打不开接收的录音(苹果手机无法接收信息是什么原因)

  • boss直聘申诉多久解封(boss直聘如何申诉成功率高)

    boss直聘申诉多久解封(boss直聘如何申诉成功率高)

  • 华为畅享10e可以指纹解锁吗?(华为畅享10e可以玩光遇吗)

    华为畅享10e可以指纹解锁吗?(华为畅享10e可以玩光遇吗)

  • 苹果无线鼠标失灵(苹果无线鼠标失灵了可以修吗)

    苹果无线鼠标失灵(苹果无线鼠标失灵了可以修吗)

  • vivo手机怎么设置小爱同学(vivo手机怎么设置锁屏时间)

    vivo手机怎么设置小爱同学(vivo手机怎么设置锁屏时间)

  • 苹果手机创建id出生日期无效怎么回事(苹果手机创建id电子邮件怎么填)

    苹果手机创建id出生日期无效怎么回事(苹果手机创建id电子邮件怎么填)

  • 华为mate30微信怎么分身(华为mate30微信怎么缩小)

    华为mate30微信怎么分身(华为mate30微信怎么缩小)

  • qq匿名投票后谁能看到(qq匿名投票结果)

    qq匿名投票后谁能看到(qq匿名投票结果)

  • 华为mate30什么马达(华为mate30体验感受)

    华为mate30什么马达(华为mate30体验感受)

  • 退款中卖家还继续发货(退款中卖家还继续发货,我能收吗)

    退款中卖家还继续发货(退款中卖家还继续发货,我能收吗)

  • 苹果11怎么弄九宫格(苹果11怎么弄九宫格切图)

    苹果11怎么弄九宫格(苹果11怎么弄九宫格切图)

  • 华为手环怎么接不了电话(华为手环怎么接收微信消息)

    华为手环怎么接不了电话(华为手环怎么接收微信消息)

  • 小米wifi已连接但无法上网(小米wifi已连接不可上网怎么解决)

    小米wifi已连接但无法上网(小米wifi已连接不可上网怎么解决)

  • ppt配色的原则与分类(ppt常见的配色方法)

    ppt配色的原则与分类(ppt常见的配色方法)

  • 什么是栈的初始状态(栈初始状态)

    什么是栈的初始状态(栈初始状态)

  • facetime打电话要钱吗(用facetime打电话要钱吗)

    facetime打电话要钱吗(用facetime打电话要钱吗)

  • oppor9s用户体验计划在哪里(oppor9s功能介绍)

    oppor9s用户体验计划在哪里(oppor9s功能介绍)

  • 魅族16怎么看运行内存(魅族怎么看运存剩多少)

    魅族16怎么看运行内存(魅族怎么看运存剩多少)

  • 主板电池没电(主板电池没电能开机吗)

    主板电池没电(主板电池没电能开机吗)

  • uniapp h5跳转微信小程序(wx-open-launch-weapp)(uniapp打开h5页面)

    uniapp h5跳转微信小程序(wx-open-launch-weapp)(uniapp打开h5页面)

  • 【前端修炼之路】第一话 · 初识前端领域(前端高手进阶)

    【前端修炼之路】第一话 · 初识前端领域(前端高手进阶)

  • python美元转换成人民币转换代码(python兑换美元)

    python美元转换成人民币转换代码(python兑换美元)

  • 职工薪酬支出及纳税调整
  • 一般纳税人劳务费税率是多少
  • 软件研发阶段和开发阶段如何区分
  • 银行内部利息支出
  • 软件测试费计入什么科目
  • 融资租赁购入固定资产的融资费用如何扣除
  • 二手房交易税费最新规定
  • 支付买方佣金
  • 金融企业计提的坏账准备金
  • 航天服务费手写发票可以抵减吗?
  • 退税显示未完成怎么处理
  • 未认证进项税额转出
  • 酒店预收款是什么意思
  • 预交土增税税率
  • 专用发票右上角的数字表示什么
  • 企业所得税只能抵扣吗
  • 商品促销有关问题
  • windows11家庭版本地策略组
  • 俄勒冈州邮编
  • PHP:pg_version()的用法_PostgreSQL函数
  • php编程技术
  • 收入汇缴账户可以冻结吗
  • 资产减值损失会影响营业利润吗
  • 供热企业的税收分类编码
  • 二手办公楼交易税多少
  • 轨迹评价
  • yii框架文档
  • 【AutoGPT】你自己运行,我先睡了—— ChatGPT过时了吗?
  • vue之间的组件通信
  • jsp页面构成
  • 关于低值易耗品的说法中不正确的是
  • 天猫一般纳税人如何纳税
  • 事业单位用其他资金用于还单位贷款违法吗
  • 建筑企业其他应付款包含什么内容
  • 为什么增值税申报表保存不了
  • 保教费收入要交企业所得税吗
  • 旅行社代订的机票可以退吗
  • 负债类账户期末余额在借方还是贷方
  • 科目余额表和资产负债表的期末余额不一样,怎么办
  • 文化事业建设费会计分录
  • 结转以前年度成本分录怎么写
  • 企业主营业务收入分录
  • 什么费用可以列入研发费用
  • 挂靠人员社保缴费分录如何做?
  • 应收股利在资产负债表中怎么填
  • 顺风车没有发票是否合法
  • 增值税发票税控开票软件用户密码
  • 转账支票的密码需要填写吗
  • 净资产收益率怎么算出来的
  • 红字冲销凭证怎么登明细账
  • 建账的要点及应注意的问题
  • Win7、WinXP下MySql安装出错完全卸载的方法步骤
  • 如何解决win10系统安装不兼容驱动的问题
  • ubuntu15.10中文版
  • u盘安装win7系统教程图解
  • ubuntu operation not permitted
  • centos6 grub
  • 启用guest用户
  • archlinux 配置网络
  • vi编辑器是干什么的
  • win8电源设置
  • win7怎么查是不是正版
  • es6 变量的解构赋值
  • js中的函数
  • jquery的实现原理
  • python中requests库session对象的妙用详解
  • python rem
  • unity3D游戏开发
  • python os模块
  • IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解
  • node.js + socket.io 实现点对点随机匹配聊天
  • 打破游戏规则
  • json格式例子
  • android中使用sharedprefence的步骤
  • 国税公告2016年14解读
  • 收到虚开增值税专用发票怎么处理
  • 网上报税失败什么原因
  • 土地评估报告书
  • 个人股权转让是否增值了怎么判断
  • 苏州虎丘区税务局在哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设