相关疑难解决方法(0)

解读"记忆泄漏"

在.NET透视图中:

  • 什么是内存泄漏
  • 如何确定您的应用程序是否泄漏?有什么影响?
  • 你怎么能防止内存泄漏?
  • 如果您的应用程序有内存泄漏,它会在进程退出或被杀死时消失吗?或者,即使在流程完成后,应用程序中的内存泄漏也会影响系统上的其他进程?
  • 那么通过COM Interop和/或P/Invoke访问的非托管代码呢?

.net performance memory-leaks com-interop

170
推荐指数
14
解决办法
1万
查看次数

Java垃圾收集器和内存的问题

我对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 memory garbage-collection magnolia

9
推荐指数
1
解决办法
5082
查看次数

你能指望.finalize()被调用吗?

我试图检测我的一些Java代码以确保对象被正确地进行垃圾收集,并且我发现令人惊讶的是它并没有像我预期的那样经常被调用.

我现在想知道这是因为错误的仪器还是我需要解决的实际内存泄漏.VisualVM分析器似乎表明了前者.

令人担忧的情况是我有一个处理请求的线程,并且在请求中创建了数千个临时对象.有时,此线程写入的套接字意外关闭,线程遇到异常并死亡.

当线程死亡时,似乎不会在这些对象上调用.finalize().这是不相信我的仪器的原因吗?

java garbage-collection

8
推荐指数
1
解决办法
449
查看次数

如何使用JProfiler在java中查找内存泄漏?

如何使用JProfiler在java中查找内存泄漏?过去一周我一直在JProfiler工作,在Web应用程序中查找内存泄漏.我阅读了一些手册并看了一些文章,它说看到所有对象和分配对象视图中的内存使用情况,并使用分配热点,你可以找到内存泄漏.我查看了它,发现了char,string,bytes使用的大量内存.由于我是一个更新鲜的我不知道如何计算这个并解决内存泄漏.请帮帮我..

提前致谢...

java memory-leaks memory-management jprofiler

8
推荐指数
1
解决办法
2万
查看次数

我得到"Java HotSpot(TM)64位服务器VM警告:异常java.lang.OutOfMemoryError发生调度信号SIGTERM到处理程序"tomcat中的错误

我在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启动时启动,并且它们始终以定期休眠运行.

你能告诉我它崩溃的原因吗?我怎么才能找到原因?

java out-of-memory jvm-crash tomcat7

8
推荐指数
1
解决办法
1万
查看次数

了解Java堆转储

我一直试图在我的应用程序中找到内存泄漏一周,但没有任何成功.我尝试进行堆转储并使用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 memory heap memory-leaks dump

3
推荐指数
1
解决办法
2万
查看次数

JAVA多线程,内存泄漏,垃圾收集器

对于JAVA应用程序,我还是个新手,但是参与了开发一个需要多线程的相当复杂的JAVA(8)应用程序。我自己和另一个开发人员一直遇到一个问题,该应用程序在运行一段时间后仍会耗尽内存。

最初,我们为应用程序提供了64GB的内存,但是几个小时后,它的内存不足,崩溃并重新启动。只是一遍又一遍地做下去。上下文;该应用程序从消息传递系统(ActiveMQ)接收消息,并且必须通过调用各种数据源以获取值来从消息的meta中构建XML文件。从字面上看,可能需要处理数百万条消息,因此我们开发了一个多线程系统,每个线程处理一条消息,并为应用程序提供40个线程。

但是,由于它不断接收消息,因此总体内存消耗随着时间的推移而增加。我觉得垃圾回收器没有被我们正确地利用?

因此,目前我们有一个父线程:

(new Thread(new ReportMessageConsumer(config, ""))).start();

然后在ReportMessageConsumer中,我们有X个线程设置,因此在当前设置中为40个。因此,这将属于这一组。构建完XML并完成线程处理后,我们如何有效地杀死该线程并强制垃圾回收器释放该内存,以便我们随后可以创建一个新的干净线程来接收另一条消息?

java multithreading garbage-collection

3
推荐指数
1
解决办法
1884
查看次数

在一次采访中,有人问我如何检测 Java 中的内存泄漏?

我不知道如何回答这个问题。相反,我告诉他们我没有在Web 应用程序中看到任何可能发生内存泄漏的实际代码/情况。我还告诉他,如果创建的对象太多并且这些对象超出范围,GC会负责回收内存。

我的问题是(1)我的回答是否足够好?(2) 能否请您举一个 Web 和/或非 Web 环境中 Java 内存泄漏的实际示例?

谢谢

java garbage-collection memory-leaks memory-management

2
推荐指数
1
解决办法
4359
查看次数