Java 变量存储的位置(局部变量、成员变量)

Java把内存划分为以下bai4个部分:
1、栈区(stacksegment)—由编译器自动du分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源。
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收。
3、静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放。
4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。

  • 对于局部变量,如果是基本类型,会把值直接存储在栈;如果是引用类型,比如String ss = new String(“william”);会把其对象存储在堆,而把这个对象的引用(指针)ss存储在栈。由于指针是私有的,栈销毁后,在内存的中对象没有其他的引用,就会被收回,因此局部变量的生命周期比较短,就是栈的生命周期

    再如
    String s1 = new String(“william”);
    String s2 = s1;
    s1和s2同为这个字符串对象的实例,但是对象只有一个,存储在堆,而这两个引用存储在栈中。

    也就是说某个方法,类似一个模板,在被执行时,每个线程会复制这个模板,局部变量此时才会被创建,并放入栈中,栈是线程私有的,因此局部变量是就是线程私有的,各个线程是彼此不见的

  • 类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的实例对象中),基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。

    假设类A 内有个成员变量 b ,那么A的实例a1,a2 在堆内存中,且各自都有一个变量b。当载体A的实例a1,a2被创建时,b也会创建了。 并且是跨线程可见的。 成员变量的生命周期比较长,和载体一致,载体被回收了,这个成员变量才会被销毁!进而这个成员变量的引用对象才会被销毁

  • 而类的方法却是
    该类的所有实例对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。

参考

原文链接:https://blog.csdn.net/feiqipengcheng/article/details/108518558
原文链接:https://blog.csdn.net/aop_ioc/article/details/108472004

你可能感兴趣的:(jvm,jdk,java,jvm,局部变量,成员变量)