如何理解成员变量在堆内,局部变量 栈在栈内

对局部变量(栈内存)的困惑
[问题点数:20分,结帖人hanyj_3000]
本版专家分:5
结帖率 99.02%
CSDN今日推荐
本版专家分:33864
2012年5月 C/C++大版内专家分月排行榜第一
2012年7月 C/C++大版内专家分月排行榜第二2012年6月 C/C++大版内专家分月排行榜第二
本版专家分:6139
本版专家分:14864
2012年3月 VC/MFC大版内专家分月排行榜第三2012年1月 VC/MFC大版内专家分月排行榜第三
本版专家分:369035
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:9896
2012年4月 C/C++大版内专家分月排行榜第三
本版专家分:5
本版专家分:14562
本版专家分:5
本版专家分:5
本版专家分:210
本版专家分:475
匿名用户不能发表回复!|
其他相关推荐对象在堆上,栈上,还是函数里面的局部变量
没有更多推荐了,java中成员变量都储存在栈内存中吗_百度知道
java中成员变量都储存在栈内存中吗
小弟java菜鸟一枚,请教各位大神。我们知道,在函数内的变量我们称作是局部变量,储存在栈内存中。直接定义在类中的变量是成员变量,据说所有的成员变量都会储存在堆内存中,是这样吗?假设我现在定义一个成员变量int a = 10,据说成员变量要存放在堆内存中,...
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
一个完整的Java程序运行过程会涉及以下内存区域:寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。栈:保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。代码段:用来存放从硬盘上读取的源程序代码。数据段:用来存放static定义的静态成员。对于局部变量,如果是基本类型,会把值直接存储在栈;如果是引用类型,比如String s = new String(&william&);会把其对象存储在堆,而把这个对象的引用(指针)存储在栈。再如String s1 = new String(“william”);String s2 = s1;s1和s2同为这个字符串对象的实例,但是对象只有一个,存储在堆,而这两个引用存储在栈中。类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中),基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。而类的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。
采纳率:77%
为您推荐:
其他类似问题
八字的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Java代码优化--尽可能地使用stack(栈)变量(方法内部的局部变量)
Java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量。
我们写一个Java类,在其内部方法中定义的局部变量或对象是存储在stack(堆栈)中的,且JVM是一种stack-based的,因此访问和操纵stack中的数据时性能最佳。而Java类的instance变量(这个类的field)和static变量是在constant pool(常量池)中存储和得到访问的。constant pool中保存了所有的符号引用(symbolic references),指向所有型别(types)、值域(field),以及每个型别所使用的所有函数(mothods)。访问instance和static变量时,由于它们存放于constant
pool中,所以JVM需要使用更多更耗时的操作码(分析程序生成的bytecode可以看出来)来访问它们。
下面给出一段代码示例,对比后说明怎么尽可能地使用stack变量:
public class StackVars {
// instance变量
private static int staticX; //static 变量
public void stackAccess(int val) { //访问和操作stack变量j
int j = 0;
for (int i = 0; i & i++) {
public void instanceAccess(int val) {//访问和操作instance变量x
for (int i = 0; i & i++) {
public void staticAccess(int val) {//访问和操作static变量staticX
for (int i = 0; i & i++) {
staticX += 1;
经测试,发现运行instanceAccess()和staticAccess()方法的时间大约相同,但却比运行stackAccess()方法慢了2~3倍。因此我们对instanceAccess()、staticAccess()两个方法的代码作以下调整,以得到更快的性能:
public void instanceAccess(int val) {//访问和操作instance变量x
int tempX=x;
for (int i = 0; i & i++) {
tempX += 1;
public void staticAccess(int val) {//访问和操作static变量staticX
int tempStaticX=staticX;
for (int i = 0; i & i++) {
tempStaticX += 1;
staticX=tempStaticX;
改善之处就是将instance和static变量放到循环之外,而用一个stack变量来完成多次局部运算,最后再将这个stack变量的值传回instance或static变量,从而提高了代码的性能。
java 基础之成员变量,成员方法和局部变量,实例方法
java内存解析--heap(堆)stack(栈)的理解
java存储机制(栈、堆、方法区详解)
深入Java核心:JVM中的栈和局部变量(多线程调用同一方法)
java堆栈类使用实例(java中stack的使用方法)
java 堆、栈、方法区/ 类变量、成员变量、局部变量
thread线程栈size及局部变量最大可分配size
java堆栈类使用实例(java中stack的使用方法
Java源代码分析之Stack栈
关于局部变量在循环里的生存法则
没有更多推荐了,在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
下面这个类A里的int a,是存放在堆还是栈(Java虚拟机栈)内存?
public class A {
int a = 0;
B b = new B();
b是对象的引用肯定是存放在堆内存,那a呢?
看网上说a也是存放在堆内存,但看书上说:
Java虚拟机栈(VM Stack)的局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
在java中只要是成员变量,一旦它所在类被实例化后,都是放在堆内存的,不管它是不是基础类型。局部变量才是放在栈内存的。所以java比其他语言内存安全的多。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
堆内存,多个线程写操作这个对象的基本数据类型的成员变量会有线程安全问题.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
局部变量表是方法才用到的。a是实例变量。这两者没有联系的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这里有比较清晰的说明
简单翻译下:
Heap space 堆空间: 所有存活的对象在此分配.Stack space 栈空间: 方法调用时保存变量对象的引用或变量实例.Perm space : 保存已加载的类的信息.
Student std = new Student();执行后内存情况如下:
Heap堆: 保存 "new Student()"Stack栈: 保存实例变量信息 "std"Perm Space: 保存类 Student 的信息.
这是一般性的描述, 具体实际上与JVM的实现及CPU平台相关. JDK里的实现通常是基于栈的, 即先将变量压入栈push,再invoke调用相应的方法. 但Android的Smali实际的Dalvik虚拟机为适应ARM处理,更多时用的是寄存器, 很多时调用是把方法的参数加载到各个寄存器,然后调用, 总之, 泛泛而言, java语言规范和jvm虚拟机规范是两码事, 你完成可以写一个不用堆或栈的虚拟机, 谁让你长得帅又这么有才呢 ;)
假设有下面一段代码:
public class Memory {
public static void main(String[] args) { // Line 1
int i=1; // Line 2
Object obj = new Object(); // Line 3
Memory mem = new Memory(); // Line 4
mem.foo(obj); // Line 5
} // Line 9
private void foo(Object param) { // Line 6
String str = param.toString(); //// Line 7
System.out.println(str);
System.out.println(str==str.intern());
当程序运行到第5行(Line 5) 的内存情况如下图所示:
PS:(Line 8),这行会输出true,意味着来自己于string pool?
关于局部变量是否放在字符串池的问题, 没有找到太直接的说法, 看上去不同的JVM版本有一些实现差导. 不过 @潘金莲的评论可能更接近于事实, 即局部变量(可能)不存在于字符串池, 希望看到的同学不要被这个图误导, 想了解更多,查更多资料才好!
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 栈空间局部变量连续存放吗 的文章

 

随机推荐