WebSphere Classloader内存泄漏预防

解决应用程序类加载器泄漏

应用领域 倾向于:

  • 使用应用程序类加载器中的Runnable实现启动新线程。 即使JEE编程模型不支持此功能,客户也经常直接创建新线程或通过使用间接创建它们 计时器 客户必须确保在停止相应的应用程序(或WAR模块)时停止这些线程:
    • 可以在停止WAR进行清理时使用javax.servlet.ServletContextListener.contextDestroyed进行通知。
  • 使用ThreadLocal的静态存储一个ThreadLocal)。 ThreadLocal值有效地作为WeakHashMap存储在每个Thread中 。 由于这些值通常包括应用程序对象,因此该应用程序对象引用其Class ,该Class引用其ClassLoader ,该ClassLoader引用包含ThreadLocalClass ,弱引用永远不会中断,并且会发生泄漏。

    鼓励客户避免使用 ThreadLocal ,或者在模块停止时清除对ThreadLocal的引用(请参见上文),或者确保在每次请求后都调用remove()

  • 向JMX服务器注册JMX MBean或NotificationListener 。 客户必须确保在停止相应的应用程序(或WAR模块)时取消注册。

任意组件

这包括JDBC提供程序,第三方软件和本身想要实现以下目的的应用程序:
  • 启动新线程,包括由java.util.Timer构造函数创建的“定时器线程”。 创建线程时 ,将从原始线程复制两条信息:
    1. 上下文类加载器( getContextClassLoader() )。 当应用程序正在执行时,容器将上下文类加载器设置为模块类加载器,因此新创建的线程将在上下文类加载器存在期间保持其活动状态。 可以通过在启动计时器之前调用setContextClassLoader到非应用程序类加载器来避免这种情况,然后再将其重置。
    2. 调用线程的AccessControlContext (如AccessController所述 )。 如果线程是由于来自应用程序的API调用而启动的,则应用程序的ProtectionDomain将位于AccessControlContext中 ,并且应用程序类的ProtectionDomain将包括对其ClassLoader的引用。 通过使用doPrivileged创建线程可以避免这种情况。 请注意,必须注意确保使用doPrivileged不允许非特权应用程序创建线程。

    例如:

    // doPrivileged fixes the AccessControlContext leak, and it is also required
    // for calls to Thread.get/setContextClassLoader.
    Timer timer = AccessController.doPrivileged(new PrivilegedAction() {public void run() {Thread thread = Thread.currentThread();ClassLoader savedCL = thread.getContextClassLoader();thread.setContextClassLoader(null);try {// The Timer constructor will create a Thread, which will copy the// context class loader from the current thread, which is now null.return new Timer(true);} finally {thread.setContextClassLoader(savedCL);}}
    });
  • 将数据与当前上下文类加载器关联。 这通常是通过Map <classloader Value> </ classloader完成的 。 此地图必须:
    1. 具有明确的生命周期API。 在这种情况下,必须调用生命周期API。 如果代码是由客户介绍的,则客户负责添加JMX侦听器。 如果代码是由WAS prereq引入的,则所有者必须使用WAS应用程序侦听器API。 如果代码属于JDK,则运行时团队将承担调用它的责任(例如ResourceBundle.clearCacheIntrospector.flushCaches )。
    2. 成为WeakHashMap以允许对ClassLoader键进行垃圾收集。 请注意,该值不得包含对从该ClassLoader创建的类或对象的非弱引用,否则该条目将永远不会被删除。 WeakHashMap <ClassLoader,WeakReference <Class >>或WeakHashMap <ClassLoader,Tuple>,其中Tuple包含从类实例化的对象的WeakReference <Class>和WeakReference <Object>。 在这两种情况下,Class的保持都很弱,这仍然允许ClassLoader的收集。 在后一种情况下,如果发生GC,将清除对实例化对象的引用,但假定可以廉价地重新实例化它。

    这些提示由WAS专家Brett Kail提供

    参考:来自JCG合作伙伴的 WebSphere Classloader内存泄漏预防   All Things WebSphere博客上的Rohit Kelapure。


    翻译自: https://www.javacodegeeks.com/2012/03/websphere-classloader-memory-leak.html

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373459.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    airflow sql_alchemy_conn mysql_airflow使用mysql数据库,LocalExecutor并发调度

    mysql-airflow在mysql上执行create database airflow; —— 创建数据库GRANT all privileges on airflow.* TO airflow% IDENTIFIED BY 123456; —— 将数据库airflow的所有权限授权airflow用户&#xff0c;密码123456且该用户可在任何IP段登录操作FLUSH PRIVILEGES; —— 刷新…

    【SAP业务模式】之ICS(四):组织单元的配置

    SAP的ICS业务后台配置主要有以下几个配置点&#xff1a; 1、组织单元的配置&#xff08;公司代码、销售组织、工厂、采购组织等&#xff09;&#xff1b; 2、主数据的部分&#xff1b; 3、订单和开票的定价过程&#xff1b; 4、开票输出类型&#xff1b; 5、公司间发票的配置&a…

    poj-2478 Farey Sequence(dp,欧拉函数)

    题目链接&#xff1a; Farey Sequence Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14230 Accepted: 5624Description The Farey Sequence Fn for any integer n with n > 2 is the set of irreducible rational numbers a/b with 0 < a < b < n a…

    Twitter4j和Esper:在Twitter上跟踪用户情绪

    对于复杂事件处理和Twitter API的新手&#xff0c;我希望这是一个简短的教程&#xff0c;可以帮助他们Swift起步。 管理大数据并从中挖掘有用的信息是当前技术中最热门的讨论主题。 来自Twitter&#xff0c;Facebook和Linkedin等社交网络的半结构化数据的爆炸式增长使Hadoop&am…

    webase crud查看所有表_Laravel-Gii 可视化代码生成工具 CRUD +GUI

    Laravel-Gii 可视化代码生成工具 CRUD GUI适用于快速B端后台开发&#xff0c;根据MySQL的表结构生成对应的Model、Observer、Controller、View、Route等相关项目文件[TOC]注意因为是解析MySQL的表结构&#xff0c;并且根据字段生成模板&#xff0c;所以目前生成的Model类时只支…

    20145231第二周Java学习笔记

    20145231 《Java程序设计》第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本&#xff0c;再看视频&#xff0c;然后实践敲代码&#xff0c;最后根据学习笔记总结完成博客。 第三章&#xff1a;基础语法 知识点比较多比较零碎&#xff0c;整理的都是实际操作中可…

    JavaFX 2.0和Scala,像牛奶和饼干

    JavaFX 2.0和Scala都是很好的技术&#xff0c;但是一起使用时效果会更好。 JavaFX 2.0是一种功能强大的富客户端技术&#xff0c;具有先进的图形&#xff0c;动画和媒体功能。 Scala是一种简单但功能强大的语言&#xff0c;具有用于编写特定于域的语言&#xff08;DSL&#xff…

    ASP.NET WebAPi之断点续传下载(上)

    前言 之前一直感觉断点续传比较神秘&#xff0c;于是想去一探究竟&#xff0c;不知从何入手&#xff0c;以为就写写逻辑就行&#xff0c;结果搜索一番&#xff0c;还得了解相关http协议知识&#xff0c;又花了许久功夫去看http协议中有关断点续传知识&#xff0c;有时候发觉东西…

    贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

    程序效果&#xff1a; 代码&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

    3.0 C++远征:is a

    4-4is_a 0.派生类Soldier继承自基类Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

    python中sorted的用法append_python sorted()排序详解

    排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

    云上的播放框架变得简单:Openshift模块

    仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…

    C#中的yield return与Unity中的Coroutine(协程)(下)

    Unity中的Coroutine&#xff08;协程&#xff09; 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件&#xff0c; Image&#xff1a; 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

    字节流转化为文件流_C#文件转换为字节流及字节流转换为文件

    本文讲解了C#实现文件转换为字节流的方法。文件转换为字节流的步骤如下1、通过文件流打开指定文件(FileStream fs)&#xff1b;2、定义字节流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件读取到字节流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、关闭…

    Spring和JSF集成:导航

    我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”&#xff0c;因此&#xff0c;如果您签出代码&#xff0c;请注意它是一个不断变化的目标。 期待一些粗糙的边缘&#xff0c;如果有时会…

    【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

    前言&#xff1a;之前我有写过CSS3的transform这一这特性&#xff0c;对于它的用法&#xff0c;还不是很透彻&#xff0c;今天补充补充&#xff0c;呵呵 你懂的&#xff0c;小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a)&#xff0c;单位deg&a…

    宏的用法与简介

    预处理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因为他们由预处理器解释的&#xff0c;所以称作预处理指令。预处理器读取源代码&#xff0c;然后对其修改&#xff0c;并把修改过的…

    django 日志写入mysql_如何将django orm模型 写入数据库

    1、指定连接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置连接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的数据库名称USER: root, #你的数据库用户名PASSWORD: , #你的数…

    ORM的问题第2部分–查询

    在我以前关于对象关系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我讨论了在处理当今常见的ORM&#xff08;包括Hibernate&#xff09;时遇到的各种问题。 其中包括与从POJO生成架构有关的问题&#xff0c;实际性能和不断出现的维护问题。 本质上&#xff0c;结论…

    【转】如何减少接口响应时间

    Premature optimization is the root of all evil. — Donald Knuth 对于程序优化&#xff0c;我一直采取保守的态度&#xff0c;除非万不得已。但是随着业务的不断发展&#xff0c;程序越来越复杂&#xff0c;代码越写越多&#xff0c;优化似乎是终有一天会到来的事情。 那么对…