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

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)中,他不属于任何对象。

原文地址:https://www.cnblogs.com/hainange/p/6153624.html