您的位置:首页 > 移动开发 > 微信开发

JAVA对象及属性的内存堆栈管理(通过小程序简单说明)

2014-10-29 11:43 281 查看
JAVA在执行过程中会划分4个内存区域(heap、stack、data segment、code segment)

代码区(codesegment):java开始执行会把代码加载到code segment区域然后找到main方法开始执行

静态区(datasegment): 是存放静态变量字符串常量

堆区(heapsegment): 一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收

栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源

下面通过一个例子了解一下:

package com.chinasofti.mylove;

public class JVMSpace {

private int A = 0;
private static int B = 0;

public void example1() {
// 说明基本类型的数据及引用都是存放在栈内存中
int a = 0;
int b = 0;
System.out.println(a == b);// 如果栈内存中存在0,那么a和b同时指向这个数据
b = a;
a = a + 1;// a=1,栈中没有1,所以a指向1
System.out.println(b);// b的值没有变化还是0

}
public void example2() {
int a = 0;
JVMSpace jvm_A = new JVMSpace();
System.out.println(jvm_A.A == a);// 发现是相等的,证明虽然jvm_A.A存放在堆中,但是只存放了引用,实际指向还是在栈中
}
public static void main(String[] args) {
JVMSpace jvmSpace = new JVMSpace();
jvmSpace.example1();
jvmSpace.example2();
}

}
总结:

1.一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄一定是存放在栈中。

2.他们的引用可能存放在堆中,也可能存放在栈中,通过example1中可以看出局部变量创建的对象是在栈中,而new 的 对象中的属性例如jvm_A.A是存放在堆中,而指向栈中的数据。

3.静态变量例如static int B 是存放在静态区(datasegment)中,他不属于任何对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: