问题:退出本机内存异常,并想知道过多的垃圾收集是否会导致这种情况发生?关于GC政策或调整的任何建议都会有所帮助。我不确定我还有什么保证会改变。
好参考StackOverflow问题: Which GC Policy to Use
规格:
初步分析:
附上屏幕截图:
1.1 - 4小时的堆利用期。每个小绿色垃圾都可以代表一个主要的垃圾收集点。 1.2 GC时间花费在上图中。 1.3内存不足异常期间堆利用率的样子。
例外:
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)
答案 0 :(得分:2)
您收到的错误消息表明本机内存存在问题,即内存在堆外。垃圾收集器不负责堆外存储器,为什么不能使用垃圾收集器设置来影响此错误。过多的垃圾收集不应导致本机内存问题(当然,除非GC中存在错误)。
如果没有更多信息,很难说是导致这一特定错误的原因。我假设你机器上至少有12 GB的可用内存?否则,您只是运行一个对可用内存来说太大的堆。
Java中可能耗尽本机内存的一些例子:
本机(JNI)代码泄漏
直接分配许多ByteBuffer
s
或者也许没有泄漏,这种行为是您的应用程序所期望的,您只需要允许更大的进程或购买更多的内存。
麻烦的第一步是检查流程大小与可能的流程大小限制。你可以在没有实际泄漏的情况下直接遇到这样的限制。
如果这不是问题,请跟踪进程大小,特别是与可用内存相关的内容,以查看是否存在“漏洞”行为。
如果您确实认为自己有本机内存泄漏,请确定使用您正在使用的JNI的库(例如JDBC驱动程序),并尝试将其替换为仅Java版本。另外,请检查此类库中的已知内存泄漏错误以及JVM版本和WebSphere版本。
如果失败,则必须使用本机内存泄漏故障排除工具。那是另一个问题。