虚拟内存提交

在服务器反弹发生之后,在大约40-45天的时间周期之后,我们会收到连续的“Committed Virtual Memory”警报,指出交换空间的使用量大于4GB。这也会导致应用程序执行速度非常慢,停滞交易的数量。 服务器设置:

4个Tomcat服务器(版本7.0.22),由2个Apache服务器负载均衡(非群集)。 Apache服务器本身提供静态内容和路由到这四个tomcat服务器。

Java运行时版本:Java版本“1.6.0_30”Java™SE运行时环境(内部版本1.6.0_30-b12)Java HotSpot™64位服务器虚拟机(版本20.5-b03,混合模式

内存启动参数:

MEMORY_OPTIONS="-Xms1024m -Xmx1024m -Xss192k -XX:MaxGCPauseMillis=500 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled" 

监视 – Wily监视可在所有监视关键服务器参数的生产服务器中使用,并根据预先定义的设置发送可configuration的警报电子邮件。

注意:每个服务器还有两个独立的tomcat域,运行不同的应用程序

调查地区:

  • 没有堆内存泄漏,GC运行正常,没有任何问题
  • 当前繁忙的线程数量直接对应于应用程序的使用情况 – 周末和晚上的数量较less。 的线程相比,营业时间
  • ThreadLocal在内部使用WeakReference。 如果ThreadLocal没有被强引用,它将被垃圾回收,尽pipe各个线程都通过该ThreadLocal存储了值。
  • 此外,ThreadLocal值实际上存储在线程中; 如果线程死亡,则通过ThreadLocal收集与该线程相关的所有值。
  • 如果你有一个ThreadLocal作为最终的类成员,这是一个强有力的参考,它不能被收集,直到类被卸载。 但是这是任何类成员的工作方式,不被视为内存泄漏。
  • 引用的问题只有在存储在ThreadLocal中的值强烈引用ThreadLocaltypes的循环引用时才会起作用。 在这种情况下,值(SimpleDateFormat)没有向后引用到ThreadLocal。 这段代码没有内存泄漏。

任何人都可以请让我知道这是什么原因,以及要监控什么?