java 内存分配机制

版权声明:欢迎访问ssm个人搭建博客 https://www.yanzhaochang.top 所有版权归静待花开所有 https://blog.csdn.net/qq_42081709/article/details/89598816

 前言:欢迎访问ssm搭建个人博客 ----> 闫兆昌的博客      

Java 内存分配主要包括以下几个区域:

        1  寄存器:JVM内部虚拟寄存器,存取速度非常快,我们在程序中无法控制。   

        2  栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中,存放局部变量的值

        3  堆:用来存放Java世界中几乎所有的对象实例(如new创建的对象和数组, 在堆中产生了一个对象或数组后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或是对象在堆内存中的首地址,栈中的这个变量就成了对象或数组的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的对象或数组,引用变量就相当于为对象或数组取的一个名称。引用变量是普通变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而对象或数组本身在堆中分配,即使程序运行到使用new产生对象或数组的语句所在的代码块之外,对象或数组本身所占据的内存不会被释放,对象和数组在没有引用变量指向它的时候才变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器(GC)收走。这也是Java比较占内存的原因。

            实际上,栈中的变量指向堆内存中变量就是Java中的指针。

            注意:创建出来的对象只包含属于各自的成员变量,不包括成员方法,因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是它们共享该类的方法,并不是每创建一个对象就把成员方法复制一次)。

        4  静态域:存放在对象中用static定义的静态成员,一直占用内存

        5  常量池:存放常量

    注:

        1 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

        2 对于字符串,其对象的引用都是存储在栈中的。

          如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,

          如果是运行期(new出来的)才能确定的就存储在堆中。

          对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。 

猜你喜欢

转载自blog.csdn.net/qq_42081709/article/details/89598816