WebSphere 7 - 过多的垃圾收集会导致内存不足吗?

时间:2015-05-11 17:47:38

标签: java memory-leaks garbage-collection websphere

问题:退出本机内存异常,并想知道过多的垃圾收集是否会导致这种情况发生?关于GC政策或调整的任何建议都会有所帮助。我不确定我还有什么保证会改变。

好参考StackOverflow问题: Which GC Policy to Use

规格:

  • 服务器环境:Websphere版本7
  • GC政策:默认(optthruput)
  • Java 1.5
  • 堆:8 GB
  • 在VM中运行
  • 分析工具:App Dynamics

初步分析:

  1. 我假设内存泄漏但垃圾收集看起来没问题,因为它回收了内存
  2. 本机内存异常让我觉得VM外部的内存已经耗尽,但我不确定如何。
  3. 附上屏幕截图:

    1.1 - 4小时的堆利用期。每个小绿色垃圾都可以代表一个主要的垃圾收集点。 1.2 GC时间花费在上图中。 1.3内存不足异常期间堆利用率的样子。

    enter image description here

    例外:

      

    EJB抛出了一个意外的(未声明的)ejb异常数据:   java.lang.OutOfMemoryError:本机内存耗尽       at garbagecollection.mycode.test at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1658)     在   com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1598)     在   com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:149)     在   com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)     在   com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125)     在   com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)     在   com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125)     在   com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)     在   com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125)     在   com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:80)     在   com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)     在   com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:935)     在   com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:503)     在   com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181)     在   com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)     在   com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:875)     在   com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1592)     在   com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)     在   com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:453)     在   com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:515)     在   com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:306)     在   com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)     在   com.ibm.ws.ssl.channel.impl.SSLReadServiceContext $ SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1784)     在   com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)     在   com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)     在   com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)     在com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)at at   com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)at at   com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)     在com.ibm.io.async.ResultHandler $ 2.run(ResultHandler.java:905)at   com.ibm.ws.util.ThreadPool $ Worker.run(ThreadPool.java:1646)

1 个答案:

答案 0 :(得分:2)

您收到的错误消息表明本机内存存在问题,即内存堆外。垃圾收集器不负责堆外存储器,为什么不能使用垃圾收集器设置来影响此错误。过多的垃圾收集不应导致本机内存问题(当然,除非GC中存在错误)。

如果没有更多信息,很难说是导致这一特定错误的原因。我假设你机器上至少有12 GB的可用内存?否则,您只是运行一个对可用内存来说太大的堆。

Java中可能耗尽本机内存的一些例子:

  • 本机(JNI)代码泄漏

  • 直接分配许多ByteBuffer s

或者也许没有泄漏,这种行为是您的应用程序所期望的,您只需要允许更大的进程或购买更多的内存。

麻烦的第一步是检查流程大小与可能的流程大小限制。你可以在没有实际泄漏的情况下直接遇到这样的限制。

如果这不是问题,请跟踪进程大小,特别是与可用内存相关的内容,以查看是否存在“漏洞”行为。

如果您确实认为自己有本机内存泄漏,请确定使用您正在使用的JNI的库(例如JDBC驱动程序),并尝试将其替换为仅Java版本。另外,请检查此类库中的已知内存泄漏错误以及JVM版本和WebSphere版本。

如果失败,则必须使用本机内存泄漏故障排除工具。那是另一个问题。