伤不起的项目,宕机已成家常便饭

新项目,自己搭建的环境,项目运行一段时间后(一般三天左右),服务器会宕机一次(内存溢出),tomcat设置内存为1024,用户在100左右,dump下了虚拟机的heap dump文件,用memory analyer tool分析了下,无奈英文水平有限,难以理解,特求解决方案,告诉我下哪个对象有问题,还是session有问题,尽量详细

仔细的看了你提供的日志分析文件,我觉得很可能的问题出在你错误的使用了ThreadLocal 上。
你看看你的代码中,是否建立了一个HashMap,然后放入ThreadLocal 对象中了?对HashMap 的操作只是put?
这里你要注意一点的,因为Tomcat 使用的是线程池,线程处理完成之后,该Thread 对象不会销毁,而是放入线程池中,所以与该线程对应的ThreadLocal 对象也不会消亡。而你每次只是往ThreadLocal 对象中put,从来不去主动调用释放的话,你的对象就会越来越大。
你往这方面去查查你的代码吧

看了一下你提供的报告。
20个org.apache.tomcat.util.threads.ThreadWithAttributes,每个占用的内存约30-40。合起来几乎把所有的内存都用掉了。
建议你分几个时间段做一下检查,看这些ThreadWithAttributes是从开始时是多少,过段时间增加了多少。现在看来,这些进程大约占用700-800就会崩溃。
我发现你系统里面有大量的HashMap及其Entry。仔细检查你的代码,看一下和HashMap相关的操作是否有问题吧。应该是内存泄漏了。

应该是线程方面的问题

1.看看ThreadWithAttributes里存的是什么
2.检查项目里自己写的线程部分

很可能是你连数据库产生的问题,你可以用连接池试试

原始的dump拿出来看看  

否则看ThreadWithAttributes 这个类里面有哪些属性,里面存的什么,看看源代码

ThreadWithAttributes是从开始时是多少,过段时间增加了多少

Class Name Objects Shallow Heap Retained Heap
org.hibernate.impl.SessionFactoryImpl
All objects 255 32,640 >= 667,074,888

org.hibernate.impl.SessionImpl
All objects 255 22,440 >= 663,130,760

java.lang.ThreadLocal$ThreadLocalMap
All objects 75 1,800 >= 645,165,816

是不是写了什么数据库的工具类, 然后把连接放到ThreadLocal里
这块写的有问题应该。。

看起来像是内存泄露,不过,建议看看编译的版本是否高于tomcat的jdk版本...

去群组 → 编程语言 → 高级语言虚拟机里问下吧,那里或许可以得到答案

程序自身或者TOMCAT的配置问题吧

以前我遇到过类似问题吧,也是用内存工具查看的 dump,差不多里面的数据结构都是 map一层一层,你跟着根结构进去就会看到一些你很熟悉的类和数据

100人的访问Tomcat不会有问题的,我感觉是你系统的问题!
最好找找有那些资源没有释放吧!

  1. org.hibernate.impl.SessionFactoryImpl 用法錯誤。org.hibernate.impl.SessionFactoryImpl 的對象數量與org.hibernate.impl.Session相同,很明顯是每次創建session實例時都重新創建新的sessionFactory實例。正確的做法是全局祗創建唯一的sessionFactory實例。
  2. java.util.HashMap逹到了458,022個,而java.util.HashMap$Entry祇有2,041,542個,平均每個HashMap對象僅有5個元素。java.util.HashMap使用過後沒釋放的可能性比較大。

楼主,
应该是有个共享的hashmap没有释放。
比如session有没有关闭。