Java入门第55课——对象内存管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/houjunkang363/article/details/90544192

1.1 对象内存管理

1.1.1 对象内存管理

    · 编译好的Java程序需要运行在JVM中

    · 程序,无论代码还是数据,都需要存储在内存中。JVM为Java程序提供并管理所需要的内存空间。

    · JVM内存分为"堆"、"栈"和"方法区"三个区域,分别用于存储不同的数据。

        image.png

1.2 堆内存

1.2.1 对象存储在堆中

    · JVM在其内存空间开辟一个称为"堆"的存储空间;

    · 这部分空间用于存储使用new关键字所创建的对象。

    image.png

1.2.2 成员变量的生命周期

    · 访问对象需要依靠引用变量。

    · 当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围。该对象的所有成员变量也随之被回收。

    · 成员变量的生命周期为:从对象在堆中创建开始到对象从堆中被回收结束。

    image.png

1.2.3 垃圾回收机制

    · 垃圾回收器(GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象。

    · Java程序员不用担心内存管理,因为垃圾收集器会自动进行回收管理。

1.2.4 Java程序的内存泄漏问题

    · 内存泄漏是指,不再使用的内存没有被及时的回收。严重的内存泄漏会因过多的内存占用而导致程序的崩溃。

    · GC线程判断对象是否可以回收的依据是该对象是否有引用对象,因此,当确定该对象不再使用时,应该及时将其引用设置为null。

1.2.5 System.gc()方法

    · GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象,就立刻回收。

    · 一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法。

    · System.gc()用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统。

1.3 非堆——栈

1.3.1 栈用于存放方法中的局部变量

    · JVM在其内存空间开辟一个称为"栈"的存储空间;

    · 这部分空间用于存储程序运行时在方法中声明的所有局部变量。例如:main()方法中有如下代码:

    image.png

1.3.2 局部变量的生命周期

    · 一个运行的Java程序从开始到结束会有多次方法的调用。JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。

    · 一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。当某一个方法调用完成后,其对应的栈帧将被清除,局部变量失效。

1.3.3 成员变量和局部变量

    · 成员变量和局部变量的差别如下:

    · 局部变量:

        定义在方法中;

        没有默认值,必须自行设定初始值;

        方法被调用时,存在栈中,方法调用结束,从栈中清除;

    · 成员变量:

        - 定义在类中,方法外;

        - 有默认初始值,可以不显式初始化;

        所有类被实例化后,存在堆中,对象被回收时,成员变量失效;

1.4 非堆——方法区   

1.4.1 方法区用于存放类的信息

    · 方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。

    image.png

1.4.2 方法只有一份

    · 当类的信息被加载到方法区时,除了类的类型信息以外,同时类内的方法定义也被加载到方法区;

    · 类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中的一份方法定义的。

    image.png

博主点评:

    Java的内存管理机制非常重要,读者需了解各个内存区域的不同之处。内存泄漏问题也是面试过程中常考的知识点,在写代码的过程中也要考虑如何避免内存泄漏。

扫码关注我吧:

猜你喜欢

转载自blog.csdn.net/houjunkang363/article/details/90544192