首页 > 系统相关 >2.6. Java内存管理与垃圾回收

2.6. Java内存管理与垃圾回收

时间:2023-05-30 14:04:01浏览次数:46  
标签:Java 对象 回收 垃圾 Student 2.6 内存

2.6.1. Java内存模型

在Java中,内存被划分为以下几个区域:

  1. 堆(Heap):存储对象实例和数组,是垃圾回收的主要区域。
  2. 栈(Stack):存储局部变量和方法调用。每个线程有自己的栈。
  3. 方法区(Method Area):存储类信息,如类的结构、方法、字段等。
  4. 本地方法栈(Native Method Stack):存储本地方法(如JNI)的调用。
  5. 程序计数器(Program Counter Register):指示当前线程执行的字节码指令。

2.6.2. Java对象的生命周期

Java对象的生命周期分为以下几个阶段:

  1. 创建:使用new关键字创建对象实例。
  2. 使用:对象被程序引用和使用。
  3. 不可达:对象没有任何引用指向它,无法被程序访问。
  4. 垃圾回收:垃圾回收器回收不可达对象所占用的内存。
  5. 内存释放:内存被释放并归还给系统。

2.6.3. 垃圾回收

Java的垃圾回收器自动回收不再使用的对象。垃圾回收的目的是释放无用对象占用的内存,避免内存泄漏。垃圾回收过程主要发生在堆内存区域。

垃圾回收器的工作原理:

  1. 标记:垃圾回收器会找出所有不可达的对象,并将它们标记为垃圾。
  2. 清除:垃圾回收器会回收被标记的对象所占用的内存。

Java中常用的垃圾回收算法:

  1. 引用计数法:每个对象维护一个引用计数,当引用计数为0时,对象被视为垃圾。但这种方法无法解决循环引用问题。
  2. 标记-清除(Mark-Sweep):分为标记和清除两个阶段,标记阶段标记所有不可达对象,清除阶段回收它们的内存。但可能产生内存碎片。
  3. 标记-整理(Mark-Compact):在标记-清除基础上,将存活对象整理到内存的一端,回收边界以外的内存。解决了内存碎片问题。
  4. 分代收集(Generational Collection):将堆内存划分为新生代和老年代,针对不同代采用不同的垃圾回收策略。新生代使用复制算法(Copying),老年代使用标记-清除或标记-整理算法。

2.6.4. 内存泄漏与内存溢出

  1. 内存泄漏:程序中某个对象不再使用,但仍然被引用,导致无法被垃圾回收器回收。内存泄漏可能导致内存溢出。
  2. 内存溢出:程序请求的内存超过了系统可分配的最大内存,导致程序崩溃。

避免内存泄漏的方法:

  1. 及时释放不再使用的对象引用。
  2. 避免静态集合类引用长期占用内存的对象。
  3. 使用WeakReference、SoftReference等弱引用类型。

2.6.5. 示例

下面的示例展示了一个简单的类及其实例化过程,以及垃圾回收的触发。

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        Student student1 = new Student("Alice", 20); // 创建一个Student实例
        Student student2 = new Student("Bob", 22); // 创建另一个Student实例

        student1 = student2; // student1引用指向student2,此时原先的"student1"实例无法访问,成为垃圾

        System.gc(); // 建议JVM进行垃圾回收(注意:这并不保证立即进行垃圾回收)
    }
}

在这个示例中,我们创建了两个Student实例。当student1引用指向student2时,原来的student1实例变得不可达,成为垃圾。我们使用System.gc()建议JVM进行垃圾回收。需要注意的是,System.gc()并不保证立即进行垃圾回收,具体的回收时机取决于JVM的实现。

这一节我们详细讲解了Java内存管理与垃圾回收的相关知识,包括内存模型、对象的生命周期、垃圾回收原理及算法、内存泄漏与内存溢出等内容。我们还通过一个简单的示例展示了垃圾回收的触发。希望这些内容对你有所帮助,如果你还有其他问题,请随时提问。

file

file

参考文章:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

标签:Java,对象,回收,垃圾,Student,2.6,内存
From: https://blog.51cto.com/u_14241752/6378456

相关文章

  • 3.4. Java集合框架(List、Set、Map等)
    Java集合框架是Java提供的一套用于存储和操作数据的接口和类。它包括以下几个主要部分:接口:集合框架定义了一系列接口,如Collection、List、Set、Map等。实现类:集合框架提供了一些实现这些接口的类,如ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等。......
  • Java第五日
    1.多重循环1.代码  2.实战99乘法表 2.break1.语法结构 2.实战 3.continue语法1.语法结构2.实战  4.数组 1.数组定义数组是一个变量,存储相同数据类型的一组数据声明一个变量就是在内存空间划出一块合适的空间声明一个数组就是在内存空间划出一串......
  • yolov5内存分布分析
    yolov5内存分布分析Transpose输出分析假设batch_size为1,yolov5有三个输出,shape分别是:(1,3,80,80,85)(1,3,40,40,85)(1,3,20,20,85)其中3代表anchor数量,20*20代表feature_map大小,85代表boundbox的(x,y,w,h,c+80个类别的概率)其中(x,y,w,h,c+80个类别的概率)在内存中是连续分......
  • Java第六日
    今日继续数组的学习 1.Arrays工具类的使用2.数据应用3.二维数组 1.Arrays工具类的使用Arrays的描述java.util.ArraysSort()升序查询实战录入五位同学的成绩,并进行升序排序然后输出结果 2.数据的应用1.求最大值已知数组存储5位学员成绩,求最大值给max先赋一个......
  • 智能社原生的力量——原生JavaScript开发高级
    智能社原生的力量——原生JavaScript开发高级download:3w51xuebccomSpringBoot3:打造高效的Java应用程序SpringBoot是一个由Pivotal团队开发的开源框架,它基于Spring框架,旨在使Spring应用程序的开发变得更加容易和快速。最新的SpringBoot版本是3.0.0,它带来了许多新特性和功能,让我......
  • Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包
    Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包 原创软件测试日常记录2023-01-1907:19:29博主文章分类:ubuntu©著作权文章标签ubuntujarlinuxJAVAjava文章分类运维阅读数122 经常需要在Linux服务器上设置开机启动jar包,首先编写一个启动jar包的脚本,这里以/......
  • java 网络通讯:tcp,upd,http
    java网络通讯:tcp,upd,http1.TCP通信服务端用的代表类:ServerSocket类,注册端口。调用accept()方法阻塞等待接收客户端连接。得到Socket对象。TCP通信的基本原理?客户端怎么发,服务端就应该怎么收。客户端如果没有消息,服务端会进入阻塞等待。Socket一方关闭或者出现异常、对方......
  • Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载
    有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦。这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了。下面是一个名为CompressUtil的工具类的代码,它提供了一些方法来处理文件压缩和下载操作:importor......
  • 检测CPU,内存,磁盘使用率shell
    检测CPU,内存,磁盘使用率shell 1.检测CPU,内存,磁盘使用率超过80%,则发送邮件告警#!/bin/bash#当前主机ipHOST=$(ipashoweth0|grep'\inet\b'|awk'{print$2}'|sed's/\/.*//')#告警邮箱[email protected]#磁盘使用百分比阈值DISK_USAGE_THRESHOLD=80#CPU......
  • 新版本Edge浏览器如何查看每一个网页的内存占用和cpu使用情况
       ......