在.NET透视图中:
我对Java应用程序有一个非常奇怪的问题.
基本上它是一个使用玉兰(一个cms系统)的网页,在生产环境中有4个实例可用.有时CPU在java进程中达到100%.
所以,第一种方法是进行线程转储,并检查有问题的线程,我发现的是奇怪的:
"GC task thread#0 (ParallelGC)" prio=10 tid=0x000000000ce37800 nid=0x7dcb runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0x000000000ce39000 nid=0x7dcc runnable
Run Code Online (Sandbox Code Playgroud)
好吧,这很奇怪,我从来没有像这样的垃圾收集器,所以接下来我们做的是激活JMX并使用jvisualvm检查机器:堆内存使用率非常高(95%).
天真的方法:增加内存,所以问题需要更多的时间才能在重新启动的服务器上出现,结果,内存增加(6 GB!)问题出现在重新启动后20小时,而其他服务器上的内存较少(4GB!)运行了10天,这个问题还需要几天才能重新出现.此外,我尝试使用服务器失败的apache访问日志,并使用JMeter将请求重播到本地服务器,以尝试重现错误...它也不起作用.
然后我更多地调查了日志以找到这个错误
info.magnolia.module.data.importer.ImportException: Error while importing with handler [brightcoveplaylist]:GC overhead limit exceeded
at info.magnolia.module.data.importer.ImportHandler.execute(ImportHandler.java:464)
at info.magnolia.module.data.commands.ImportCommand.execute(ImportCommand.java:83)
at info.magnolia.commands.MgnlCommand.executePooledOrSynchronized(MgnlCommand.java:174)
at info.magnolia.commands.MgnlCommand.execute(MgnlCommand.java:161)
at info.magnolia.module.scheduler.CommandJob.execute(CommandJob.java:91)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
另一个例子
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOf(Arrays.java:2894)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:117)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:407)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at java.lang.StackTraceElement.toString(StackTraceElement.java:175)
at java.lang.String.valueOf(String.java:2838)
at java.lang.StringBuilder.append(StringBuilder.java:132)
at java.lang.Throwable.printStackTrace(Throwable.java:529)
at org.apache.log4j.DefaultThrowableRenderer.render(DefaultThrowableRenderer.java:60) …Run Code Online (Sandbox Code Playgroud) 我试图检测我的一些Java代码以确保对象被正确地进行垃圾收集,并且我发现令人惊讶的是它并没有像我预期的那样经常被调用.
我现在想知道这是因为错误的仪器还是我需要解决的实际内存泄漏.VisualVM分析器似乎表明了前者.
令人担忧的情况是我有一个处理请求的线程,并且在请求中创建了数千个临时对象.有时,此线程写入的套接字意外关闭,线程遇到异常并死亡.
当线程死亡时,似乎不会在这些对象上调用.finalize().这是不相信我的仪器的原因吗?
如何使用JProfiler在java中查找内存泄漏?过去一周我一直在JProfiler工作,在Web应用程序中查找内存泄漏.我阅读了一些手册并看了一些文章,它说看到所有对象和分配对象视图中的内存使用情况,并使用分配热点,你可以找到内存泄漏.我查看了它,发现了char,string,bytes使用的大量内存.由于我是一个更新鲜的我不知道如何计算这个并解决内存泄漏.请帮帮我..
提前致谢...
我在VPS上有tomcat web应用程序,tomcat有时(大约每月一次)在catalina.out中崩溃并出现以下错误:
Java HotSpot(TM)64位服务器VM警告:异常java.lang.OutOfMemoryError发生将调度信号SIGTERM发送到处理程序 - 可能需要强制终止VM.
以下是我的配置的一些细节:
VPS:debian-5.0-x86_64
RAM:2.5 gb,
虚拟处理器:8
硬盘:60GB硬盘 - 70%免费
Tomcat 7.0
java -version:
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.13) (6b18-1.8.13-0+squeeze1)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
Run Code Online (Sandbox Code Playgroud)Java参数:-Xms512m -Xmx1024m
我在该服务器上也有Apache-PHP.
我正在使用Munin监视服务器负载,它向我显示内存和CPU使用率始终稳定,并且在崩溃之前没有任何增加.
我也通过java.lang.Runtime类记录java内存使用情况,它显示jvm总是使用max200Mb内存并且在崩溃之前没有增加.崩溃前的最后一个日志是40秒前,那个时间使用的内存是:152Mb.
我的Web应用程序还运行6-7个线程,用于从不同的公共API收集数据.这些线程在tomcat启动时启动,并且它们始终以定期休眠运行.
你能告诉我它崩溃的原因吗?我怎么才能找到原因?
我一直试图在我的应用程序中找到内存泄漏一周,但没有任何成功.我尝试进行堆转储并使用jhat查看转储并追踪内存泄漏.
这是最好的方法吗?什么是使用堆转储追踪内存泄漏的最佳方法.
感谢您的帮助.
使用的VM: java版"1.6.0_25"Java(TM)SE运行时环境(版本1.6.0_25-b06)Java HotSpot(TM)64位服务器VM(版本20.0-b11,混合模式)
JVM选项: -Xmx1600m -XX:+ UseParallelGC -XX:MaxPermSize = 256m -Xms1600m -XX:+ HeapDumpOnOutOfMemoryError -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -verbose:gc -Xloggc:/tmp/gc.log
OOME Stack trace:无法得到这个.内核因内存不足错误而终止进程.
GC日志:最后几行
48587.245: [GC [PSYoungGen: 407168K->37504K(476160K)] 506729K->137065K(1568448K), 3.0673560 secs] [Times: user=3.53 sys=0.00, real=3.07 secs]
50318.617: [GC [PSYoungGen: 444224K->37536K(476416K)] 543785K->175177K(1568704K), 3.6635990 secs] [Times: user=3.70 sys=0.00, real=3.67 secs]
50453.841: [GC [PSYoungGen: 70092K->2912K(476672K)] 207734K->178513K(1568960K), 1.0164250 secs] [Times: user=1.29 sys=0.00, real=1.02 secs]
50454.858: [Full GC (System) [PSYoungGen: 2912K->0K(476672K)] [PSOldGen: 175601K->137776K(1092288K)] 178513K->137776K(1568960K) [PSPermGen: 60627K->60627K(74368K)], 2.0082140 secs] [Times: user=2.09 sys=0.00, …Run Code Online (Sandbox Code Playgroud) 对于JAVA应用程序,我还是个新手,但是参与了开发一个需要多线程的相当复杂的JAVA(8)应用程序。我自己和另一个开发人员一直遇到一个问题,该应用程序在运行一段时间后仍会耗尽内存。
最初,我们为应用程序提供了64GB的内存,但是几个小时后,它的内存不足,崩溃并重新启动。只是一遍又一遍地做下去。上下文;该应用程序从消息传递系统(ActiveMQ)接收消息,并且必须通过调用各种数据源以获取值来从消息的meta中构建XML文件。从字面上看,可能需要处理数百万条消息,因此我们开发了一个多线程系统,每个线程处理一条消息,并为应用程序提供40个线程。
但是,由于它不断接收消息,因此总体内存消耗随着时间的推移而增加。我觉得垃圾回收器没有被我们正确地利用?
因此,目前我们有一个父线程:
(new Thread(new ReportMessageConsumer(config, ""))).start();
然后在ReportMessageConsumer中,我们有X个线程设置,因此在当前设置中为40个。因此,这将属于这一组。构建完XML并完成线程处理后,我们如何有效地杀死该线程并强制垃圾回收器释放该内存,以便我们随后可以创建一个新的干净线程来接收另一条消息?
我不知道如何回答这个问题。相反,我告诉他们我没有在Web 应用程序中看到任何可能发生内存泄漏的实际代码/情况。我还告诉他,如果创建的对象太多并且这些对象超出范围,GC会负责回收内存。
我的问题是(1)我的回答是否足够好?(2) 能否请您举一个 Web 和/或非 Web 环境中 Java 内存泄漏的实际示例?
谢谢
java ×7
memory-leaks ×4
memory ×2
.net ×1
com-interop ×1
dump ×1
heap ×1
jprofiler ×1
jvm-crash ×1
magnolia ×1
performance ×1
tomcat7 ×1