java中成员变量放在堆内存中_基本数据类型的成员变量存放在堆内存还是栈内存?...

简单翻译下:

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()); // Line 8

}

}

当程序运行到第5行(Line 5) 的内存情况如下图所示:

bab5641ab66ddbc3f4f6a171e88499ed.png

PS:

(Line 8),这行会输出true,意味着来自己于string pool?

关于局部变量是否放在字符串池的问题, 没有找到太直接的说法, 看上去不同的JVM版本有一些实现差导. 不过 @潘金莲的评论可能更接近于事实, 即局部变量(可能)不存在于字符串池, 希望看到的同学不要被这个图误导, 想了解更多,查更多资料才好!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值