小编wal*_*ood的帖子

有没有办法避免Tomcat中的部署内存泄漏?

这个问题适用于曾经测试过Tomcat管理器中"查找泄漏"按钮的人,并获得了这样的结果:

以下Web应用程序已停止(重新加载,取消部署),但之前运行的类仍然在内存中加载,从而导致内存泄漏(使用分析器确认):
/leaky-app-name

我认为这与经常重新部署经常得到的"Perm Gen space"错误有关.

所以我在部署时在jconsole中看到的是我加载的类从大约2k到5k.然后你会认为取消部署应该将它们降回到2k,但它们保持在5k.

我也尝试使用以下JVM选项:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled

我确实看到Perm Gen空间的使用量非常小,但不是我预期的,并且加载的类计数没有下降.

那么有没有办法配置Tomcat或设计你的应用程序以便在取消部署时更好地卸载?或者我们是否在一些重要的调试会话后重新启动服务器?

Tomcat版本输出:

服务器版本:Apache Tomcat/6.0.29
服务器内置:2010年7月19日1458
服务器编号:6.0.0.29
操作系统名称:Windows 7
操作系统版本:6.1
体系结构:x86
JVM版本:1.6.0_18-b07
JVM供应商:Sun Microsystems Inc.

更新:

感谢celias的回答,我决定多做一些挖掘,我认为由于CXF,Spring和JAXB,我确定了应用程序的罪魁祸首.

在我学习了如何分析Java应用程序之后,我将分析器指向Tomcat并获取了一些堆转储和快照,以查看对象和类在内存中的外观.我发现在我的CXF/JAXB(wsdl2java)生成的类中使用的XML模式中的一些枚举在取消部署后仍然存在.根据我的堆转储,它看起来像是绑定到Map.免责声明:我承认我仍然有点绿色,分析和跟踪对象的调用树在Java中可能具有挑战性.

另外我应该提一下,我甚至没有调用该服务,只是部署然后取消部署它.对象本身似乎是通过部署时从Spring发起的反射加载的.我相信我遵循了在Spring中设置CXF服务的惯例.所以我不能100%确定这是Spring/CXF,JAXB还是反射的错误.

作为旁注:有问题的应用程序是使用Spring/CXF的Web服务,而XML恰好是一个相当复杂的模式(NIEM的扩展).

java spring tomcat memory-leaks jaxb

54
推荐指数
2
解决办法
2万
查看次数

Oracle数据库中表触发的多模式权限

我正在尝试编写一个表触发器,用于查询触发器所在架构之外的另一个表.这可能吗?在我的架构中查询表似乎没有问题,但我得到:

Error: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

尝试查询我的架构外的表时.

编辑

我很抱歉第一次没有提供尽可能多的信息.我的印象是这个问题更简单.

我正在尝试在一个表上创建一个触发器,该表根据某些数据的存在来更改新插入行上的某些字段,这些数据可能存在于另一个模式中的表中,也可能不存在.

我用来创建触发器的用户帐户确实具有独立运行查询的权限.事实上,我有触发器打印我正在尝试运行的查询,并且能够成功运行它.

我还应该注意,我正在使用EXECUTE IMMEDIATE语句动态构建查询.这是一个例子:

CREATE OR REPLACE TRIGGER MAIN_SCHEMA.EVENTS
BEFORE INSERT
ON MAIN_SCHEMA.EVENTS REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE 
    rtn_count NUMBER := 0;
    table_name VARCHAR2(17) := :NEW.SOME_FIELD;
    key_field VARCHAR2(20) := :NEW.ANOTHER_FIELD;
BEGIN
    CASE
        WHEN (key_field = 'condition_a') THEN
            EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_A.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count;
        WHEN (key_field = 'condition_b') THEN
            EXECUTE IMMEDIATE 'select count(*) from OTHER_SCHEMA_B.'||table_name||' where KEY_FIELD='''||key_field||'''' INTO rtn_count; …
Run Code Online (Sandbox Code Playgroud)

database oracle triggers oracle10g ora-00942

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

database ×1

java ×1

jaxb ×1

memory-leaks ×1

ora-00942 ×1

oracle ×1

oracle10g ×1

spring ×1

tomcat ×1

triggers ×1