3.JVM内存区域划分

3 篇文章 1 订阅
订阅专栏

前言

上一节我们详细学习了类加载器,我们接着思考下一个问题:

  1.  类加载器将class文件加载到JVM内存的什么位置?
  2. JVM内部内存是怎样划分的?

通过本节我们将寻找到答案,并将掌握以下知识:

1. JVM虚拟机3大组成部分

2. 内存模型

3. 栈、堆详细解释

 干货满满,我坚持写,你加油看!!!

JVM虚拟机的内存划分

JVM虚拟机由3大部分组成:类装载子系统、运行时数据区(内存模型)、字节码执行引擎。这3部分是怎样配合工作的呢?

  •  类装载子系统将class文件加载到运行时数据区。
  • 字节码执行引擎去执行代码

我们主要研究的是运行时数据区,也叫做内存模型。内存模型内又主要划分成了5块内存区域:栈、堆、本地方法栈、方法区(元空间)、程序计数器。下面我们详细研究这5块内存区域。

 栈

   栈,又称为线程栈。在一个线程创建时,就会在栈空间内分配一块本线程私有的内存空间,叫做线程栈。每个线程的线程栈相互隔离,互不干扰。

   在线程执行某个方法时,会在自己的线程栈内给这个方法分配一块内存,叫做栈帧。主要用来存放局部变量。方法执行完毕之后,就会释放栈帧的内存。

   栈帧内部又主要划分成4块内存区域:局部变量表、操作数栈、动态链接、方法出口。

  • 局部变量表: 存放这个方法内的局部变量。  
  • 操作数栈:在运行期间,需要操作的操作数临时中转内存空间。
  • 动态连接:将符号引用转换为直接引用。
  • 方法出口:方法调用完成,去哪里继续执行。

方法区

 方法区,主要存放3类信息:常量、静态变量、类信息。

方法区和永久代以及元空间有什么关系?

 方法区、永久代以及元空间的关系类似于Java种的接口和类的关系。类可以看作是永久代和元空间,接口可以看作是方法区。也可以说永久代以及元空间是hotSpot虚拟机对虚拟机规范中方法区的两种实现。

永久代是1.8之前的方法区实现,元空间是1.8之后的元空间实现。

为什么要将永久代替换为元空间呢?

整个永久代有一个JVM本身设置的固定大小上限,无法进行调整。而元空间使用的是直接内存,受本机可用内存的限制,虽然元空间仍然可能溢出,但相对永久代几率更低。 

 

程序计数器

程序计数器,是用来记录程序当前执行的位置。每个线程都有自己独有的程序计数器。

当User.class文件被加载到方法区后,由字节码执行引擎去执行代码,每执行完一句代码,字节码执行引擎都要去修改程序计数器中的代码位置。

 本地方法栈

C++语言编写的,native方法。每个线程独有的。

堆内存空间划分

堆内存分为年轻代和老年代,年轻代占堆内存的1/3,老年代占堆内存的2/3。年轻代内存又分为Eden区和Survivor区,Eden区占年轻代的8/10,Survivor区占年轻代的2/10。Survivor区又分为S0、S1,各占Survivor的一半空间。

为什么区分年轻代和老年代?

这主要和垃圾收集有关。我们创建的对象,它们的存活时间是不同的,为了方便收集垃圾对象,将堆内存划分为年轻代和老年代。

年轻代里的对象,创建之后很快就会被回收,需要一种垃圾回收算法。

老年代里的对象,需要长期存在,所以需要另外一种回收算法。所以需要两个区域来存放不同的对象。

 对象在年轻代和老年代间的流转

我们应该从以下几个问题入手,去分析对象在年轻代和老年代间的流转。

1. 哪些对象进入年轻代?哪些对象进入老年代?

2. 年轻代什么时候触发Minor GC?

3. 老年代什么时候触发Full GC?

1.哪些对象进入年轻代?哪些对象进入老年代?

  • 我们创建的大部分对象都会优先在年轻代分配内存,大对象会直接进入老年代。
  • 达到分代年龄的对象,从年轻代转移到老年代。

2.年轻代什么时候会触发Minor GC?

  • 当Eden区沾满后,就会触发Minor GC.

JVM内存区域划分.docx
07-15
JVM内存区域划分
JVM内存区域划分.pdf
03-28
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
JVM内存区域划分
m0_63039919的博客
11-17 1574
JVM全称Java Virtual Machine,也称java虚拟机。那什么是虚拟机呢,相信大家应该多多少少都有听说过。就是。简单粗暴的可以理解为可以在上面进行一些操作的一个计算机,但是这个计算机是虚拟的、不存在。
docker java 内存分配_Docker容器中的JVM内存分配
weixin_35048919的博客
02-13 739
为了纪念过去的美好时光……> The logo that takes you to 90's默认情况下,JVM会根据系统内存自动分配一些内存。 即使它在Docker容器中运行,JVM也会(尝试)分配整个系统内存的一部分。docker run java java -XshowSettings:vm -versionVM settings: Max. Heap Size (Estimated):...
2024年Java最全JVM 内存区域总结:方法区+堆内存+本地方法栈+元空间—,最新阿里Java高级面试题及答案
最新发布
2401_84584338的博客
05-05 925
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。Mybatis面试专题MySQL面试专题并发编程面试专题本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。
深入理解JVM内存区域
walk的博客
08-12 424
一、运行时数据区域
Java虚拟机内存划分
weixin_42960380的博客
10-09 452
jvm内存
JVM(内存划分+类加载+GC)
m0_58761900的博客
12-13 3616
🐲 1. JVM 内存划分 🐲 2. JVM 类加载 🦄 2.1 类型加载是干啥的 🦄 2.2 类加载的简略流程 🦄 2.3 什么时候会进行类加载 🦄 2.4 双亲委派模型 🐲 3. GC 垃圾回收机制 🦄 3.1 GC 是什么 🦄 3.2 GC 回收哪部分内存 🦄 3.3 GC 具体是怎么回收的 🦖 3.3.1 怎么判定某个对象是否是垃圾 (引用计数/可达性分析) 🦖 3.3.2 具体是怎么回收的 (标记清除/复制算法/标记整理/分代回
JVM 性能调优_JVM 内存区域划分.pdf
02-26
JVM性能调优_JVM内存区域划分 JVM(Java Virtual Machine)是 Java 语言的核心组件之一,其性能优化对 Java 应用程序的执行效率和稳定性具有至关重要的影响。在 JVM 中,内存区域划分和管理是性能优化的关键所在...
JVM中有哪些内存区域及其作用
08-25
主要介绍了JVM中有哪些内存区域,分别是用来干什么的,vm内又是如何划分内存的呢?这个内被加载到了那一块内存中?,需要的朋友可以参考下
java 虚拟机内存划分_JAVA虚拟机(JVM)详细讲解(二)——内存划分
weixin_36433524的博客
03-05 179
详细内容我们知道,在C++语言里,如果想使用一个对象,需要对其进行new操作;如果不用这个对象了,需要对其进行delete操作。一旦开发人员忘记写delete语句了,就会造成内存泄露。【内存被对象占用着不还,就叫内存泄露。】而java就聪明了,它从“手动”进化成了“自动”,把内存的控制权力交给了虚拟机。下面我们就来窥探一下jvm是怎么进行自动内存管理的。自动内存管理分为两部分:给对象分配内存和回收...
Java虚拟机的内存区域划分
12-22
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成很多个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。Java虚拟机规范中把Java虚拟机所管理的内存划分为以下几个区域。   一、程序计数器(Program Counter Register)   程序计数器是一块较小的内存空间,它的作用是当前所执行的字节码的行号指示器。它是线程私有的,即各个线程都有独立的程序计数器。   如果线程正在 执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在
JVM内存划分
qq_42803467的博客
07-21 115
程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址. 虚拟机栈(JVM Stack): 重点是存储局部变量表(当然也有其他信息). 我们刚才创建的 int[] arr 这样的存储地址的引用就是在这里保存. 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的. 堆(Heap): JVM所管理的..
JVM内存区域划分(jdk7和jdk8)
热门推荐
l1394049664的博客
08-08 1万+
  目录 前言 1、什么是JVM 2、JRE/JDK/JVM是什么关系 3、JVM执行程序的过程 4、 JVM的生命周期 5、JVM垃圾回收 一.运行时数据区的组成 1.程序计数器 2.Java栈(虚拟机栈) 1)、局部变量表 2)、操作数栈 3)、指向运行时常量池的引用 4)、方法返回地址 3.本地方法栈 4.堆 5.方法区  直接内存(Direct Memo...
JVM内存划分
鸭梨的博客
06-24 691
JVM内存区域分为线程私有区域(程序计数器、虚拟机栈、本地方法区)、线程共享区域(堆、方法区)和直接内存,如图1-2所示。 线程私有区域的生命周期与线程相同,随线程的启动而创建,随线程的结束而销毁。在JVM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存在与否和本地线程的启动和销毁对应。 线程共享区域随虚拟机的启动而创建,随虚拟机的关闭而销毁。 直接内存也叫作堆外内存,它并不是JVM运行时数据区的一部分,但在并发编程中被频繁使用。JDK的NIO模块提供的基于Channel与Buffer
JVM内存分区和垃圾回收GC机制
linshijun33的专栏
07-20 3110
JVM内存分区JVM(Java virtual machine),即Java虚拟机,它的厉害之处在于平台无关性,“一处编写,到处运行”。JVM通过执行目标字节码(.class),解释在不同平台上的机器运行,所以在具体的平台上并不产生直接依赖。JVM内存空间主要有5种分区情况: 1. 线程计数器:一块较小的内存空间,每个线程都有自己的线程计数器,用于完成不同线程上下文切换,如果调用的是本地方法,p
JVM(一)——GC,内存分配和垃圾回收
Zerohuan的专栏
01-03 3602
心得:Java中垃圾回收和内存可以实现高度的自动化,栈帧可以由JVM自动分配和回收,局部变量表和操作数栈也可以在编译时就确定好,堆中的内存分配和回收才是JVM关注的重点,JVM实现大多采用可达性分析来标记存活对象,什么时候标记?让用户线程主动跑到那些安全的地方(引用关系不变的时候,SafePoint和Safe Region),再由GC收集器来标记进行处理。不同的垃圾收集器甚至可以决定堆的内存布局,比
jvm内存分类
Ha_Pipi的博客
06-29 2137
1.方法区(线程共享)存放常量池,静态变量,构造函数2.堆(线程共享)存放类或对象3.栈(线程独占)存放局部变量和对象的引用4.程序计数器(线程独占)存放当前线程执行的内存地址,记录线程中断的地方...
深入理解JVM内存结构(栈,堆划分
令走天下的博客
06-05 1439
一、JVM的整体流程 JVM在运行过程中会把它所管理的内存划分成若干不同的数据区域! 线程私有:程序计数器、虚拟机栈、本地方法栈 线程共享:堆、方法区 二、线程私有 程序计数器 指向当前线程正在执行的字节码指令的地址(行号),JVM里面唯一不会发生OOM的区域。 java是多线程,为了记录线程之间的切换。确保在多线程的情况下能正常执行。 本地方法栈 其实就是native方法调用了jni层...
jvm内存区域划分 Java8
10-10
Java8 中,JVM 内存区域主要划分为以下几个部分: 1. 程序计数器(Program Counter Register):记录当前线程执行的字节码地址,是线程私有的内存区域。 2. Java 虚拟机栈(Java Virtual Machine Stacks):每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,是线程私有的内存区域。 3. 本地方法栈(Native Method Stack):与 Java 虚拟机栈类似,但是为本地方法服务,也是线程私有的内存区域。 4. Java 堆(Java Heap):存放对象实例,是所有线程共享的内存区域。 5. 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,也是所有线程共享的内存区域。 6. 直接内存(Direct Memory):和 Java 堆一样,也是堆外内存,但是它不受 Java 堆大小限制。JDK1.4 引入 NIO 类型,引入了一种基于通道与缓冲区的 I/O 方式,可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用操作这块内存。可以提高性能,但是也增加了内存管理的复杂度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 3.JVM内存区域划分 1145
  • 2.类加载器 332
  • 1.jvm类加载机制 123

分类专栏

  • JVM 3篇

最新评论

  • 1.jvm类加载机制

    CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 2.类加载器
  • 1.jvm类加载机制
2022年3篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司宜宾百度seo哪家好河池如何制作网站哪家好秦皇岛seo排名河池网页设计报价吉安网站优化按天收费哪家好威海外贸网站制作襄阳百度网站优化排名公司青岛关键词按天扣费广东外贸网站建设多少钱南平百度网站优化排名公司同乐企业网站设计遂宁网站搭建推荐长春企业网站设计公司泰州如何制作网站哪家好张家界网站推广方案哪家好大鹏百度竞价包年推广萍乡seo网站优化哪家好德阳高端网站设计多少钱四平优秀网站设计公司济源SEO按天计费上饶建设网站新余网站推广公司枣庄网站开发价格坂田网站优化按天扣费公司亳州建站报价驻马店建设网站推荐东营网站优化软件推荐泉州模板网站建设公司甘孜阿里店铺托管哪家好宜宾网站优化排名多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化