Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >堆、栈、方法区—JVM 内存模型分析

堆、栈、方法区—JVM 内存模型分析

作者头像
用户4464623
发布于 2020-09-10 07:46:07
发布于 2020-09-10 07:46:07
5420
举报
文章被收录于专栏:晨曦破晓の家晨曦破晓の家

前言

不论是正经或者不正经的程序猿要想变强不能光光变秃,你还必须掌握JVM相关的底层知识。

JVM 内存模型

首先先来看看下面的图这是一张JVM内存模型的一个概况图

348A1B9B-87A2-4af1-BFD0-0EEA8251343C.png

接下来我们对于运行时数据区的五个内存区域做一个简单的介绍:

1. Java虚拟机栈

虚拟机栈描述的是Java方法执行的动态内存模型。当我们的栈空间不足时,就会抛出StackOverFlowError

  • 栈帧:每一个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变量表,操作数栈,动态链接,方法出口等信息
  • 局部变量表:存放编译器可知的各种数据类型,引用类型,returnAddress类型。局部变量表的内存空间在编译器完成分配,当进入一个方法的时候,这个方法需要在帧中分配多少内存是固定的,方法运行期间是不会改变局部变量表的大小。

2. 本地方法栈

与虚拟机栈基本类似(栈的空间大小远远小于堆)

  • 虚拟机栈为虚拟机执行Java方法服务
  • 本地方法栈为虚拟机栈执行native方法服务

3. 堆内存

java进程运行过程中创建的对象存放在堆中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。

堆内存是所有线程共有的,下图中的Perm代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代也将被移除。

堆的内存模型大致为如下:

image

默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。 老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。 默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。 JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。 因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间

新生代是 GC 收集垃圾的频繁区域。 当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳

( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。

但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。

4. 程序计数器

几乎不占有内存。用于取下一条执行的指令。

  • 程序计数器是一块较小的内存区域,是当前线程所执行的字节码文件的行号指示器
  • 程序计数器处于线程独占区
  • 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果执行的是native方法,这个计数器的值是undefined
  • 此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

5. 方法区

方法区也称”永久代“,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB(64位JVM由于指针膨胀,默认是85M),可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。它是一片连续的堆空间,永久代的垃圾收集是和老年代(old generation)捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。不过,一个明显的问题是,当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会报OOM的错误。参数是通过-XX:PermSize和-XX:MaxPermSize来设定的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM系列分析- 内存模型
JVM的内存模型是java语言绕不开的一个话题。要进行java的性能调优,首先就要了解其内存模型。在诸多的面试笔试中,这也是很多面试官会考察的内容。
JathonKatu
2020/10/27
3490
JVM系列分析- 内存模型
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
在内存管理领域 ,C/C++内存管理由开发人员管理,既拥有每一个对象的所有权,还必须负责维护每一个对象生命从开始到终结的责任
小小工匠
2021/08/16
3840
详解jvm内存结构,java内存模型,java对象布局,别再搞混啦!
有面试官会让你解释一下Java的内存模型,有些人解释对了,结果面试官说不对,应该是堆啊、栈啊、方法区什么的(遇到这种面试官,就是你装逼的时刻了..)
Java宝典
2021/03/16
5700
JVM学习.01 内存模型
对于C、C++程序员来说,在内存管理领域,他们拥有对象的“所有权”。从对象建立到内存分配,不仅需要照顾到对象的生,还得照顾到对象的消亡。背负着每个对象生命开始到结束的维护和管理责任。
有一只柴犬
2024/01/25
2570
JVM学习.01 内存模型
堆、栈、方法区到底是什么?一文带你搞懂 JVM 运行时数据区内存模型!
在 JVM 的世界中,运行时数据区域是整个虚拟机的基础,它决定了程序的内存管理、线程的执行流以及垃圾回收的核心逻辑。
码哥字节
2024/11/26
4070
堆、栈、方法区到底是什么?一文带你搞懂 JVM 运行时数据区内存模型!
JVM基本结构及内存模型及优化
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。作为一个Java开发者,这是必须要掌握的知识点。
攻城狮的那点事
2019/10/03
5970
JVM 内存结构解析
以前的方法区(或永久代),用来存放class,Method等元数据信息,但在JDK1.8已经没有了,取而代之的是MetaSpace(元空间),元空间不在虚拟机里面,而是直接使用本地内存。
CoderJed
2018/09/13
1.6K1
JVM 内存结构解析
绝了!华为技术专家居然把JVM内存模型讲解这么细致!
内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。 JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨经典的JVM内存布局。
JavaEdge
2021/05/06
7060
绝了!华为技术专家居然把JVM内存模型讲解这么细致!
JVM初探 -JVM内存模型
Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。经过这么长时间的发展,Java GC机制已经日臻完善,几乎可以自动的为我们做绝大多数的事情。
哲洛不闹
2018/09/14
9660
JVM初探 -JVM内存模型
JVM内存模型——运行时数据区的特点和作用
java之所以发展到如今这个规模与生态呢很大程度上源于它的虚拟机,而内存管理又是虚拟机中的一个重要命题。可以说当JVM接手了内存管理的事宜之后呢,相对于C++手动控制管理内存,Java降低了开发者的门槛,也提高了程序的可维护性。那么JVM究竟是如何对内存进行管理的?
向着百万年薪努力的小赵
2022/12/02
6890
JVM内存模型——运行时数据区的特点和作用
JVM学习记录-jvm的内存结构管理和运行时数据区理解
本博客是为了自己学习JVM而建立,只记录一些自己学习的经过。 最近在看《深入理解Java虚拟机》这本书,里面的内容,很是乏味,因为看不懂所以就会觉得很枯燥,觉得很枯燥看着看着就犯困,然后就睡过去了,再
纪莫
2018/04/19
7470
JVM学习记录-jvm的内存结构管理和运行时数据区理解
了解JVM内存模型
如果想了解JVM内存模型,首先我们要知道JVM是什么?JVM全称 Java Virtual Machine ,即Java虚拟机,是用于运行Java程序编译后的字节码文件。
烟雨星空
2020/06/16
5660
jvm原理——第一篇jvm的运行模式
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行,属于用户态。
胡齐
2019/12/19
1.4K0
jvm原理——第一篇jvm的运行模式
JVM活学活用——Jvm内存结构
Java内存结构: JVM内存结构主要是有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分为三部分,Eden空间、From Survivor空间、To S
Janti
2018/04/10
8560
JVM活学活用——Jvm内存结构
JVM内存模型和垃圾回收机制
有的博客称方法区是永久代,那是因为前者是JVM的规范,而后者则是JVM规范的一种实现,并且只有HotSpot才有永久代,
全菜工程师小辉
2019/08/16
7230
JVM 内存详解
JVM 是 Java Virtual Machine(Java虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
zeekling
2022/06/17
1.4K0
JVM 内存详解
jvm内存结构
jvm主要分,堆、方法区、java栈、本地方法栈、程序计数器五个区域,其中方法区和堆区是线程共享的
leobhao
2022/06/28
9040
jvm内存结构
深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析
这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这些知识之后,才能更好的进行Jvm调优或者更加深入的学习,本来这些知识是晦涩难懂的,所以希望能够讲解的透彻且形象。
好好学java
2019/12/19
3800
jvm系列(二):JVM内存结构
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问
纯洁的微笑
2018/04/18
9620
jvm系列(二):JVM内存结构
JVM内存模型
JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁
黑洞代码
2021/01/14
5590
JVM内存模型
相关推荐
JVM系列分析- 内存模型
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档