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

news2024/11/24 4:44:33

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python scapy二层、三层发送接收数据包

环境: Linux环境:安装scapy, 执行scapy 安装scapy yum install python3-pip (安装python3 pip) pip3 install --upgrade pip yum remove python-pip(删除pip) pip3 install scapy (安装scapy) 简介: …

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月29日论文合集)

文章目录 一、检测相关(12篇)1.1 Linear Object Detection in Document Images using Multiple Object Tracking1.2 Hybrid Energy Based Model in the Feature Space for Out-of-Distribution Detection1.3 BEV-IO: Enhancing Birds-Eye-View 3D Detection with Instance Occu…

原来你是这样的5G 一文了解亚马逊云科技的云上5G专网

根据麦肯锡公司发布的《2021年离散制造业上云调查》报告显示:云转型所带来的IT价值仅占其潜在价值的5%,但其业务价值高达95%。随着云计算技术的快速发展以及云的IT价值在敏捷性、弹性和经济性几个方面的充分呈现加上同5G技术和应用…

8项seo的日常工作

SEO的日常工作涵盖了一系列任务和活动,旨在优化网站以提高在搜索引擎中的排名和可见性。 以下是SEO的日常工作内容: 关键词研究和优化:定期进行关键词研究,寻找与目标受众和业务相关的热门关键词。优化网站内容、标题、元描述和链…

《Cocos Creator游戏实战》签到日历实现思路

在线体验地址 Cocos Creator | SignCalendar Cocos Store 购买地址(如果没有显示,那就是还在审核): https://store.cocos.com/app/detail/4975微店购买地址: https://weidian.com/item.html?itemID6354270477 运行效…

【书评】《写作脑科学》杨滢(@屠龙的胭脂井)

《写作脑科学》是一本介绍写作与脑科学关系的书籍,作者是杨滢。 本书通过对脑科学的研究和分析,揭示了写作的本质和技巧,为写作者提供了有益的指导和启示。 本书的主要内容分为八个部分 第1章 为什么写作跟大脑有关第2章 快速写作&#xff…

Photoshop 2023 Beta 内置Ai绘图功能介绍安装教程

距离Adobe软件公司首次将图像编辑及数字绘画软件Photoshop推出到大众面前已经过去35年,最近该公司又再次书写了属于Photoshop的历史新篇章。 最近,Adobe 宣布 Photoshop(Beta)迎来更新,新增「创意填充(Gen…

3.3. 日期与时间类(Date、Calendar、LocalDate等)

在Java中,我们经常需要处理日期和时间。Java提供了一些类来帮助我们完成这些任务,如Date、Calendar、LocalDate、LocalTime、LocalDateTime和ZonedDateTime等。我们将分别介绍这些类,并给出相应的示例。 1. Date类 Date类是Java提供的一个表…

Redis的地理位置(GEO)+Hypterloglog+事务测试

GEOADD 命令 - 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中,这些数据将会存储到sorted set 有效的经度从-180度到180度。有效的纬度从-85.05112878度到85.05112878度。 当坐标位置超出上述指定范围时,该命令将会返…

chatgpt赋能python:Python中Numpy报错分析

Python中Numpy报错分析 Numpy是Python中重要的开源数值计算库,它提供了数组和矩阵的操作。在使用Numpy的过程中,有时候我们会遇到一些报错信息,本文将对常见的Numpy报错进行分析和解决方法的介绍。 NumPy报错信息 当我们在使用Numpy时出现…

融合PWA技术的小程序:为用户带来原生应用体验

PWA代表“渐进式网络应用”(Progressive Web Application)。它是一种结合了网页和移动应用程序功能的技术概念。PWA旨在提供类似于原生应用程序的用户体验,包括离线访问、推送通知、后台同步等功能,同时又具有网页的优势&#xff…

AIGC领域优秀的资源汇总(应用、论文、开源项目)

AIGC领域介绍,及一些比较优秀的应用,和论文,开源项目汇总。 AIGC大纲 一、AIGC概念 ​ AIGC,全名“AI generated content”,又称生成式AI,意为人工智能生成内容。例如AI文本续写,文字转图像的…

NRF52系列多个 base uuid 的问题,以client为例。

基础uuid知识 nordic的nrf sdk希望我们设置uuid的方式跟蓝牙技术联盟SIG的方式一样,也就是服务和特性的uuid是基于同一个base uuid修改产生的,比如base uuid是0x0000xxxx-0000-1000-8000-00805F9B34FB,那么服务和特性的128bit uuid就要基于此…

java8内部调用无法引用值的问题

问题:Variable used in lambda expression should be final or effectively final 具体原因: 这段代码试图将 20 赋给一个局部变量,它无法通过编译,但绝非编写错误。 这实际上是语言的设计者有意为之,用以鼓励用户使用…

优化版本 穿越火线(CF) FPS AI 自瞄 代码 权重 数据集(下面有链接)

更新初衷 本人在制作过程中,有一些爱钻研的朋友来问以及提出增加一些新的功能点回会更好,本着学习研究态度,在第一个版本上进行优化,增加一些内容 不喜欢看过程的小伙伴直接看最下面 界面 解决问题: 1、进入慢 2、无…

PyTorch-完整的模型训练套路

目录 1. 准备 1.1 使用Cifar10 1.2 item的用法 1.3 model的搭建 1.4 数据集、参数设置以及训练开始 1.5 测试集 1.6 使用tensorboard 1.7 保存每一轮的训练结果 2. 计算整体的正确率 3. 其他 3.1 train与eval 3.2 使用GPU训练 1. 准备 1.1 使用Cifar10 1.2 item的…

微信小程序授权登录

微信小程序—授权登录 一、小程序登录 登录流程时序 说明: 1.小程序端调用 wx.login() 获取临时登录凭证code ,并回传到开发者服务器。 2.服务器调用 code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 之后开发者服务器可以根…

2021年长三角高校数学建模竞赛A题Go!Fun游长三角解题全过程文档及程序

2021年长三角高校数学建模竞赛 A题 Go!Fun游长三角 原题再现: 又到一年毕业季,来自浙江杭州的一位大学生小李同学,家境良好,平时学习刻苦,在即将毕业之际,准备给自己安排一个毕业旅行,同时帮助…

Java 高级应用-多线程-实现 Runnable 接口与继承 Thread 类

1.1 程序、进程与线程 • 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段 静态的代码,静态对象。 • 进程(process):程序的一次执行过程,或是正…

转变范式:如何使用 5 种新模式重塑 2023 年的实体店体验

在电商盛行的当下,线上购物已成为新零售的重要组成部分,实体零售业正处于两难境地。一方面,实体零售是绝对有必要的:美国约 85% 的销售额来自实体商店。 另一方面,尽管增长放缓,但电商收入占销售总额的比例…