参考:https://blog.csdn.net/luman1991/article/details/52164953

JavaBeans Introspector是一个类,位置在Java.bean.Introspector,这个类的用途是发现java类是否符合javaBean规范,也就是这个类是不是javabean。具体用法可以参照jdk文档;

上面的意思就是,如果有的框架或者程序用到了JavaBeans Introspector了,那么就启用了一个系统级别的缓存,这个缓存会存放一些曾加载并分析过的javabean的引用,当web服务器关闭的时候,由于这个缓存中存放着这些javabean的引用,所以垃圾回收器不能对web容器中的javaBean对象进行回收,导致内存越来越大。

spring提供的org.springframework.web.util.IntrospectorCleanupListener就解决了这个问题,他会在web服务器停止的时候,清理一下这个Introspector缓存。使那些javabean能被垃圾回收器正确回收。

spring不会出现这种问题,因为spring在加载并分析完一个类之后会马上刷新JavaBeans Introspector缓存,这样就保证了spring不会出现这种内存泄漏的问题。

但是有很多程序和框架在使用了JavaBeans Introspector之后,都没有进行清理工作,比如quartz、struts。

spring中提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责处理由JavaBeans Introspector的使用而引起的缓冲泄露。spring中对它的描述如下:

它是一个在web应用关闭的时候,清除JavaBeans Introspector的监听器.在web.xml中注册这个listener.可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它管理的类

如果你使用了JavaBeans Introspector来分析应用中的类,Introspector 缓冲中会保留这些类的引用.结果在你的应用关闭的时候,这些类以及web 应用相关的class loader没有被垃圾回收.

不幸的是,清除Introspector的唯一方式是刷新整个缓冲.这是因为我们没法判断哪些是属于你的应用的引用.所以删除被缓冲的introspection会导致把这台电脑上的所有应用的introspection都删掉.

需要注意的是,spring 托管的bean不需要使用这个监听器.因为spring它自己的introspection所使用的缓冲在分析完一个类之后会被马上从javaBeans Introspector缓冲中清除掉.

应用程序中的类从来不直接使用JavaBeans Introspector.所以他们一般不会导致内部查看资源泄露.但是一些类库和框架往往会产生这个问题.例如:Struts 和Quartz.

单个的内部查看泄漏会导致整个的web应用的类加载器不能进行垃圾回收.在web应用关闭之后,你会看到此应用的所有静态类资源(例如单例).这个错误当然不是由这个类自身引起的.

在web.xml中添加:

1 <!-- 防止内存泄露 -->
2 <listener>
3 <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
4 </listener>

转载于:https://www.cnblogs.com/huanlingjisi/p/8968265.html

Introspector内存溢出的原理解析相关推荐

  1. Java中OutOfMemoryError(内存溢出)的原理及解决办法

    Java中的OutOfMemoryError,即内存溢出,而无论是哪种内存溢出,都可以通过增加对应JVM内存空间解决:即修改对应内存参数的大小 根据内存区域的不同,存在多种情况,下面介绍最常见的几种情 ...

  2. threadlocal内存泄露_ThreadLocal原理解析

    谈一谈不常见却又不可少的ThreadLocal 在写ThreadLocal之前,需要先巩固下一点相关知识:Java内存模型及共享变量的可见性. 内存模型中所有变量存储在主内存中,当一个线程中要使用某个 ...

  3. Tomcat工作原理 、JVM内存溢出及合理配置、配置文件详解

    一 Tomcat工作原理 Server 要完成的任务很简单,就是要能够提供一个接口让其它程序能够访问到这个 Service 集合.同时要维护它所包含的所有 Service 的生命周期,包括如何初始化. ...

  4. Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)

    Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) 参考文章: (1)Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) (2)https://ww ...

  5. 内存泄漏 内存溢出 踩内存 malloc底层实现原理

    本文主要对内存泄漏.内存溢出.内存踩踏[踩内存]以及malloc的底层实现原理进行了总结.话不多说,直接往下看: 参考文章: 内存泄漏与内存溢出: https://blog.csdn.net/ruir ...

  6. 内存泄漏分析框架LeakCanary的使用与原理解析

    文章目录 1. 常见内存泄漏 1.1 "单例模式" 造成的内存泄漏 1.2 "静态实例" 造成内存泄漏 1.3 "Handler" 造成的内 ...

  7. 利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法

    利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法. 内存作为计算机系统的组成部分,跟开发人员的日常开发活动有着密切的联系,我们平时遇到的Segment Fault.OutOfMemory ...

  8. 超大数据量的xlsx格式的excel文件的读取和解析,解决了POI方式的内存溢出和性能问题

    在之前的博文< POI读取并解析xlsx格式的excel文件>中,在小数据量的情况下是可以轻松愉快的处理的,但是当excel文件的数据量达到百万级的时候, InputStream is = ...

  9. ThreadLocal内存泄漏原理解析

    1.什么是内存泄漏问题? 内存泄漏 表示就是我们申请了内存,但是该内存一直无法释放: 内存泄漏会导致内存溢出问题: 申请内存时,发现申请内存不足,就会报错 : 2.在介绍ThreadLocal内存泄漏 ...

最新文章

  1. CondLaneNet:基于条件卷积的自顶向下车道检测框架
  2. HNCU1101:马的移动---BFS
  3. 【深度学习】深度学习手写代码汇总(建议收藏,面试用)
  4. “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
  5. CSS块级元素、内联元素概念
  6. php 父进程id,PHP pcntl_fork创建进程,复制父进程内存空间上下文
  7. Chrome最新版本如何通过JS设置支持自动播放音频
  8. 外企面试官最爱提的十个问题
  9. 人工智能入门——机器学习小案例(二)
  10. roundcube db.inc.php,Roundcube Webmail 安装配置篇
  11. 这些屏幕特效是咋实现的
  12. web.py mysql_webpy连接mysql出现问题
  13. 30款Linux 高性能网络开发库开源软件
  14. linux应用/软件设置为系统服务
  15. Android默认设置MTP模式
  16. 网站url后带spm参数的作用
  17. homebrew Error: qt: unknown version :mountain_lion
  18. java l1是啥意思_L1-020 帅到没朋友 (20分) Java
  19. jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修
  20. Unity 发布到IOS,Android的各种坑

热门文章

  1. GCD三部曲之一---辗转相除法
  2. 可变cell,自适应cell,理解iOS 8中的Self Sizing Cells和Dynamic Type
  3. Windows 命令行改主机名、加域、退域、更改IP
  4. 2192-Zipper 求最长公共子序列的解题报告
  5. 007 - VUE + hexo blog
  6. 【Vue2.0】—过渡与动画(二十一)
  7. HTML的基本知识(一)——标题标签
  8. 500并发相当于多少人_linux开发技术之线程池accept处理高并发connect(含源码)
  9. 想买一辆别克GL8用做家庭用车,跑长途自驾游可以吗?
  10. RFID打印机有什么用