java面试:内存泄漏相关知识

面试题之内存泄漏相关 前天刚经历了一场面试,还好这次备足了功课,一面完了直接二面,接着又复试,顺利拿到了offer哈哈,还是很开心的。(好了,装逼到此结束)。虽然自己在一面时候会的东西都发挥的很好,但是有好几个知识点还是被面试官问的一脸懵逼,只能舔的脸说:“不好意思,这个不太了解。。”。这几天针对这次的面试遗留的问题,要开始逐个击破了,其中有一个点就是内存泄漏。相信学过c的大家都知道内存泄漏的大概概念,但是如果真的说个... 阅读详情

百度百科(https://baike.baidu.com/item/内存泄漏/6181425?fr=aladdin):内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

一般来说,内存泄漏存在两种情况:

       一:如在C/C++语言中的,在堆中分配的内存,在还没有将其释放掉的时候,就把所有能访问这块内存的方式都删掉(如指针重新赋值);

       二:则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。

       java通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存。理论上java中所有不被利用的对象所占有的内存,它们都会被GC回收,但事实java也存在内存泄漏,但它的表现与c++不同。

       第一种情况,在Java种有垃圾回收机制(GC)的引入,已经得到了很好的解决。所以,Java中的内存泄漏主要指的是第二种情况,而C++则包含以上两种情况。

        在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。我们有时也将其称为“对象游离”。

        内存泄漏是造成应用程序OOM(OutOfMemory)的主要原因之一。我们知道Android系统为每个应用程序分配的内存是有限的,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过系统分配的内存限额,这就造成了内存溢出从而导致应用Crash。

       长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收。

常见的内存泄漏及解决方法:

1、不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露,

2、各种连接 ,比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。数据库连接中对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而Connection一旦回收,Resultset 和Statement 对象就会立即为NULL。如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏。这种情况下一般都会在try里面去的连接,在finally里面释放连接。

3、内部类和外部模块等的引用,内部类(匿名内部类、非静态内部类)的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。外部模块,比如在A模块调用了B模块的一个方法public void login(Object b){},传入了一个对象,很可能模块A就保持了对该对象的引用,这时候就需要注意模块A 是否提供相应的操作去除引用。

4、监听器 在java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener()等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。

5、静态集合类 静态变量生命周期与应用生命周期一样,他们集合中所引用的对象也一直不能被释放。必须将静态集合对象内容清空,才能释放所引用的对象。

6、当集合里面的对象属性被修改后,该对象的hashcode值发生改变,再调用remove()方法时不起作用。

《Offer来了:Java面试核心知识点精讲》大纲 阅读详情

相关推荐

2024年 java基础相关面试和基础 持续更新

持续更新

qq_41486847的博客 1122

Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题

本文通过三道面试题,深入探讨了Java设计模式、内存优化和并发处理的关键知识点。这些知识点不仅对于面试至关重要,也是日常开发中不可或缺的技能。希望读者能够通过本文的学习,不仅在面试中表现出色,更能在实际工作中运用这些知识,构建出更加稳定和高效的Java应用程序。

杰哥在此的专栏 775

Java面试必备知识点大全

本文还有配套的精品资源,点击获取 简介:Java面试题是程序员求职中的重要环节,旨在评估应聘者在基础知识、编程能力、并发处理等多方面技能。本文列举了Java面试中常见的核心知识点,包括Java基础、数据类型与集合框架、多线程编程、IO流与NIO、反射机制、设计模式、JVM原理、并发工具类、Spring框架以及数据库连接等方面。求职者应深入理解每个知识点,并结合实战经验,以展...

weixin_42599908的博客 1927

JAVA面试题分享六十:什么是内存溢出,什么是内存泄漏?

内存泄露最终会导致内存溢出,由于系统中的内存是有限的,如果过度占用资源而不及时释放,最后会导致内存不足,从而无法给所需要存储的数据提供足够的内存,从而导致内存溢出。导致内存溢出也可能是由于在给数据分配大小时没有根据实际要求分配,最后导致分配的内存无法满足数据的需求,从而导致内存溢出。内存泄露是由于GC无法及时或者无法识别可以回收的数据进行及时的回收,导致内存的浪费;内存溢出是由于数据所需要的内存无法得到满足,导致数据无法正常存储到内存中。内存泄露的多次表现就是会导致内存溢出。

之乎者也·的博客 1468

4G LTE 与 5G 无线网络规划对比:从 BBU/RRU 到 CU/DU/AAU 的架构演进解析

本文深度解析4G LTE与5G无线网络架构的演进差异,从BBU/RRU分立式架构到CU/DU/AAU三级重构,揭示移动通信代际跃迁的技术本质。重点对比了网络规划中的覆盖能力、容量规划、传输网络等九大维度,为通信工程师提供实用的技术对照手册,助力5G网络高效部署。

weixin_32821533的博客 289

YOLOV8多模态(可见光+红外光目标检测任务,基于Ultralytics官方代码实现)

torch 2.3.1 torchvision 0.18.1 Python 3.8.19 tensorrt 8.5.3.1DroneVehicle数据集下载地址DroneVehicle 数据集由无人机采集的 56,878 张图像组成,其中一半是 RGB 图像,其余是红外图像。我们为这 5 个类别制作了丰富的注释,其中包含定向边界框。其中,汽车在 RGB 图像中有 389,779 个注释,在

Mjy的博客 7585

内存泄露的最直接表现

内存泄露的最直接表现

C_x_330的博客 1975

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7488

内存泄漏的8种情况(附代码示例)

一. 内存泄漏(memroy leak) 严格来说,只有对象不会再被程序用到了,但是GC又不能回收它们的情况,才叫内存泄漏 宽泛的讲,实际情况中很多时候一些不太好的实践会导致对象的生命周期变得很长甚至导致OOM,也叫“内存泄漏” 申请了内存用完了不释放,如申请了1024M内存,分配了512M内存一直不回收,那么可用内存就只有512M,仿佛泄漏掉一部分。 二. 内存溢出(out of memory) 申请内存时,没用足够的内存可以使用。 三. 两者的关系 内存泄漏的增多,最终会导致内存溢出。 .

枫陵的博客 2万+

块坐标下降法实战:如何用Python一步步优化无人机通信网络?

本文通过Python实战案例,详细介绍了块坐标下降法在优化无人机通信网络中的应用。文章以最大化网络吞吐量为目标,将复杂的非凸问题拆解为功率分配和轨迹规划两个子问题,并提供了完整的算法实现、代码示例及调参指南,为机器学习工程师解决类似优化问题提供了实用参考。

sat99的博客 975

从符号到基元:Token的技术演化史与“词元”汉化的术语学

中文摘要:Token概念演化与"词元"译名的确立 本文系统梳理了"Token"概念从信息论符号到AI基元的完整演化史,揭示了"词元"这一中文译名确立的必然性。概念发展经历了三个阶段:早期作为编译原理中的词法单元(1960s),统计NLP时期作为概率空间的原子(1990s-2000s),以及神经时代成为动态语义载体(2010s后)。随着Transformer架构兴起,Token从静态符号转变为上下文相关的语义基元,其定义彻底突破"词&quo

AllenLV的博客 1223

【牛客刷题YYDS】Java基础----Day06

目录一.Java创建对象的说法正确的有(A.B.C.D)题目解析:二.java中,用(A )关键字定义常量?题目解析:三.java程序内存泄露的最直接表现是(C )题目解析: A.用new语句创建对象,是最常见的创建对象的方法。 B.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。 C.调用对象的clone()方法。 D.运用反序列化手段,调用java.io.ObjectInputStream对

qq_70386167的博客 664

Agent应用实践之三 - 基础:AgentScope-ReActAgent源码解析

本章通过总结AgentScope的核心类,再通过分析ReActAgent调用大模型的底层源码原理。使我们基本了解了Agent的基本原理,这个实现方式与OpenClaw使用pi-mono的Agent基础框架是一致的。了解完ReActAgent的基本原理,下一章我们会将一下SpringBoot集成方式的代码原理,这两章是我们构建后续内容的基本框架。

代码让AI扣 471

Java核心基础:春招面试必备知识

在Java的庞大知识体系中,核心基础是根基所在,也是春招面试中必被考察的重点。无论是初涉Java开发的应届生,还是寻求技术提升的开发者,牢固掌握这些知识,是迈向成功面试的第一步。

翻晒时光的博客 1028

星敏感器:卫星姿态测量的“星空导航仪”

在卫星、航天器和深空探测器的姿态控制系统中,星敏感器(Star Tracker) 是最精确的姿态测量设备之一。它通过识别恒星的位置,计算出航天器在惯性空间中的三轴姿态,精度可达 角秒级(arcsecond),是许多高精度任务(如遥感、天文观测、深空探测)的核心传感器。

ScilogyHunter的博客 3704

K8S搭建(centos)完整版

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 4150

Java应届生面试必备考题(附答案)

今年收到疫情的影响,导致很多的应届生都还没有找到工作的,那么对于Java应届生来说,又有那些是必须要要会的呢,那些又是必考的呢,今天带着大家一起来看一下!!

yueyunyin的博客 9684

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Java面试题】如果发生内存泄漏怎么排查

下次面试的时候遇到这个问题,大家知道怎么回答了吗?!!另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新200期,总计超过20W字!【想领取面试文档的小伙伴可以点击文章底部名片无套路免费赠送给大家!需要高手面试文档面试文档的小伙伴可以扫描下方二维码。

跟着Mic学架构 331

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java最全ClassLoader和内存泄漏:一个Java爱情故事,java基础知识面试题

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。道路是曲折的,前途是光明的!本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

2301_82231215的博客 733

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最新Java内存泄漏和垃圾收集器是什么样的关系呢,终获offer

性能也受到垃圾收集器的负面影响,因为越来越满的“终身生成”意味着GC必须经历更多的对象,“标记”阶段需要越来越多的时间,随着大量堆,要分析的对象的数量变得更大。因此,在内存泄漏搜索中,非常大的控制树是非常好的候选。在这种情况下,要么选择的堆太小,必须将其放大,要么必须减少应用程序的内存消耗,例如选择较小的缓存大小。然而,临时存储的高消耗也特别重要,因为它会导致某些并行访问应用程序中发生OutOfMemoryError,因此这些应用程序是不确定的,因此会造成更大的不适,因为你不能在晚上重新开始。

2301_76348344的博客 789

Java基础知识点面试手册

前言 本文快速回顾了Java中最基础的知识点,用作面试复习,事半功倍。 说明 整合以下文章,并进行补充: 微信文章:精华:Java 开发岗面试知识点解析 http://how2j.cn/k/j2se-interview/j2se-interview-java/624.html https://github.com/CyC2018/CS-Notes/blob/master/docs/no...

蛮三刀酱 5285

10年Java面试总结:Java程序员面试必备的面试技巧

作为一名Java程序员,面试是你职业生涯中不可或缺的一部分。一个成功的面试不仅能展现你的技术能力,更能展示你的思维过程、问题解决能力和与人合作的态度。通过这些18个技巧的运用,你可以在面试中更好地展示自己,从而获得心仪的工作机会。记住,持续学习和不断实践是提升自己的关键。祝你面试成功!本文已收录于,我的技术网站ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享。

架构师专栏 2402

Java面试知识点解析——JVM篇

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_83412285的博客 566

JAVA面试场景题

1、Java堆内存溢出怎么解决 堆内存溢出一般是年老代溢出。当程序不断地创建大量对象实例并且没有被GC回收时,就容易产生内存溢出。 堆内存溢出很可能伴随内存泄漏,应首先排查可能泄露的对象,再通过工具检查GC roots引用链,从而发现泄露对象是由于何种引用关系使得GC无法回收他们;若不存在内存泄漏,换句话说就是内存中的对象还都需要继续存活,则可通过修改虚拟机的堆参数将堆内存增大。 2、java内存泄露的排查思路 1、内存溢出:你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢

weixin_49381372的博客 3986

Java最全实战 - 分析java项目线上内存泄漏、内存溢出、频繁GC的原因,java面试突击第三季资料

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer覆盖了info.m();});i < 100;i++) {启动启动时加入参数;也就是内存溢出;运行监控运行一段时间后,可以看到一直不停地full GC,并且有些线程的内存已经溢出报出OOM错误;解决方案:使用arthas在用arthas 的dashboard命令看一下内存使用情况,这一看,我的天,老年代的内存已经使用了98.64%,并且已经进行了3914。

2401_84692382的博客 623

Java Executors框架:面试必看的核心知识点

《Java Executors框架:面试必看的核心知识点》这篇文章详细解析了Java Executors框架的核心概念与实践应用。从ThreadPoolExecutor的工作原理到线程池的创建、任务提交与关闭方法,再到核心参数配置及拒绝策略的选择,逐一拆解。通过实际案例分析,帮助读者掌握如何高效配置和优化线程池,提升代码性能。本文适合广大Java开发人员...

yanpeng2580的博客 737
上一篇: mysql报错You have an error in your SQL syntax;
下一篇: java线程实现同步的方式
A__cup__of__Java
博客等级 码龄9年 19粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值