java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中
java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”。
根据“Java中的变量与数据类型”中的介绍,“变量是在内存中分配的保留区域的名称。换句话说,它是一个内存位置的名称”,也就是说我们通过这个变量名字就可以找到一个指向这个变量所引用的数据的内存指针,根据变量的类型我们可以知道这个指针之后的几个字节里存储了这个变量所引用的数据。
所以,了解变量在方法区、栈内存、堆内存中的分配要了解两部分内容,一个是“变量在内存中的分配”,另一个是“变量所引用的数据在内存中的分配”。以下简称为“变量分配”与“数据分配”。
原始数据类型变量:
原始数据类型变量的“变量分配”与“数据分配”是在一起的(都在方法区或栈内存或堆内存)
引用数据类型变量:
引用数据类型变量的“变量分配”与“数据分配”不一定是在一起的
示例代码:
class Fruit {
static int x = 10;
static BigWaterMelon bigWaterMelon_1 = new BigWaterMelon(x);
int y = 20;
BigWaterMelon bigWaterMelon_2 = new BigWaterMelon(y);
public static void main(String[] args) {
final Fruit fruit = new Fruit();
int z = 30;
BigWaterMelon bigWaterMelon_3 = new BigWaterMelon(z);
new Thread() {
@Override
public void run() {
int k = 100;
setWeight(k);
}
void setWeight(int waterMelonWeight) {
fruit.bigWaterMelon_2.weight = waterMelonWeight;
}
}.start();
}
}
class BigWaterMelon {
public BigWaterMelon(int weight) {
this.weight = weight;
}
public int weight;
}
内存分配图
同一种颜色代表变量和对象的引用关系
由于方法区和堆内存的数据都是线程间共享的,所以线程Main Thread,New Thread和Another Thread都可以访问方法区中的静态变量以及访问这个变量所引用的对象的实例变量。ps:方法区存储的都是只加载一次的。
栈内存中每个线程都有自己的虚拟机栈,每一个栈帧之间的数据就是线程独有的了,也就是说线程New Thread中setWeight方法是不能访问线程Main Thread中的局部变量bigWaterMelon_3,但是我们发现setWeight却访问了同为Main Thread局部变量的“fruit”,这是为什么呢?因为“fruit”被声明为final了。
当“fruit”被声明为final后,“fruit”会作为New Thread的构造函数的一个参数传入New Thread,也就是堆内存中Fruit
1
对
象
中
的
实
例
变
量
v
a
l
1对象中的实例变量val
1对象中的实例变量valfruit会引用“fruit”引用的对象,从而New Thread可以访问到Main Thread的局部变量“fruit”。
java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中相关教程
Java虚拟机中的垃圾回收算法
Java虚拟机中的垃圾回收算法 这里写自定义目录标题 垃圾回收算法 内存分代管理 实现垃圾回收的方式一般分为标记清除算法、标记整理算法及复制算法。 1.标记清除算法 。算法分为标记及清除两个阶段,在标记完成后统一回收所有被标记的对象。缺点有两个:首先
Java操作Elasticsearch 之 [Java High Level REST Clientedit]
Java操作Elasticsearch 之 [Java High Level REST Clientedit] 1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json。 向 Elasticsearch 中存储数据,其实就是向 es 中的 inde
Java springboot 整合ice协议的demo
Java springboot 整合ice协议的demo 最近有个调接口的需求, 我用的Java 接口服务端用的 c++ . 先引入jar包 ice3.7.4 jar包 dependency groupIdcom.zeroc/groupId artifactIdice/artifactId version3.7.4/version/dependencydependency groupIdcom.zeroc/group
怎么用Java来删除 Excel 中的空白行和列
怎么用Java来删除 Excel 中的空白行和列 当我们在操作一些包含大量数据的Excel表格时,可能会因为修改数据而留下一些空白行或列,此时我们可以借助Free Spire.XLS for Java来批量删除Excel工作表中存在的空白行和空白列,接下来就将使用到的Java代码分享给大
【Java集合类】Collection与Collections的区别
【Java集合类】Collection与Collections的区别 Collection接口与其子类的关系: Collection是一个接口,它本身就是不可以实例化的,而它的子类或者实现类却是可以的。 而Collections则是工具类,方法都是用于操作Collection,方法包括了一些排序搜索等算法,
抽象类与接口
抽象类与接口 抽象类与接口 抽象类: Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐
JS快速回顾
JS快速回顾 1.JavaScript简介 是属于网络的脚本语言,向HTML页面添加交互性,用来改进设计、验证表单、检测浏览器、创建Cookies。 2.JS使用 1. script 标签 :浏览器会解释并执行script标签中的JS。 2. JS函数与事件 :把JS代码放入函数中,在事件发生时调用
JavaEE笔记——前端技术之flex布局
JavaEE笔记——前端技术之flex布局 目录 flex布局 01. flex的介绍 用flex布局实现水平垂直居中 2.容器的属性 flex-direction 示例 justify-content 示例 flex-wrap 示例 align-items (单行对齐) 示例 align-content(多行对齐) 示例 3.项目属性 flex 示例 alig