日期:2014-05-20  浏览次数:20849 次

求教一个Java内存分配的问题,谢谢!
假设在一个类中定义了全局变量:int  a  =  12; 请问"a"和"12"分别存储在内存的哪个地方呢?同理,对于一个方法中定义的局部变量int  b = 20;呢,这里的“b”和“20”的空间又是被分配到了内存的哪个地方呢?求赐教,谢谢!

------解决方案--------------------
http://www.ticmy.com/?p=151
------解决方案--------------------
     静态区里面,去看一下视频吧,全局变量是在静态区的。

1.
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。
5、程序代码区 — 存放函数体的二进制代码。
------解决方案--------------------
java中只有3种变量:
局部变量——在函数体中定义
成员变量——class成员
静态变量——class静态成员
   java程序在硬盘里存放,首先被加载到内存里,其次由操作系统找到main方法执行,再次执行过程中转化成操作系统代码。执行中的内存管理为:1.new出来的东西被分配在heap(堆区)。2.局部变量被分配在stack(栈区)。3.静态变量和字符串常量被分配在data segment(数据片段)里。4.代码被存放在code segment(代码片段)里。
    因此本题变量a 是成员变量,它的值12被分配在heap区,变量名a 就是存储该整形类型数据12所在的内存块,代表的不过是个存储空间的名称;如果是静态变量的话,声明初始化为:static int a = 12;
   局部变量b 的值20被分配在 stack里,变量b 就表示存储该值20的内存空间。
------解决方案--------------------
函数内的变量是被分配在栈上的。
对于简单型常量(int, char等),编译的时候它是被编写到指令里面的,运行的时候直接从内存中载入寄存器,即所谓的寄存器寻址。

------解决方案--------------------
引用:
java中只有3种
局部变量——在函数体中定义
成员变量——class成员
静态变量——class静态成员

没有所谓全局变量,那是C/C++的东西

另外学JAVA你就不要管他存储在内存哪个地方了,那是C/C++程序员做的事情。

JAVA这门落后的语言连指针都没,C#里是可以在unsafe代码块中使用指针的!

如果你是新手,那么我建议放弃Jav……
java里没有指针是有原因的。而且这个问题应该从两方面看,第一C/C++有指针是他的优点,效率高;但是同时也很危险,因为在分配内存时,如果忘了释放,容易造成内存泄漏的问题,这反而成了他的缺点,所以指针是把双刃剑,就看你怎么用了。第二,java没有指针就避免了如果忘了释放内存造成内存泄漏的问题,因为java有垃圾回收机制。
------解决方案--------------------
首先说明一下java中的变量分类:
java中的变量分为成员变量和局部变量。成员变量有分为实例变量(非static变量)和类变量(static变量);局部变量分为形参、方法内部的变量、代码块中的变量。
全局变量一般在接口中定义,如:

public static final int SIZE = 50

用一段代码来说明一下:
public class MyVariable{
public static void main(String[] args){
MyVariable mv = new MyVariable();
mv.show();
}
public void show(){
int b = 20;
System.out.println(b);
}
}

b在内存中的分布(如图):

mv是引用类型变量,存储在栈内存中,而对象本身(以及对象中的变量)被存放在堆内存中
这是个人理解,请指正。

------解决方案--------------------
引用:
首先说明一下java中的变量分类:
java中的变量分为成员变量和局部变量。成员变量有分为实例变量(非static变量)和类变量(static变量);局部变量分为形参、方法内部的变量、代码块中的变量。
全局变量一般在接口中定义,如:


Java code
?



12

public static final int SIZE = 50
用一段代码来说明一下:

……

这里的b是基本数据类型,放在栈中,不是堆
------解决方案--------------------
将.class反编译一下 你懂点汇编的话就会看到你想要的答案
------解决方案--------------------
这里的a,b都是基本数据类型,都放在栈区