Java内存泄漏和垃圾收集器是什么样的关系呢,2024年最新阿里巴巴面试问题有哪些

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

基本上,您可以在堆中看到与 Java OutOfMemoryError 问题相关的三个不同问题区域:

  • 仍然具有GC根引用但从未在应用程序代码中使用的对象。这是 Java内存泄漏

  • 对象太多或太大。意味着没有足够的堆可用于执行应用程序,因为内存中保存了太大的对象树(例如缓存)。

  • 临时对象太多。意味着Java代码中的处理暂时需要太多内存。

Java内存泄漏

============================================================================

当对象仍然具有GC根引用,但在应用程序中不再使用时,就会产生Java内存泄漏。这些“游荡对象”证明了JVM内存的完整持续时间。如果在应用程序逻辑中连续创建这样的“对象体”,典型的问题子对象是静态集合,它们被用作一种缓存。 add() 和 remove() 方法在这里使用的频率是多少。添加的对象被静态集合项引用,并且由于GC根引用(static)而不能再释放。

在内存泄漏的上下文中,也经常提到所谓的支配者或支配树。

Java内存泄漏和垃圾收集器是什么样的关系呢

支配者的概念来源于图论,当一个节点只能到达另一个节点时,它就被定义为另一个节点的支配者。因此,当没有其他对象C引用B时,对象A是另一个对象B的支配者。支配者树则是一个子树,其中来自根节点的条件应用于所有子节点。如果根引用被释放,整个支配树将被释放。因此,在内存泄漏搜索中,非常大的控制树是非常好的候选。

根据不再需要的对象的生成频率和大小,以及Java堆的配置大小,OutOfMemoryError迟早会发生。正是后一种变体,即所谓的“爬行内存泄漏”,在许多应用程序中都会发现,而且这些问题通常会被“忽略”,并且会遇到以下措施:

更大的堆来争取时间,直到错误发生。不幸的是,在64位jvm时代,这种方法正变得越来越流行。

晚上重启应用服务器。这将导致内存重置。如果内存在24小时内没有完全填满,可以通过重新启动来避免错误。

这两个版本都是危险的,因为它们对性能有负面影响,并且有可能由于用户行为的改变或更多的通信量而导致错误比预期更快地发生。性能也受到垃圾收集器的负面影响,因为越来越满的“终身生成”意味着GC必须经历更多的对象,“标记”阶段需要越来越多的时间,随着大量堆,要分析的对象的数量变得更大。因此,本系列文章将详细分析这些内存泄漏,以避免出现这种情况。

内存太多

========================================================================

还有一些情况下,堆中的OutOfMemoryError不是由实际意义上的内存泄漏引起的,而是应用程序消耗了太多内存。在这种情况下,要么选择的堆太小,必须将其放大,要么必须减少应用程序的内存消耗,例如选择较小的缓存大小。

然而,临时存储的高消耗也特别重要,因为它会导致某些并行访问应用程序中发生OutOfMemoryError,因此这些应用程序是不确定的,因此会造成更大的不适,因为你不能在晚上重新开始。以下示例显示了可能的问题代码:

byte[] image = getTheByteImage();

response.setContentType(“image/jpeg”);

ServletOutputStream out = response.getOutputStream();

out.write(image);

out.flush();

out.close();

内存消耗在这里并不明显,但是,图像在每次调用时都作为字节数组放在堆上,然后再发送到浏览器。更好的选择是直接简化图像:

InputStream image = getTheImageAsStream();

response.setContentType(“image/jpeg”);

ServletOutputStream out = response.getOutputStream();

IOUtils.copy(image, out);

out.flush();

out.close();

( BufferedStreams 和 ioutil 在内部使用 byte ,但它们通常要小得多)

在这方面,我们第一次只有 java.lang.OutOfMemoryError 错误说明堆中的问题。

在本系列的下一部分“Java虚拟机的配置和监视”中,我将向您展示如何在sun jvm上配置和优化堆设置,以及如何使用JVM资源监视内存。

因此,接下来的两个部分将更实际,而不是理论性的,我计划整合一些小屏幕截图来给出说明性的例子。

有一些有趣的场景,引用不再可访问,但内存无法释放,例如:

public void someMethod() {

try {

String xml = getSomeBigXML();

// do something

} catch (AnException) {

// handle exception

}

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-RV6kL26S-1713616564713)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值