zoukankan      html  css  js  c++  java
  • 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)中,他不属于任何对象。

  • 相关阅读:
    A. Generous Kefa
    1031 骨牌覆盖
    1074 约瑟夫环 V2
    1073 约瑟夫环
    1562 玻璃切割
    Ants
    1024 矩阵中不重复的元素
    1014 X^2 Mod P
    1135 原根
    1010 只包含因子2 3 5的数
  • 原文地址:https://www.cnblogs.com/hainange/p/6153624.html
Copyright © 2011-2022 走看看