0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文读懂JVM是什么

冬至配饺子 来源:极术社区 作者:betterFighter 2022-07-28 15:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

由于先前也遇到过一些性能问题,OOM算是其中的一大类了。因此也对jvm产生了一些兴趣。自己对jvm略做了些研究。后续继续补充。

从oom引申出去

既然说到oom,首先需要知道oom的原因是什么。为啥会oom嘞?
oom的定义是outofmemory。当内存想为对象分配内存的时候,发现内存不足以去分配内存,或者gc的时候发现没有可以被回收的对象或回收后的内存也不足以为对象分配内存。

因此抛出这个java异常。

oom
可以分为以下四类

1.堆溢出:java堆

2.栈溢出:虚拟机栈和本地方法栈

3.方法区内存溢出:方法区和内存时常量池

4.本机直接内存溢出

因此,需要先了解堆,栈,方法区都是些啥

运行时数据区

先上图

poYBAGLiO6-AYRh8AABaoIqp-Dk913.png

程序计数器:当前线程所执行的字节码的行号指示器。

java虚拟机的多线程是通过轮流切换线程,并为线程分配执行时间片去运行来执行的。每个线程都有一个自己的程序计数器。我觉得这个可以这么理解:当一个线程在运行的时候,每执行一步程序计数器都会有个记录,记录当前执行到哪一步了。如果线程被切换后又切换回来,那么通过程序计数器就能知道执行到哪一步了,然后继续向下执行。

虚拟机栈:每个线程都会有一个虚拟机栈。虚拟机栈描述的是java方法执行的内存模型。因为线程执行的过程就是执行线程里的一个个方法,而每个方法都会创建对应自己的栈帧。

栈帧里存的内容如下:

局部变量表:存放了各种编译期可知基本数据类型,对象引用(引用指针或句柄)

操作数栈:大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈

动态链接

方法出口

64位的long和都double类型数据占用2个局部变量空间,其他数据类型占用一个,也就是每个局部变量空间为32位。

在这个地方,如果线程请求的深度大于虚拟机允许的深度,会抛出StackOverflowError.因为jvm分配给虚拟机栈的内存是有限的,而每个方法都会有对应的栈帧压入到栈中,如果调用方法过多,那么栈满了自然也就溢出了。(可能的场景:死循环代码,大量递归调用,那排查问题的时候也可以由此有一个思路)。可以通过调整-Xss去调整栈大小。

大部分java虚拟机允许动态扩展,但如果扩展的时候也申请不到足够内存时,就会报OOM了。

本地方法栈:和虚拟机发挥作用相似。区别:虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机使用的Native方法服务。Native Method就是一个java调用非java代码的接口,Native方法的实现由非java语言实现。读者不用纠结,略作了解即可。

:堆是所有线程共享的一块内存,作用是存放对象实例。堆可以分为新生代和老年代。新生代里还可细分为Eden,From survivor,To survivor等空间。后面讲述GC过程时会说到。

方法区:也是所有线程共享的一块内存,存放被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码。也就是常说的永久代。

永久代的大小可以用-XX:MaxPermSize去设置。

运行时常量池:方法区的一部分。存放编译期生成的各种字面量和符号引用。字面量就是指这个量本身。比如字面量2,就是指2.

运行时常量池有一个重要特性就是动态性。常量不一定只有编译期才能产生,运行期间也可能将新的常量放入常量池。详情可见String类的

intern()方法。

直接内存:它不是虚拟机运行时数据区的一部分,但也频繁的被使用。直接内存不会受到java堆大小的限制,但是会受到本机总内存的限制。

GC过程

GC分为新生代GC(minor gc)和老年代GC(full gc)。新生代GC的频率远远高于老年代。而且

新生代GC的速度会比老年代的GC速度快10倍以上。根源在于新生代和老年代使用的GC算法不同。读者们可以去仔细思考下(答案文中有,哈哈)。新生代/老年代大小默认为1:2。

新生代GC过程

新生代里可细分为Eden,From survivor,To survivor等空间。当我们需要给对象分配内存的时候,首先我们会在Eden区为对象分配内存,当Eden区内存不足时,会发生minor gc,此时会把仍然存活的对象放到From survivor,并给对象标记存活次数1;然后当Eden区再次被用完后,对Eden区和From survivor区筛选出存活的对象,放到To survivor区,清空Eden区和From survivor区,存活次数加1,之前存活的就是2了。

以此类推,默认是当存活次数到达15次(可配置)的时候,把这个对象存入老年代中。同时也可以看到,From survivor,To survivor区始终有一个是空置的。所以新生代使用的只有9/10的空间。
然而大家可以思考一下。Eden区和survivor区的大小为8:1,那么发生minor gc后如果存活的对象
的大小比survivor区还要大。这个时候会怎么处理?

这里需要引入一个叫“内存分配担保机制”的概念。就是当存活的对象连survivor区都放不下的时候,这部分放不下的对象会直接进入老年代。老年代是担保人。老年代进行担保,前提是老年代还有剩余空间。但是每次存活下来的对象大小是不确定的。所以只好取之前每次存储到老年代的对象大小的平均值。如果大于平均值,那么直接full gc。但是为了避免频繁full gc,仍然会开启handlepromotionfailure配置。如下图

poYBAGLiO9SAQQccAAAYbuaIYlY922.png

老年代GC过程

老年代采用了标记整理,标记清楚的算法。老年代会把仍然存活的对象都整理统一放到一边。整理完成后就会清楚掉边界外的对象。这样就避免了产生大量的内存碎片的问题。但是整理算法相较于新生代采用的复制算法,复杂程度肯定更高。这也导致了full gc的速度要远远慢于minor gc。


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    3006

    浏览量

    116828
  • 计数器
    +关注

    关注

    32

    文章

    2321

    浏览量

    98545
  • 虚拟机
    +关注

    关注

    1

    文章

    975

    浏览量

    30694
  • 内存溢出
    +关注

    关注

    0

    文章

    10

    浏览量

    1431
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    读懂 MAX504/MAX515:低功耗 10 位串行 DAC 优选

    读懂 MAX504/MAX515:低功耗 10 位串行 DAC 优选 、引言 在电子设计的世界里,数模转换器(DAC)就像是数字信号与模拟世界之间的桥梁。今天我们就来深入了解
    的头像 发表于 04-16 15:20 126次阅读

    读懂交流互感器与交直流体互感器:原理、区别及应用(上)

    ,交直流体互感器渐入视野。很多人对两者困惑,如工作原理、适用场景有何不同,日常如何选择。本文将通俗拆解两者核心原理、关键区别,结合实际场景,助你读懂这两种“核心感知设
    的头像 发表于 04-07 09:58 156次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>交流互感器与交直流<b class='flag-5'>一</b>体互感器:原理、区别及应用(上)

    读懂爱芯元智2025年度报告

    读懂爱芯元智2025年度报告
    的头像 发表于 03-28 11:42 343次阅读
    <b class='flag-5'>一</b>图<b class='flag-5'>读懂</b>爱芯元智2025年度报告

    全自动划片机与半自动划片机怎么选?读懂选型关键

    全自动划片机与半自动划片机怎么选?读懂选型关键在半导体封装、LED制造、光伏电池加工等精密加工领域,划片机作为实现晶圆、芯片等材料高精度切割的核心设备,其选型直接决定生产效率、产品良率及综合
    的头像 发表于 03-16 20:54 528次阅读
    全自动划片机与半自动划片机怎么选?<b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>选型关键

    读懂MAX20733集成式降压开关稳压器

    读懂MAX20733集成式降压开关稳压器 在当今电子设备对高性能、高效率电源的迫切需求下,款优秀的开关稳压器至关重要。今天我们就来深入剖析
    的头像 发表于 03-16 10:30 257次阅读

    读懂TUSS4440:变压器驱动超声波传感器IC的极致应用

    读懂TUSS4440:变压器驱动超声波传感器IC的极致应用 作为电子工程师的我们,在设计工业超声波应用系统时,总是在寻找高性能、功能丰富且易于集成的器件。今天要给大家详细介绍款来
    的头像 发表于 02-11 16:50 571次阅读

    读懂SDWAN:打破网络壁垒,赋能企业数字化转型——附云边云科技实践解析

    种更高效、灵活、经济的网络解决方案。而SDWAN(软件定义广域网)的出现,正是为了解决这些难题,成为企业数字化转型的“网络基石”。今天,我们就用通俗的语言,读懂S
    的头像 发表于 02-09 14:51 774次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>SDWAN:打破网络壁垒,赋能企业数字化转型——附云边云科技实践解析

    读懂VCSEL芯片为何与众不同

    VCSEL芯片是如何诞生的?是德科技带你走进慧芯激光产业园探究竟!
    的头像 发表于 01-09 14:19 848次阅读

    读懂:CWDM和DWDM的核心差异

    光纤通信里的“两兄弟”CWDM和DWDM,名字只差个字母,差别可大了去!今天讲透核心差异,小易帮你快速分清~
    的头像 发表于 09-17 18:19 1421次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>:CWDM和DWDM的核心差异

    读懂 PWM控制背光亮度原理

    关于PWM控制背光亮度原理的详细介绍 读懂PWM调光:为何你的屏幕亮度可随心而变? 你是否曾好奇,手机或电脑屏幕的亮度是如何从最暗无级调整到最亮的?这背后的魔法,主要归功于项名为
    发表于 09-03 08:48

    读懂光模块

    随着人工智能(AI)技术的飞速发展,AI数据训练及应用往往涉及到海量的数据传输和实时交互,对算力和网络的需求正呈现爆发式的增长。
    的头像 发表于 08-11 17:16 5613次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>光模块

    读懂高速信号眼图

    眼图是个统计叠加的概念,是系列数字信号在示波器上积累而显示的图形,通过它可以观察出码间串扰和噪声对系统的影响,从而估计系统优劣。个完整的眼图应该包含从“000”到“111”的所有状态组,且
    的头像 发表于 07-30 17:33 6122次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>高速信号眼图

    读懂智能高侧开关

    在汽车电子领域,“智能高侧开关”与“智能高边开关”这两个名词频繁被提及,它们实则指代同事物。为表述统,后续我们皆以“智能高侧开关” 称之。接下来,我们将从三个维度深入剖析智能高侧开关:其为它
    发表于 06-04 10:03 3161次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>读懂</b>智能高侧开关

    读懂什么是磁性编码器

    磁性编码器是种用于测量角度和线性位置的传感器。它使用磁性信号来监测旋转或线性位置的变化,并把这些变化转换成数字信号。磁性编码器可用于各种应用中,比如机器人、汽车、数控机床等领域
    的头像 发表于 04-27 17:18 1249次阅读

    读懂德明利2024年度报告

    读懂德明利2024年度报告
    的头像 发表于 04-25 22:42 801次阅读
    <b class='flag-5'>一</b>图<b class='flag-5'>读懂</b>德明利2024年度报告