Java中会出现内存泄漏吗

news2024/12/31 1:05:08

这是一个老生常谈的面试题,本文就系统讲解一下吧

  虽然Java有GC垃圾⾃动回收功能,但并不是说Java程序就不会内存泄漏。如果一个对象没有地⽅会使⽤到,但是却仍然有引用指向他,那么垃圾回收器就无法回收他,这种情况就属于内存泄漏。这种泄漏可能属于短暂的(即程序运⾏一段时间后引用消除进⽽触发GC)也可能是程序级别的(即程序退出时才会回收)。Java的内存泄漏和C/C++的内存泄漏不一样,C/C++的内存泄漏可能是系统级别的,即使程序退出也无法被回收,只能重启系统。

  1. 垃圾回收机制
      在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据。如果只是不停的分配内存, 那么程序迟早⾯面临内存不足的问题。所以在任何语言中,都会有一个内存回收机制来释放过期对象的内存,以保证内存能够被重复利用。内存回收机制按照实现⻆色的不同可以分为两种,⼀种是程序员⼿动实现内存的释放(比如C语言)另⼀种则是语
    言内建的内存回收机制,比如本文将要介绍的java垃圾回收机制。

  2. Java的垃圾回收机制
      在程序的运行时环境中,java虚拟机提供了了⼀个系统级的垃圾回收线程(GC,Carbage Collection),它负责回收失去引⽤的对象占⽤用的内存。理解GC的前提是理解⼀些和垃圾回收相关的概念,下⽂⼀一介绍这些概念。

Java对象的实例例存储在jvm的堆区,对于GC线程来说,这些对象有三种状态。

  1. 可触及状态:程序中还有变量量引⽤,那么此对象为可触及状态。
  2. 可复活状态:当程序中已经没有变量引用这个对象,那么此对象由可触及状态转为可复活状态。CG线程 将在一定的时间准备调⽤此对象的finalize()方法,finalize()方法内的代码有可能将对象转为可触及状态,否则对象转化为不可触及状态。
  3. 不可触及状态:只有当对象处于不可触及状态时,GC线程才能回收此对象的内存。
    在这里插入图片描述

GC为了了能够正确释放对象,必须监控每一个对象的运行状态,包括对象的申请、引⽤、被引⽤、赋值等, GC都需要进行监控,所以无论一个对象处于上文中的任何状态GC都会知道。

内存泄露

  内存泄漏指由于错误的设计造成程序未能释放已经不再使⽤用的内存,造成资源浪费。GC会⾃自动清理理失去引用的对象所占用的内存。但是,由于程序设计错误而导致某些对象始终被引⽤,那么将会出现内存泄漏漏。

说到内存泄露,就不得不提到内存溢出,这两个比较容易混淆的概念,我们来分析⼀下。

  1. 内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未释放。结果导致一直占据该内存单元,我们和程序都⽆法再使⽤该内存单元,直到程序结束,这是内存泄露。

  2. 内存溢出:程序向系统申请的内存空间超出了系统能给的。⽐如内存只能分配⼀个int类型,我却要塞给他⼀个long类型,系统就出现oom。⼜比如一车最多能坐5个人,你却⾮要塞下10个,⻋就挤爆了。⼤量的内存泄露会导致内存溢出(oom)。

分析内存泄漏

在这里插入图片描述
分析:

  • A对象引用B对象,A对象的⽣命周期(t1-t4)比B对象的生命周期(t2-t3)⻓的多。当B对象没有被应⽤程序使用之后,A对象仍然在引用着B对象。这样,垃圾回收器就没办法将B对象从内存中移除,从⽽导致内存问题,因为如果A引用更多这样的对象,那将有更多的未被引用对象存在,并消耗内存空间。
  • B对象也可能会持有许多其他的对象,那这些对象同样也不会被垃圾回收器回收。所有这些没在使用的对象将持续的消耗之前分配的内存空间。
  • 如果⻓生命周期的对象持有短⽣命周期的引用,就很可能会出现内存泄露

Java常见的内存泄漏

  1. 数组使用的时候内存泄漏。
  2. 数据库连接,网络连接,IO连接等没有显示调⽤close关闭,会导致内存泄露
  3. 监听器的使⽤,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露

比如下面的例子。使⽤数组实现了了一个栈,有⼊栈和出栈两个操作:

public class MyStack {
	private Object[] elements;
	private int Increment = 10;
	private int size = 0; 
	
	public MyStack(int size) {
		elements = new Object[size]; 
	}

	//入栈
	public void push(Object o) {
 		capacity();
		elements[size++] = o;
	}

	//出栈
	public Object pop() {
    	if (size == 0) {
    		throw new EmptyStackException();
    	}
    	return elements[--size];
   	}
	
	//增加栈的容量量
 	private void capacity() {
		if (elements.length != size) {
			return;
		}
			
		Object[] newArray = new Object[elements.length + Increment];
		System.arraycopy(elements, 0, newArray, 0, size);
	}

 	public static void main(String[] args) {
		MyStack stack = new MyStack(100);
		for (int i = 0; i < 100; i++)
			stack.push(new Integer(i));
		}
		for (int i = 0; i < 100; i++) {
			System.out.println(stack.pop().toString());
		}
	}
}

这个程序是可⽤的,⽀持常用的⼊栈和出栈操作。但是,有一个问题没有处理好,就是当出栈操作的时候, 并没有释放数组中出栈元素的引用,这导致程序将一直保持对这个Object的引⽤(此object由数组引用),GC永远认为此对象是可触及的,也就更加谈不上释放其内存了。这就是内存泄漏的⼀个典型案例。

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

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

相关文章

重复性管理--抽象的重要性(下)

接着 上一篇的谈论, 继续谈论抽象在重复性管理中的重要作用. 好的抽象与糟糕的抽象? 通过前面的一些例子, 你可能形成了一个印象: 所谓抽象很多时候就是把一些代码封装到一个方法中. 不过事实上并不是这么简单的. 抽象的结果确实很多时候产生了一个方法, 但不是说我把一堆代…

05 网络和防火墙等其他

网络和其他 ifconfig : 主机ip地址查询

从过去到未来:回顾DDR技术的演进和未来趋势

DDR技术作为内存的核心&#xff0c;其性能的飞速发展直接推动着计算机的计算能力。 本文将简明扼要地介绍DDR技术的发展历程。 一、SDR时代 20世纪90年代&#xff0c;Intel公司推出了首款同步动态随机存储器SDR SDRAM。其采用时钟同步接口&#xff0c;时钟频率典型为66MHz或8…

【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】&#x1f30f;题目描述&#x1f319;问题…

MySQL数据库基本操作1

文章目录 主要内容一.DDL1.创建表代码如下&#xff08;示例&#xff09;: 2.创建表的类型3.其他操作4.修改表结构格式代码如下&#xff08;示例&#xff09;: 二.DML1.数据插入代码如下&#xff08;示例&#xff09;: 2.数据修改代码如下&#xff08;示例&#xff09;: 3.数据删…

力扣第406题 根据身高重建队列 c++ 贪心思维

题目 406. 根据身高重建队列 中等 相关标签 贪心 树状数组 线段树 数组 排序 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &am…

Qt在Android上设置连接到指定的WIFI

在Android上使用Qt设置连接到指定的Wi-Fi网络需要使用Java代码来完成,涉及到Android平台特定的API和权限。接下来下面将会演示如何在Qt中调用Java代码来实现这一功能。 【1】在Qt项目中创建一个名为"AndroidWifiConnector"的Java类。 (新建文件,选择JAVA类型,名字…

解决 viteprees 中 vp-doc 内置样式影响组件预

解决 viteprees 中 vp-doc 样式影响组件预览 问题 当使用"vitepress": "1.0.0-rc.22"作为组件库文档时&#xff0c;会自动引入vitepress的默认主题&#xff0c; 其中vp-doc中有大量的html标签样式 ... .vp-doc table {display: block;border-collapse: …

前端开发技术栈(工具篇):2023深入了解webpack的安装和使用以及核心概念和启动流程(详细) 63.3k stars

目录 Webpack简介 Entry Module Chunk Loader Plugin Output Webpack的启动流程 Webpack的优缺点 Webpack的使用 1. 安装Webpack 2. 创建Webpack配置文件 3. 编写代码 4. 运行Webpack 5. 在HTML中引入打包后的文件 6. 执行编译命令 Webpack其他功能介绍 1. 使…

map与set

目录 set的key搜索树模拟 set内置的find与count函数 ​编辑 set的lower_bound与upper_bound内置函数、 map的key-value搜索树模拟 通过不同的方式向map中插入键值对。 map的遍历 ​编辑 map的operator的 [ ] 用法 关于map与set用法的几个例题 例题1&#xff1a; 随机…

V3Det大规模词汇视觉检测数据集与LaRS海上全景障碍物检测数据集

V3Det与LaRS是ICCV2023上发表的数据集工作&#xff0c;规模都比较大&#xff0c;后续有可能会用到&#xff0c;因此记录下来。 V3Det: Vast Vocabulary Visual Detection Dataset Paper: https://arxiv.org/abs/2304.03752 URL: https://v3det.openxlab.org.cn/ 在现实世界中…

Bootstrap中CSS媒体查询分辨率 @media(min-width)例子

Bootstrap中CSS媒体查询分辨率 media&#xff08;min-width&#xff09;例子 css media min-width max-width 解释&#xff1a; min-width 表示最小即大于等于max-width 表示最大即小于等于 media screen and (min-width : 320px) {html {font-size : 10px !important;} } medi…

geoserve 发布 Styles 样式时,设置边框、填充以及填充透明度

文章目录 需求分析需求 设置 geoserve 发布的 Styles 样式中的边框、填充以及填充透明度 分析 具体详细使用可参考这篇文文章:在 GeoServer 上发布 Shapefile 文件作为 WMS 数据 <?xml version="1.0" encoding=

Git Gui使用技巧

资料 https://www.runoob.com/w3cnote/git-gui-window.html 操作过程 创建仓库→添加远程仓库→扫描目录→文件移动→提交→上传 注意填注释 文件忽略 创建文件.gitignore→编写内容 *.log #文件 config.ini #文件 temp/ #目录

App分发的策略和注意事项2

当今的数字化时代中&#xff0c;移动应用程序已经成为了人们生活中不可或缺的一部分。随着智能手机的普及和移动互联网的快速发展&#xff0c;应用程序的分发方式也变得越来越多样化。 App分发是指将移动应用程序通过特定的渠道传递给终端用户的过程。在应用程序开发完成后&am…

MySQL 多表查询 事务 索引

目录 多表查询简介内连接查询 join on外连接查询 left join、right join子连接查询标量子查询列子查询 (in、not in)行子查询表子查询 多表查询案例 事务事务介绍操作 start transaction、commit、rollback事务四大特性(面试题) 索引索引介绍索引原理索引语法 index 上次学习了…

一款适用于勒索病毒应急演练加解密工具

decryption-encryption 介绍 #encryption.exe为加密脚本 #decryption.exe为解密脚本 1、运行加密脚本&#xff0c;点击运行程序输入密码&#xff1a;TaSt12.2 输入需要加密的文件路径或文件夹路径&#xff0c;确定后即可对路径下面的所有格式文件进行加密&#xff1b; 2、…

安卓核心板_天玑700、天玑720、天玑900_5G模块规格参数

5G安卓核心板是采用新一代蜂窝移动通信技术的重要设备。它支持万物互联、生活云端化和智能交互的特性。5G技术使得各类智能硬件始终处于联网状态&#xff0c;而物联网则成为5G发展的主要动力。物联网通过传感器、无线网络和射频识别等技术&#xff0c;实现了物体之间的互联。而…

淘宝API接口获取商品信息,订单管理,库存管理,数据分析

在淘宝开放平台中&#xff0c;每个API接口都有相应的文档说明和授权机制&#xff0c;以确保数据的安全性和可靠性。开发者可以根据自己的需求选择相应的API接口&#xff0c;并根据文档说明进行调用和使用。 淘宝开放平台API接口是一套REST方式的开放应用程序编程接口&…

Java注解及自定义注解

注解/元数据&#xff08;Annotation&#xff09;&#xff0c;是对代码级别的说明&#xff1b;在JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说明、注…