当前位置: 首页 > news >正文

JVM-运行数据区(堆、栈、元空间)

 文章声明:文章图片均来自互联网,因为本人画的图不够生动。

运行数据区是JVM最重要的一个区域。

运行数据区由栈、堆、元空间构成。

栈:程序计数器、JVM虚拟机栈,本地方法栈

本地方法栈:加载native修饰的方法,native修饰的方法都不是java原生的方法,比如C++

程序计数器:一个指针,记录正在执行的JVM指令的地址。

代码运行,执行命令。而每个命令都是有行号的,会使用程序计数器来记录命令执行到多少行了

虚拟机栈:

虚拟机栈的组成:局部变量表、操作数栈、动态连接、方法出口、栈帧

局部变量表:

存放基本数据类型、引用数据类型在堆中的地址值、方法返回的地址

操作数栈:

JVM在计算过程中的临时存储空间

动态连接:

一个指向运行时常量池中该栈帧所属方法的引用

方法出口:

记录方法结束后,继续运行下一个栈帧对应方法那行代码

栈帧:

栈的最小单位,用来表达方法与方法之间的调用关系

所以什么是虚拟机栈?

  1. 每个线程运行时所需要的内存,成为虚拟机栈,先进后出
  2. 每个栈由多个栈帧组成,对应这每次方法调用时所占的内存
  3. 每个栈帧只能有一个活动栈帧,对应着当前正在执行的那个方法

栈内存的释放方式:垃圾回收是否涉及栈内存?

垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放

栈内存溢出情况?

  1. 递归调用

  1. 栈帧过大导致栈内存溢出

堆:线程共享的区域

主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法再扩展时OutOfMemoryError异常(内存溢出)

Young 年轻区(代): Eden+S0+S1, S0 和 S1 大小相等, 新创建的对象都在年轻代,主要存放朝生夕灭的对象。被小范围但高频的mini gc回收

Tenured 年老区: 经过年轻代多次垃圾回收存活下来的对象存放在年老代中。

在JDK1.8之前堆中还存在一个永久代的东西、现在以及被元空间所替代。

那么为什么JDK1.8以后取消了永久代?

永久代存储的都是类信息、静态变量、常量、编译后的代码,所以在堆中内存不可控的,会随着项目扩大而扩大,容易出现内存溢出的情况

所以、堆栈的区别是什么?

  1. 栈内存一般用来存储局部变量和方法调用,但堆内存是用来存储java对象和数组的。堆会GC垃圾回收,而栈不会
  2. 栈内存是线程私有的,而堆内存是线程共有的
  3. 两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
    1. 栈空间不足:java.lang.StackOverFlowError。
    2. 堆空间不足:java.lang.OutOfMemoryError。

方法区

  1. 方法区是各个线程共享的内存区域
  2. 主要存储类的信息、运行时常量池
  3. 虚拟机启动的时候创建,关闭虚拟机时释放
  4. 如果方法区域中的内存无法满足分配请求,则会抛出OOM

元空间实现了方法区:

元空间(元数据区):存储.class信息,类的信息,方法的定义,静态变量等。而常量池放到堆里存储,JDK1.8和JDK1.7的区别,在1.8中是由元空间取代了方法区的实现(永久代)

元空间与永久代的区别

  1. 永久代属于JVM堆的一部分、有固定大小,性能更差
  2. 元空间属于本地内存、能动态扩容、性能更好

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 黑神话悟空游戏攻略大全 黑神话悟空内存占用多少 国产3A级游戏《黑神话:悟空》评测代码已发 黑神话悟空测试画质130g MacBook可以玩黑神话悟空吗
  • C++:命名空间与输入输出
  • Go 1.21 新内置函数:min、max 和 clear
  • 如何避免常见的R语言学习陷阱?
  • 数据中台运营与实战案例集锦(125页PPT)
  • 【区块链+金融服务】基于区块链的区域股权金融综合服务平台 | FISCO BCOS应用案例
  • 多台USB 3.0相机启动时部分相机无法打开
  • 【SpringCloud】什么是MQ
  • Linux内核编程(十二)热插拔
  • Linux云计算 |【第二阶段】OPERATION-DAY2
  • CSS 伪类和伪元素
  • 5款好用的录屏软件大测评!2024最新视频录制软件排行榜
  • 8款必备人事管理系统,助力企业高效运营
  • 算法:最长递增子序列
  • docker数据卷、资源控制
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2019年如何成为全栈工程师?
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • extract-text-webpack-plugin用法
  • Java比较器对数组,集合排序
  • js写一个简单的选项卡
  • markdown编辑器简评
  • React Native移动开发实战-3-实现页面间的数据传递
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端临床手札——文件上传
  • 微信公众号开发小记——5.python微信红包
  • 我有几个粽子,和一个故事
  • ‌JavaScript 数据类型转换
  • # include “ “ 和 # include < >两者的区别
  • #WEB前端(HTML属性)
  • (70min)字节暑假实习二面(已挂)
  • (分享)自己整理的一些简单awk实用语句
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (利用IDEA+Maven)定制属于自己的jar包
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (转) Android中ViewStub组件使用
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net 垃圾回收机制原理(二)
  • .NET 通过系统影子账户实现权限维持
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net8 Blazor 尝鲜
  • .net快速开发框架源码分享
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @Transactional 竟也能解决分布式事务?
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ C++ ] 类和对象( 下 )
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • []Telit UC864E 拨号上网
  • [Angular 基础] - 指令(directives)