类全局变量的Reference保存在堆中还是栈中

问题描述

比如我有两个类,分别是TestA 和 TestBpublic class TestA { public List<String> list = new ArrayList<String>();}public class TestB { public static void main(String[] args) { TestA a = new TestA(); a.list.add("Test"); }}我看书的时候说所有的reference都保存在栈中,而new出来的对象属性 包括全局属性都保存在堆中, 那么a应该是保存在栈里面,而new出来的TestA中的list这个Reference保存在堆还是栈啊,很困惑。希望各位大侠解惑,谢谢

解决方案

static变量的引用在方法区,方法区可以位于堆上也可以位于栈上非static变量的引用都在java堆上,跟对象是一起的只有方法调用的时候,才会有java栈的操作,才会将引用入栈、出栈,但这也只是临时的,方法调用结束后,栈帧就废弃了所以,在main方法中,本身是一个方法调用,java栈有main方法的帧,new出来的TestA中的list对象本身在堆上,引用也在堆上,但.add操作的时候会将堆中list的引用入栈以完成add操作
解决方案二:
如果楼主对这个问题很感兴趣,那么只有深入理解的jvm的工作原理才能理解的更透彻我觉得lz看下《深入java虚拟机》第二版后对这个问题就大彻大悟了
解决方案三:
其实很简单,就是对象或者方法名就是一个个的映射在栈中,而他们的实体放在堆中通过一个个的映射关系可以取得
解决方案四:
public List<String> list = new ArrayList<String>(); 这个list在栈中,new ArrayList<String>()在堆中,引用list指向堆中new 的ArrayList TestA a = new TestA(); a也在栈中,new TestA()在堆中,引用a指向堆中new的 TestA(),注意这个引用a指向的是TestA的对象 a.list.add("Test"); 调用对象a的成员变量list的add方法,传入字符串参数"Test"综上,a list都是在栈中,只是指向不同而已
解决方案五:
栈中。虽然new出来的对象在堆中,但是不代表里面的都在堆中,底层里面有自己的映射的。

时间: 2024-08-01 19:54:32

类全局变量的Reference保存在堆中还是栈中的相关文章

Java中堆内存和栈内存详解

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存

Java中的堆内存与栈内存分配浅析

Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对 象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量 分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以 立即被另作它用. 堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来 管理.在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量

java 堆内存 与栈内存

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中

详解Java的堆内存与栈内存的存储机制_java

堆与内存优化    今天测了一个项目的数据自动整理功能,对数据库中几万条记录及图片进行整理操作,运行接近到最后,爆出了java.lang.outOfMemoryError,java heap space方面的错误,以前写程序很少遇到这种内存上的错误,因为java有垃圾回收器机制,就一直没太关注.今天上网找了点资料,在此基础上做了个整理.  一.堆和栈     堆-用new建立,垃圾回收器负责回收          1.程序开始运行时,JVM从OS获取一些内存,部分是堆内存.堆内存通常在存储地址的

Java 堆内存与栈内存详细介绍_java

 Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. ​ 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取

【类中的static变量在栈中吗?】

问题描述 [类中的static变量在栈中吗?] 解决方案 在静态区中,是一个独立的区域,和堆.栈并列的 解决方案二: 数据区,跟全局变量等在一个sector 解决方案三: 局部变量: 栈区 局部静态变量:静态区 全局变量: 静态区的常量区 全局静态变量:静态区 内存分四个区:静态区,栈区,堆区,代码区 解决方案四: 当然不在,类中的一切变量都在堆上.堆栈上只有函数的局部变量. 解决方案五: 这个其实很好理解,都不需要死记硬背,也不需要看书. 一说你就明白了.为什么要堆栈?因为函数允许嵌套调用,所

C++:从栈和堆来理解C#中的值类型和引用类型

C++中并没有值类型和引用类型之说,标准变量或者自定义对象的存取默认是没有区别的.但如果深入地来看,就要了解C++中,管理数据的两大内存区域:栈和堆. 栈(stack)是类似于一个先进后出的抽屉.它的体积是有限的,一般为2M左右. 而堆(heap)则相对来说体积可以很大,这一般跟计算机的虚拟内存设置有关系. 栈中存取对象的内存是自动回收的,用完即销毁了,一般方法内部的变量和参数都是通过栈来存取的(但也正因为如此,它们的生命周期很短).但它的问题是,体积有限. 一些大的对象,我们可能要通过堆来创建

javascrpit-JS中堆内存和栈内存的区别

问题描述 JS中堆内存和栈内存的区别 JS中对象分为基本类型和引用类型,基本类型存放在栈内存,引用类型存放在堆内存.请问栈内存和堆内存的区别是什么,为什么这两种对象分别存储在不同的内存中? 解决方案 这很好理解,比如说这么个函数: function sum(i) { if (i == 1) return 1; return i + sum(i - 1); } 显然,这是一个递归函数,函数自己调用自己. 那么每个调用,都必须保存一个i的变量. 此时就要用堆栈.堆栈的栈顶始终保持着函数的局部变量.当

java垃圾回收机制-java堆中方法区中的内容会被删除么

问题描述 java堆中方法区中的内容会被删除么 java有垃圾回收机制,会自动回收不使用的对象,问题一:那在堆中的方法区中存储的关于类的代码以及常量池等这些信息会, 在不使用这个类以后,这些信息是会被销毁么?怎样被销毁呢?是由GC回收么?问题二:栈中自动分配的存储的对象引用会被自动销毁么?代码运行之后销毁么? 解决方案 堆上没有什么方法区.代码放在代码区,函数的局部变量放在堆栈上.栈中自动分配的存储的对象引用会被自动销毁么,是的,在函数返回的时候销毁.