基本数据类型的成员变量放在jvm的哪块内存区域里?
几个月前自己提问的一个问题没人回答,现在突然翻到,自己回答下:
问题:
比如
class{
private int i;
}
如上代码,之前一直以为基本数据类型都是放在虚拟机栈中的,最近看了《深入理解jvm》,里面说到方法内定义的基本数据类型放在帧栈里,而且栈里面的数据是线程独有的,不共享。 那么基本数据类型的全局变量,到底是放在栈里面 还是堆里面,或者方法区里?
解答:
java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中需要分配多大的内存都是完全确定的,方法运行时不会改变局部变量表的大小——《深入理解java虚拟机第二版》
很多java程序员一开始就被网上的一些教程所误导:基本数据类型放在栈中,数组和类的实例放在堆中。 这个说法不准确,事实上,如上面的全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。
如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。
基本数据类型的成员变量放在jvm的哪块内存区域里?相关推荐
- java成员变量和局部变量的初始化和内存中的运行机制
成员变量: 当系统加载类或创建类的实例时,系统会自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值. eyeNum是类属性.name是实例属性 所有person实例访问eyeNu ...
- Java虚拟机:JVM 主要组成部分与内存区域
一.JVM 主要组成部分: JVM包含两个子系统和两个组件,分别为: Class loader(类装载子系统):根据给定的全限定名类名来装载class文件到运行时数据区的方法区中 Execution ...
- JVM中的五大内存区域划分详解
一.快速扫盲 1. JVM是什么 JVM是Java Virtual Machine的缩写,即咱们经常提到的Java虚拟机.虚拟机是一种抽象化的计算机,有着自己完善的硬件架构,如处理器.堆栈等,具体有什 ...
- 【搞定Jvm面试】 Java 内存区域揭秘附常见面试题解析
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习 面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...
- JVM实战与原理---内存区域分配
JVM实战与原理 目录 内存区域分配 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 6. 运行时常量池 内存区域分配 章节目的:明白虚拟机中的内存是如何划分?每块 ...
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
<p style="line-height: 19px; margin: 10px auto; color: rgb(75, 75, 75); font-family: Verdana ...
- C++ static、const和static const类型成员变量声明及其初始化
C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...
- C++ 类中特殊成员变量(常量、静态、引用)的初始化方法
有些成员变量的数据类型比较特别,它们的初始化方式和普通数据类型的成员变量有所不同.这些特殊类型的数据类型包括: 引用(&) 常量(const) 静态(static) 静态常量(static c ...
- java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
2019独角兽企业重金招聘Python工程师标准>>> /* * 几大原则 * 一.静态成员变量(Static) * 1.静态成员变量为类变量,所有对象共享同一内存空间 * 2.静态 ...
最新文章
- beego 获取字符串中的数据_MySQL中获取季度、年度等数据
- linux中oracle静默安装失败,oracle 11 Linux 静默安装 步骤及错误解决(更新中)
- 关于fullcalendar里显示json格式的events(java)
- @vue/cli启动异常:ENOENT: no such file or directory, scandir
- 教你如何看手相掌握命运!
- 【拼爹坑爹不比爹】深入理解css中position属性及z-index属性
- 二进制十六进制转换表
- 查看linux系统有哪些登陆用户,Linux_linux查看系统登录用户,Last login: Wed Jul 29 17:16:10 2009 fro - phpStudy...
- 学会这个小技巧,SSH 会话连接永远不超时!
- C++ Qt 05:Qt布局管理器 - 荒 木 - 博客园
- 中西医结合外科疾病 100247
- Oracle Data Guard 简介
- 【AI视野·今日CV 计算机视觉论文速览 第172期】Tue, 10 Dec 2019
- 表计算函数(Tableau)
- Web server failed to start. Port 8090 was already in use.
- 物联网应用层安全威胁_物联网安全威胁及对策
- c3po连接mysql带端口号_利用C3PO配置数据库连接池出现的问题
- centos7镜像下载安装
- 关于移动端页面开发(微信内置浏览器)总结
- Python爬虫学习之路(1)--前端
热门文章
- pcl里面的RoPs特征(Rotational Projection Statistics)
- mysql的四层架构_分布式数据库服务器的四层架构
- python输出箭头代码_python matplotlib 注释文本箭头简单代码示例
- html表格字体格式转换,【转】常用HTML代码速查表
- opencv32-基于距离变换和分水岭的图像分割
- 服务器Ubuntu Import Error:cannot import name main
- 测试人多少岁的软件,抖音你的三观多少岁免费测试app
- mongodb查询分页优化
- python学习笔记-day6-函数的延续【汉字转拼音模块,函数返回多个值,匿名函数,列表生成式,generator生成器,三元运算符】...
- ECharts.js学习(二)动态数据绑定