首页 文章

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

提问于
浏览
3

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

Good Reference StackOverflow Question: Which GC Policy to Use

眼镜:

  • 服务器环境:Websphere版本7

  • GC策略:默认(optthruput)

  • Java 1.5

  • 堆:8 GB

  • 在VM中运行

  • 分析工具:App Dynamics

Preliminary Analysis:

  • 我假设内存泄漏,但垃圾收集看起来没问题,因为它回收内存

  • 本机内存异常让我觉得VM外部的内存已经耗尽,但我不知道如何 .

Attached Screenshot:

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

enter image description here

Exception:

EJB抛出了一个意外的(未声明的)ejb异常数据:java.lang.OutOfMemoryError:在com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1658)的garbagecollection.mycode.test中耗尽的本机内存在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)at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125)at 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.WebAp上的ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125) pFilterChain._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位于com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:875)的com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java)中的.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91) :1592)com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:453)at at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:515)at com.ibm.ws.http.channel.inbound.impl.Http InboundLink.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.ResultHandler的com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) .complete(ResultHandler.java:204)com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)com的com.ibm.io.async.ResultHandler $ 2.run(ResultHandler.java:905) .ibm.ws.util.ThreadPool $ Worker.run(ThreadPool.java:1646)

1 回答

  • 2

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

    没有更多信息,很难说是造成这种特殊错误的原因 . 我假设你机器上至少有12 GB的可用内存?否则,您只是运行一个太大而无法使用的堆记忆 .

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

    • 本机(JNI)代码泄漏

    • 直接分配了许多 ByteBuffer s

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

    麻烦的第一步是检查过程大小与可能的过程大小限制 . 如果没有实际的泄漏,你可以简单地遇到这样的限制 .

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

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

    如果失败,您将不得不求助于本机内存泄漏故障排除工具 . 那是另一个问题 .

相关问题