Tag: 内存泄漏

找到浪费记忆的课程

几个月前我在Google Play上发布了一个应用程序,我的大多数用户对我的应用程序的内存使用情况都有很大的问题,这是真的,因为当我从“正在运行的应用程序”选项卡检查我的内存使用情况时,我看到了需要80~110MB的内存,如下图所示: 为了找到引起这个问题的类/活动或代码片段,我发现MAT(内存分析工具)插件很有用,但它确实让我感到困惑,请考虑下面的图像: 已用内存的总大小为9.8MB,但“正在运行的应用程序”选项卡同时显示80MB ! 另一个问题是直方图, byte[]对象的浅堆太高。 这是正常的吗? 另外,当我调试一些Google项目时,字节值总是太高了! 那么我怎样才能找到使用这些内存的内容呢?

Android内存泄漏,EMA可疑:“byte ”由“”加载

我正在写一个小的单活动Android应用程序,并得到内存泄漏错误,因为我找不到原点。 首先,应用程序计算基本内容并以结构化方式显示结果。 计算是微不足道的,虽然有一些图像,但它们大约有50个图标,总共少于4MB。 我已经安装了Eclipse Memory Analyzer并检查了它的堆转储,Leak Suspects Report说: 问题可疑1:由加载的“byte []”的477个实例占用78.116.240(76,46%)个字节。 dominator_tree 我既不知道那些字节数组是什么,也不知道GC根或任何东西,因为数组在统治者树中没有父母。 我不经常为Android编程,我拼命想弄清楚,从今天起这里发生了什么。 当我使用应用程序并观察ADM中使用的堆大小/%时,我直接以80%的使用量开始并随着我的使用而变大。 (也显示1字节数组(byte [],boolean []))直到应用程序在AVD上崩溃,我的真实设备可以处理它更长一点。 我知道我可以把尺寸做得更大,但这对我来说没有解决方案,因为我认为我从一开始就遇到了这个问题,现在它刚刚达到临界点。

使用ScheduledExecutorService时,Java webapp内存泄漏

我的Tomcat 7报告我的webapp可能存在内存泄漏 SEVERE: The web application [/mywebapp] appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. 我的webapp中有一个长时间运行的任务,当webapp启动时会被初始化。 public class MyContextListener implements ServletContextListener{ Scheduler scheduler = null; public MyContextListener(){ scheduler = new Scheduler(); } @Override public void contextDestroyed(ServletContextEvent arg0) { scheduler.stop(); } […]

Java应用程序内存使用

我一直在编写一个小的java应用程序(我的第一个!),目前只做了一些事情。 目前,它运行Main类,它启动一个gui类(我编写的一个扩展JFrame的类,只包含一个JTextArea),一个通过大约40kb的BufferedInputStream加载本地文件的类,以及一个从一个类加载一个条目的类。 Java属性文件。 一切都运行得非常好,然而,我正在看Windows任务管理器,我注意到一些让我感到奇怪的东西。 当我启动应用程序时,RAM使用量会在加载本地文件时跳转到大约40MB,并从中提取一些值以显示在JTextArea中,这对我来说是正常的,因为JVM,Java基类等等。但是,当应用程序完成加载文件时,它只是闲置,因为我目前还没有做任何其他事情。 当它处于空闲状态时,只要窗口处于活动状态,应用程序的内存使用量就会每秒开始上升10-20kb。 这让我很奇怪。 如果我点击另一个程序使这个程序成为非活动窗口,内存仍会上升,但速度要慢得多(每3-5秒约10kb)。 我没有测试过它会走多远,但这让我觉得很奇怪。 这是正常的Java行为吗? 我想我的代码可能会泄漏内存,但我不确定如何。 我确实关闭了我正在使用的BufferedInputStream,我看不出还有什么会导致这种情况。 如果我的解释没有意义,我很抱歉,但我很感激任何人可能有的见解和/或指示。 更新: 根据建议,我基本上将我的应用程序剥离到Main类,它只调用gui类。 gui类只扩展JFrame并设置窗口大小,关闭操作和可见属性。 随着这些变化,内存仍然以10-20kb增长,但速度较慢。 这与我收到的其他建议相结合,让我相信这只是Java。 如果我发现其他有趣的东西,我将继续玩它,让大家都知道。

如何识别JNI全局引用内存泄漏的原因?

我正在使用Tomcat,在停止我的Web应用程序之后,仍然会引用我的Web应用程序的类加载器实例。 结果是不会释放大量的内存(主要与静态数据相关)。 迟早会导致OutOfMemoryError 。 我进行了heap dump ,我意识到它由JNI全局引用保存 , 可以防止类加载器被垃圾回收 。 我的应用程序不使用JNI 。 我也没有使用Apache Tomcat Native Library 。 我正在使用Sun / Oracle JDK。 我想跟踪这个全球参考的原因/来源。 (我的猜测是JVM内部引用了类加载器 – 但是为什么/在哪里?)。 题: 有哪些方法/工具集可以实现这一目标? UPDATE 似乎bestsss是正确的,jvm调试模式引入了JNI全局引用。 这帮助了我,但它没有回答这个问题所以我仍然很想回答一个可能对将来有帮助的问题。

JDBC4Connection中的内存泄漏

我试图在我们的一个Java守护进程中捕获内存泄漏,在转储内存并通过Memory Analyzer Tool进行分析之后,注意到大部分泄漏是由JDBC4Connection引起的: 10 instances of “com.mysql.jdbc.JDBC4Connection”, loaded by “sun.misc.Launcher$AppClassLoader @ 0x2aaab620ed00” occupy 858,283,752 (81.55%) bytes. Biggest instances: * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad820 – 87,110,160 (8.28%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64af520 – 86,730,408 (8.24%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad0e0 – 86,584,048 (8.23%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab64aede0 – 86,488,800 (8.22%) bytes. * com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f5320 – […]

Java,ResultSet.close(),PreparedStatement.close() – 为什么?

在我的网络应用程序中,我广泛使用数据库。 我有一个抽象的servlet,需要数据库连接的所有servlet都可以inheritance。 该抽象servlet创建数据库连接,调用抽象方法,该方法必须由inheritance的servlet覆盖以执行其逻辑,然后关闭连接。 我不使用连接池,因为我的应用程序将拥有非常有限的用户和操作。 我的问题是,如果我没有关闭我inheritance的servlet创建的ResultSet , PreparedStatement和Statement ,如果创建它们的Connection总是关闭的话,会发生什么最糟糕的事情?

heapdump上对象的保留大小是多少?

我最近在Netbeans(6.7)中增加了对Profiler的使用,这是一个很棒的工具。 不过我有一个问题。 在进行堆转储时,在摘要页面(期望窗口)上可以“按保留大小找到最大的对象”。 这个值是什么以及它如何用于分析内存使用情况?

在Apache Tomcat中运行的Web应用程序中查找内存泄漏的建议

我有一个Axis2 Web服务刚刚落在客户端站点上,它抛出以下exception:java.lang.OutOfMemoryError:无法创建新的本机线程 我只是将日志从网站上删除但是在过渡期间,我想知道是否有人知道我可以使用任何监视工具来查找在Tomcat中运行的Web应用程序中的内存泄漏。

在Java中突发内存使用

我试图在Java中处理正确的内存使用和垃圾收集。 无论如何我都不是新手程序员,但在我看来,一旦Java接触到某些内存,它就永远不会被其他应用程序使用。 在这种情况下,您必须确保峰值内存永远不会太高,或者您的应用程序将持续使用峰值内存使用量。 我写了一个小样本程序试图certificate这一点。 它基本上有4个按钮…… 填充类范围变量BigList = new ArrayList()包含大约25,000,000个长字符串项。 调用BigList.clear() 重新BigList = new ArrayList()列表 – BigList = new ArrayList()再次(缩小列表大小) 对System.gc()调用 – 是的,我知道这并不意味着GC会真正运行,但这就是我们所拥有的。 接下来,我在Windows,Linux和Mac OS上进行了一些测试,同时使用默认任务监视器来检查进程报告的内存使用情况。 这是我发现的…… Windows – 抽取列表,调用clear,然后多次调用GC不会减少内存使用量。 但是,使用new重新分配列表然后多次调用GC会将内存使用量减少回初始级别。 IMO,这是可以接受的。 Linux (我使用Mint 11发行版与Sun JVM) – 与Windows相同的结果。 Mac OS – 我遵循了与上面相同的步骤,但即使重新初始化列表调用GC似乎也没有效果。 该程序将使用数百MB的RAM,即使我没有内存。 任何人都可以向我解释这个吗? 有些人告诉我一些关于“堆”记忆的东西,但我仍然不完全理解它,我不确定它是否适用于此。 据我所知,我不应该看到我在Windows和Linux上的行为。 这只是Mac OS的活动监视器测量内存使用情况的方式还是有其他不同之处? 我宁愿没有我的程序闲置大量的RAM使用。 感谢您的见解。