首页 > 系统相关 >java面试(9)内存泄露

java面试(9)内存泄露

时间:2023-05-27 15:36:33浏览次数:46  
标签:java 变量 作用域 面试 实例 线程 内存 泄露

1: Java 中也存在栈内存泄露的情况?

   在 Java 中,栈内存主要用于存储方法调用和本地变量。与堆内存不同,栈内存的分配和释放是由编译器和虚拟机自动处理的,通常不需要手动释放。

   然而,如果在编写代码时出现一些问题,可能会导致栈内存泄露。以下是一些可能引起栈内存泄露的常见情况:

          a 递归调用问题:如果递归调用没有正确地终止,或者递归深度过大,会导致栈内存不断增长,最终可能导致栈溢出错误。

          c 线程泄露:如果在应用程序中创建了大量的线程,并且这些线程没有正确地终止或释放资源,就可能导致栈内存泄露。

 

导致内存泄露的的情况:

 1) 静态集合类:

       HashMap, LinkedList等,这些容器本身是静态的,它们的生命周期和程序一致,但是持有的对象不会被释放。

     2)单例模式:

            单例模式旨在确保在整个应用程序中只有一个实例存在,这可以通过在类中使用静态变量来实现。

           Singleton作用域适用于那些无状态、线程安全且共享的Bean。使用Singleton作用域可以节省内存,并提高应用程序的性能,因为只需创建一个实例,多个组件可以共享该实例。

     3)未关闭的资源:数据库连接,网络连接,IO连接等。

     4) 变量不合理的作用域: 一个变量的作用域范围大于使用范围,会导致内存泄露。 这个时候要及时的设置成null

     5)  非静态内部类持有外部类的引用:

      6) 改变哈希值: 当对象被存储到HashSet集合中,就不能修改对象中参与计算哈希值的字段了。

      7)缓存泄露: 把对象放入到缓存(hashMap)中,可能会导致泄露,解决方法是使用WeakhashMap(除了自身的引用外,没有其他的引用会自动丢弃)

      8) 监听器和回调:

 

补充知识点

            主内存: 所有线程创建的实例对象都放在主内存中(包括成员变量和局部变量)

            本地内存: 每个线程都有一个私有的本地内存来存储主内存中的共享变量的副本。

                       

标签:java,变量,作用域,面试,实例,线程,内存,泄露
From: https://www.cnblogs.com/liufei1983/p/17436790.html

相关文章

  • java——微服务——spring cloud——Eureka——搭建Eureka服务
        创建新工程:    创建main函数,并添加注解      编写参数:     启动:     点击打开浏览器:              ......
  • 基于JAVA的sprinboot+vue车辆充电桩,附源码+数据库+论文+PPT
    1、项目介绍利用springboot、Java、idea和mysql数据库等知识点,结合相关设计模式、以及软件工程的相关知识,设计一个车辆充电桩管理系统,来进行记录用户的信息,以及系统信息的增删改查的功能,根据实现需求,系统需完成这些基本功能:(1)系统合理显示系统首页界面,管理员界面,用户界面和维修员......
  • Linux 大页内存 Huge Pages 虚拟内存
    Linux为什么要有大页内存?为什么DPDK要求必须要设置大页内存?这都是由系统架构决定的,系统架构发展到现在,又是在原来的基础上一点点演变的。一开始为了解决一个问题,大家设计了一个很好的方案,随着事物的发展,发现无法满足需求,就在原来的基础上改进,慢慢的变成了现在的样子。不过技术革新......
  • 【㉿Java并发】对象有状态 & 无状态
    有状态就是有数据存储功能。有状态对象(StatefulBean),就是有变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。实例变量和类变量都是状态变量无状态就是一次操作,不能保存数据。无状态对象(StatelessBean),就是没有实例 变量的对象.不能保存数据,是不......
  • Java基础
    Java基础将一个对象作为参数传递是值传递还是引用传递?java中只有值传递没有引用传递!!!无论是基本数据类型还是引用类型都是值传递,引用类型传递的时地址的值newstring()和string的区别?newString是在堆空间中创建对象,而string是直接在常量池中赋值String不能被继承(Str......
  • Day2-java泛型与集合
     ArrayList类的使用Set接口及实现类的使用了解对象顺序,Comparable接口及其使用Queue接口和实现类的使用了解Map接口及实现类的使用Collections类的实用方法操作List对象StreamAPI的使用了解泛型类型 取出和输入不用强制类型转换泛型是带一个或多个类型......
  • java中HashMap的实现原理
    HashMap是Java中常用的一种存储结构,它通过哈希表实现了快速查找数据的功能,下面是它的具体实现原理:HashMap内部存储结构HashMap的内部实现是一个数组和一个链表组成的。数组称为哈希表,用于保存实际存储的数据,链表则用于处理哈希冲突,即不同的键值对可能会被存储到哈希表的同一个位置......
  • jdepend java 包依赖分析库
    jdepend是一个java库,可以通过便利源码以及javaclass生成每个java包的质量metrics说明对于比较关心代码质量,或者需要在持续交付中关注质量metrics的jdepend是一个值得使用的工具参考资料https://github.com/clarkware/jdepend......
  • liteflow 一个强大的java 规则框架
    liteflow是一个java规则引擎,融合了编排以及规则引擎的能力,功能上很强大,支持比较复杂的编排(swtich,when,if,while,for。。。)同时还支持的不少的脚本引擎,我们同时还可以将规则存储在外部,实现一些规则管理以及reload说明liteflow对于java生态集成的特别好,是一个很不错的开源规则引......
  • 小马哥Java分布式架构训练营第一期服务治理-鱼龙潜跃水成文
    小马哥Java分布式架构训练营第一期服务治理download:3w51xuebccom使用Netty和SpringBoot实现仿微信的示例在本文中,我们将使用Netty和SpringBoot框架来创建一个简单的聊天应用程序,类似于微信。这个应用程序将支持多用户聊天和即时消息发送。下面让我们来一步步看看如何实现。第一......