我的应用抛出这样的错误:
08:41:33,749 XX DEBUG BeGenFilter:112 - doFilter(ServletRequest, ServletResponse, FilterChain) - 结束
08:42:04,778 XX DEBUG BeGenFilter:112 - doFilter(ServletRequest, ServletResponse, FilterChain) - 结束
08:42:52,895 XX  WARN JDBCExceptionReporter:71 - SQL Error: 17002, SQLState: null
09:03:46,449 XX ERROR JDBCExceptionReporter:72 - Io exception: Connection reset
09:03:46,450 XX  WARN JDBCExceptionReporter:71 - SQL Error: 17002, SQLState: null
09:03:46,450 XX ERROR JDBCExceptionReporter:72 - Io exception: Connection reset
09:03:46,445 XX  WARN HtmlImageRendererBase:82 - ALT attribute is missing for : searchImgId
08:48:43,249 XXX ERROR ExtensionsFilter:274 - Exception wile retrieving addResource
java.lang.OutOfMemoryError: Java heap space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at org.apache.commons.logging.LogFactory.directGetContextClassLoader(LogFactory.java:896)
at org.apache.commons.logging.LogFactory$1.run(LogFactory.java:862)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.commons.logging.LogFactory.getContextClassLoaderInternal(LogFactory.java:859)
at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:423)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685)
at org.apache.myfaces.renderkit.html.util.NonBufferingAddResource.<init>(NonBufferingAddResource.java:53)
at org.apache.myfaces.renderkit.html.util.DefaultAddResource.<init>(DefaultAddResource.java:98)
at org.apache.myfaces.renderkit.html.util.AddResourceFactory.getInstance(AddResourceFactory.java:255)
at org.apache.myfaces.renderkit.html.util.AddResourceFactory.getInstance(AddResourceFactory.java:304)
at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:266)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at cn.com.brilliance.begen.webapp.servlet.BeGenFilter.doFilter(BeGenFilter.java:56)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
09:03:49,976 XXX ERROR _ErrorPageWriter:485 - An exception occurred
javax.faces.FacesException: error while processing state : 
rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7k
M5YnxBzKWwCAAB4cAAAAAN0AAhfaWQxMjUwNXB0ACwvd
F9yaXNrY2FzZS90X3Jpc2tjYXNlX2Zvcm1fbWFrZWluZ19MaXN0LmpzcA==
我知道这是java heap溢出,想查明原因,但是定位不到问题出在哪?我看日志很奇怪,日志的打印时间开始都是好的,然后在08:42:52突然断掉,然后是09:03:46的日志,然后出现08:48:43的日志,很少出现日志断掉的情况,此时系统肯定是有用户在操作的,但是日志断掉,而且在08:48:43,249的出错日志我看到
        at org.apache.commons.logging.LogFactory.directGetContextClassLoader(LogFactory.java:896)
at org.apache.commons.logging.LogFactory$1.run(LogFactory.java:862),不知道是否是log4j写日志时,无法写到文件中,然后缓存在内存里面,一直到内存爆掉,不知道是否有可能是这种原因还是会由其他原因引起的?谢谢大家!

解决方案 »

  1.   

    一般是工程引用的class和jar太多了,取消不必要的import,然后设置-XX:PermSize、和-XX:MaxPermSize的值,例如-XX:PermSize=256m和-XX:MaxPermSize=256m
      

  2.   

    不好意思,上面回复的时候弄错了,当成了PerGen Space异常。
    你这个错误时内存溢出,增大内存例如-Xms128m、-Xmx512m,另外检查程序是否有内存泄露。
      

  3.   

    -Xms512m、-Xmx1024m,应该说差不多了,现在就是不知道哪里有内存泄露,你知道有什么办法去定位?
      

  4.   

    改应用服务哭的配置 ,把内存加大。JAVA技术交流群  55517828
      

  5.   

    光修改服务器内存也不行
        看下自己程序写的   还有  IDE的内存也是个问题
    有时候处理的数据量太大  内存缓存不够就爆了
      另外   看下什么地方有内存泄露没
      

  6.   

    IDE内存?是在生产环境下,所以可能不会有IDE的内存问题;就是觉得不知道怎么去找这个内存溢出的问题点?一次处理的数据量太大也是由于某个动作点击造成的,现在就是找不到这个点,不知道该怎么找
      

  7.   

    检查下是不是有些变量用完或出现异常后没关闭,还有大循环中new变量。
    有一个工具可以检查变量所消耗的内存,具体名称不记得了
      

  8.   

    heap 的溢出一般是lib下jar包太多了你要确认一下是内存溢出还是简单的内存不够,两者是有本质区别的内存溢出是你的对象占的空间释放不了,内存持续增大,最后吃光,一般有专门的内存监视工具,比如JProfile,可以看到哪个实例在持续的吃内存,找到这个对象实例再查代码里面create这个对象实例的代码,来找你代码中为什么垃圾回收器没法回收该对象实例,一般可能是循环引用
      

  9.   

    没有敢用JProfile,因为在生产上用JProfile对性能可能影响很大,我用MemoryAnalyzeer对JVM内存溢出生成的hprofile做过分析,结果
    Class Name                                                                    | Shallow Heap | Retained Heap | Percentage 
    -------------------------------------------------------------------------------------------------------------------------
    java.lang.Thread @ 0x64c8f990  http-8080-11 Thread                            |          104 |   932,431,224 |     90.90% 
    |- org.hibernate.engine.StatefulPersistenceContext @ 0x689f7d18               |           80 |   756,171,360 |     73.72% 
    |  |- org.hibernate.util.IdentityMap @ 0x68b28418                             |           24 |   725,413,096 |     70.72% 
    |  |  |- org.apache.commons.collections.SequencedHashMap @ 0x68b28430         |           24 |   725,413,056 |     70.72% 
    |  |  |  |- java.util.HashMap @ 0x68b9e888                                    |           40 |    14,155,320 |      1.38% 
    |  |  |  |- org.apache.commons.collections.SequencedHashMap$Entry @ 0x890e18d8|           24 |         2,400 |      0.00% 
    -------------------------------------------------------------------------------------------------------------------------
    看到Thread下面StatefulPersistenceContext(hibernate的session的移机缓存)占据大量内存,但是返回日志去看没有看到大数据量的数据库操作,而且从数据库AWR上也没有看到大IO的操作,不知道我这样看有没有问题?
      

  10.   

    内存溢出一般都是操作大量数据导致的,你看看程序是不是有可能一次操作大量数据,如果有这种可能就分批操作commit
      

  11.   

    1G的内存已经不小了,检查下程序,大数据量操作的时候,一定要清理list,list.clear()。