2015-02-05 33 views
0

我在tomcat上的两个不同的服务器上运行了一个web应用程序的两个实例。当我通过多播添加会话复制配置时,它会在接下来的五分钟内给我发生permgen错误(我只有两个活动会话)。但在这五分钟内,一切看起来很正常:一台服务器中的会话被成功复制到另一台服务器。当我没有多播设置时,我没有看到permgen问题。多播时发生Permgen错误

任何想到为什么多点传输只消耗两个会话的所有可用内存?

回答

0

Permgen用于存储有关类的元数据。它不受这些类的实例数量的影响。会话的数量(即实例)可能无关紧要。这很可能是使用(也可能动态生成)类来支持会耗尽电源的会话复制的简单行为。

开始通过明确设置MaxPermSize property来增加烫发的尺寸。

考虑转移到jdk 8,它改变了管理元数据的方式。

http://java.dzone.com/articles/java-8-permgen-metaspace

+0

Thanks Brett。 类用于支持会话复制的次数与复制的活动会话数成正比。所以它耗尽了PermGen。说得通。当我查看活动会话的数量时,当没有用户在线时,其中有1500个。所有会话都是0字节大小。一个会话每分钟创建2个属性。他们是'_psiprobe_la_ip'和'_lambda_probe_la_ip'。我不知道为什么。我们使用psi探针工具进行tomcat管理。此工具每分钟创建一次会话吗? – 2015-02-08 04:41:44

+0

否 - ** 1 ** java.lang.Class为特定类实例,无论该类有多少个实例(忽略例如在同一个JVM中具有相同类的多个Web应用程序)。只有java.lang.Class存储在PermGen中,而不是对象实例。随意查看[本博客系列](http://java.jiderhamn.se/2011/12/11/classloader-leaks-i-how-to-find-classloader-leaks-with-eclipse-memory - 分析器 - 垫/)如何找到泄漏,和[这个我的图书馆](https://github.com/mjiderhamn/classloader-leak-prevention),可以帮助你避免这个问题。 – 2015-02-16 13:05:38