基本数据类型的成员变量放在jvm得哪块内存区域里?
2017-02-18 09:59
260 查看
java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中需要分配多大的内存都是完全确定的,方法运行时不会改变局部变量表的大小——《深入理解java虚拟机第二版》
很多java程序员一开始就被网上的一些教程所误导:基本数据类型放在栈中,数组和类的实例放在堆中。 这个说法不准确,事实上,如上面的全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。
如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。
作者:二狗
链接:https://www.zhihu.com/question/34859361/answer/67412187
来源:知乎
很多java程序员一开始就被网上的一些教程所误导:基本数据类型放在栈中,数组和类的实例放在堆中。 这个说法不准确,事实上,如上面的全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。
如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。
作者:二狗
链接:https://www.zhihu.com/question/34859361/answer/67412187
来源:知乎
相关文章推荐
- JAVA基础初探(一)核心概念(JVM,JDK,JRE)、流程控制语句、基本数据类型、关键字、标识符、常量与变量、类型转换、Debug处理
- java基本数据类型,以及JVM内存对齐的标准
- 基本数据类型变量 结构体 union 类的内存字节对齐
- Java 基本数据类型、装箱拆箱、四个内存区域、String类
- Linux下C/C++程序内存布局 各种类型数据存储区域及生长方向
- 不同数据类型变量在不同CPU或MCU下的内存占用情况还与编译器或编译选项有关
- 特殊数据类型成员变量的初始化
- [笔记][Java 4 Android][001~006] Java4android 环境配置、变量、基本数据类型
- 特殊数据类型成员变量的初始化
- 基本数据类型内存模式
- JAVA第二天变量补码进制转换基本数据类型
- 特殊数据类型成员变量的初始化
- 特殊数据类型成员变量的初始化
- Java第一课 Java的一些基本概念,Java的起源、为什么我们要学习Java语言,Java跨平台原理剖析;Java环境变量的配置,初学者常犯的问题,Java语言的基本数据类型和Java的语句。
- 【无限互联】iOS开发视频教程—2.3 iPhone开发之OC变量和基本数据类型2
- JAVA基本数据类型占用内存大小
- Java基本数据类型的内存分配
- LotusScript基本语法知识……变量和数据类型
- 特殊数据类型成员变量的初始化【转】
- 特殊数据类型成员变量的初始化