Introspector内存溢出的原理解析
参考: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内存溢出的原理解析相关推荐
- Java中OutOfMemoryError(内存溢出)的原理及解决办法
Java中的OutOfMemoryError,即内存溢出,而无论是哪种内存溢出,都可以通过增加对应JVM内存空间解决:即修改对应内存参数的大小 根据内存区域的不同,存在多种情况,下面介绍最常见的几种情 ...
- threadlocal内存泄露_ThreadLocal原理解析
谈一谈不常见却又不可少的ThreadLocal 在写ThreadLocal之前,需要先巩固下一点相关知识:Java内存模型及共享变量的可见性. 内存模型中所有变量存储在主内存中,当一个线程中要使用某个 ...
- Tomcat工作原理 、JVM内存溢出及合理配置、配置文件详解
一 Tomcat工作原理 Server 要完成的任务很简单,就是要能够提供一个接口让其它程序能够访问到这个 Service 集合.同时要维护它所包含的所有 Service 的生命周期,包括如何初始化. ...
- Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)
Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) 参考文章: (1)Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理) (2)https://ww ...
- 内存泄漏 内存溢出 踩内存 malloc底层实现原理
本文主要对内存泄漏.内存溢出.内存踩踏[踩内存]以及malloc的底层实现原理进行了总结.话不多说,直接往下看: 参考文章: 内存泄漏与内存溢出: https://blog.csdn.net/ruir ...
- 内存泄漏分析框架LeakCanary的使用与原理解析
文章目录 1. 常见内存泄漏 1.1 "单例模式" 造成的内存泄漏 1.2 "静态实例" 造成内存泄漏 1.3 "Handler" 造成的内 ...
- 利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法
利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法. 内存作为计算机系统的组成部分,跟开发人员的日常开发活动有着密切的联系,我们平时遇到的Segment Fault.OutOfMemory ...
- 超大数据量的xlsx格式的excel文件的读取和解析,解决了POI方式的内存溢出和性能问题
在之前的博文< POI读取并解析xlsx格式的excel文件>中,在小数据量的情况下是可以轻松愉快的处理的,但是当excel文件的数据量达到百万级的时候, InputStream is = ...
- ThreadLocal内存泄漏原理解析
1.什么是内存泄漏问题? 内存泄漏 表示就是我们申请了内存,但是该内存一直无法释放: 内存泄漏会导致内存溢出问题: 申请内存时,发现申请内存不足,就会报错 : 2.在介绍ThreadLocal内存泄漏 ...
最新文章
- CondLaneNet:基于条件卷积的自顶向下车道检测框架
- HNCU1101:马的移动---BFS
- 【深度学习】深度学习手写代码汇总(建议收藏,面试用)
- “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
- CSS块级元素、内联元素概念
- php 父进程id,PHP pcntl_fork创建进程,复制父进程内存空间上下文
- Chrome最新版本如何通过JS设置支持自动播放音频
- 外企面试官最爱提的十个问题
- 人工智能入门——机器学习小案例(二)
- roundcube db.inc.php,Roundcube Webmail 安装配置篇
- 这些屏幕特效是咋实现的
- web.py mysql_webpy连接mysql出现问题
- 30款Linux 高性能网络开发库开源软件
- linux应用/软件设置为系统服务
- Android默认设置MTP模式
- 网站url后带spm参数的作用
- homebrew Error: qt: unknown version :mountain_lion
- java l1是啥意思_L1-020 帅到没朋友 (20分) Java
- jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修
- Unity 发布到IOS,Android的各种坑