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

  • 相关阅读:
    平衡二叉树之RB树
    平衡二叉树之AVL树
    实现哈希表
    LeetCode Median of Two Sorted Arrays
    LeetCode Minimum Window Substring
    LeetCode Interleaving String
    LeetCode Regular Expression Matching
    PAT 1087 All Roads Lead to Rome
    PAT 1086 Tree Traversals Again
    LeetCode Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/hainange/p/6153624.html
Copyright © 2011-2022 走看看