Tag: 内存泄漏

为什么PermGen的空间越来越大?

我已经阅读了一些文章,我理解了以下内容(如果我错了,请纠正我和/或编辑问题): java堆是这样分段的: 年轻一代:创建的对象在这里,这部分经常和廉价的垃圾收集 老一代:在Young年代的垃圾收集中存活的对象进入这里,这个区域垃圾收集频率较低,并且使用更多CPU要求的过程/算法(我相信它被称为标记扫描) 编辑:如其他用户所述,PermGen不是名为heap的区域的一部分 PermGen:这个区域充满了你的app类元数据和许多其他不依赖于应用程序使用的东西。 所以,知道这一点……为什么我的PermGen空间会在应用程序负载过重时增长? 对于我之前所说的这个空间不应该在应用程序加载的情况下逐渐填充,但正如我在开始时所说的那样,我可能错误地做了一些假设。 事实上,如果PermGen空间不断增长,有没有一种垃圾收集或重置的方法呢?

“不要将Android上下文类放在静态字段中; 这是内存泄漏“ – 静态视图的Lint警告

有类似标题的问题,但它们都是关于构造函数中的Context。 有物品和一些其他视图的RecyclerView存在播放\暂停按钮。 此类允许此视图一次只播放一个文件。 如果正在播放view_1并且您在view_2按下播放 – 将播放file_2。 这个类中有一个ImageButton mPlayPauseButton。 需要将view_1的ViewButton设置为paused_state。 并将view_2的ViewButton设置为playing_state。 皮棉警告 不要将Android上下文类放在静态字段中; 这是一个内存泄漏(并且还会中断Instant Run)静态字段会泄漏上下文。 public class CommentsAudioPlayer { private static MediaPlayer mPlayer; private static ImageButton mPlayPauseButton; private static void init(ImageButton imageButton){ mPlayer = new MediaPlayer(); mPlayPauseButton = imageButton; } public static void startPlaying(String dataSource, ImageButton imageButton) { init(imageButton); try { mPlayer.setDataSource(dataSource); mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override […]

Java内存泄漏 – 在程序终止时清除?

这似乎是一个是或否的问题,我希望它能在某个地方得到解答,但我当然找不到它。 java中的内存泄漏并不像C或C ++这样的语言那样经常发生,但它们可能会发生。 大多数操作系统将清除程序终止时分配的内存,但某些情况除外,例如共享内存。 当JVM退出时,这仍然是正确的吗? 如果我无意中在Java中创建内存泄漏,它将被JVM或Linux或Windows操作系统清除吗?

我需要关闭音频片段吗?

有一个处理实时数据的应用程序,并且当某个事件发生时应该发出蜂鸣声。 触发事件可以每秒发生多次,并且如果在另一个事件触发时蜂鸣声已经播放,则代码应该忽略它(而不是中断当前的蜂鸣声并开始新的蜂鸣声)。 这是基本代码: Clip clickClip public void prepareProcess() { super.prepareProcess(); clickClip = null; try { clipFile = new File(“C:/WINDOWS/Media/CHIMES.wav”); ais = AudioSystem.getAudioInputStream(clipFile); clickClip = AudioSystem.getClip(); clickClip.open(ais); fileIsLoaded = true; } catch (Exception ex) { clickClip = null; fileIsLoaded = false; } } public void playSound() { if (fileIsLoaded) { if ((clickClip==null) || (!clickClip.isRunning())) { try […]

与堆使用相比,Java应用程序的巨大系统内存使用量

我有像java框架这样的微服务。 许多java进程在一个盒子上运行(ubuntu 14.04.4 LTS)。 java进程使用很多系统内存,因此交换空间被大量使用。 jstat gc报告不解释系统内存使用情况。 所有java进程都使用参数运行 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 强制JVM将内存返回给系统。 没有参数,问题仍然存在。 一些java组件使用nashorn引擎来编写一些function。 有人可以解释这里的行为吗? 是否有任何jvm patameters限制巨大的系统内存使用? 如何命令操作系统对jvm的内存分配更具限制性? 一些数据: 组件A(与nashorn) 最佳: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2400 xxxxxx 20 0 13.933g 807496 7332 S 0.0 2.5 4180:15 java jstat -gc 2400: S0C S1C S0U S1U EC EU […]

梦魇java泄漏……用循环和jdbc

当我在探查器中运行以下代码时,我得到一个char []和byte [],直到程序崩溃,因为java堆内存不足exception。 有人可以告诉我为什么吗? 也许我正在做一些根本错误的事情。 package testleak; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.swing.Timer; public class TestLeak { static String DB_USERNAME = “userName”; static String DB_SUBSCRIPTION_EXPIRATION = “subscriptionExpiration”; static String DB_REMOTE_ACCESS_ENABLED = “remoteAccessEnabled”; static String DB_LOCAL_USERNAME = “root”; static String DB_LOCAL_PASS = “root”; public […]

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

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

使用Otto进行内存泄漏的Leakcanary报告

继续我的上一个问题 ,这是我无法摆脱的第二次内存泄漏.. 我读到我需要根据Activity和Fragment生命周期注册和取消注册我的静态Otto总线,所以我添加了注册并取消注册到onStop和onStart的调用…有一个触发事件然后由某些片段接收的按钮在Viewpager内部给我以下内存泄漏: D/LeakCanary﹕ In com.doesnthaveadomain.leo.calendartracker:1.0:1. D/LeakCanary﹕ * com.doesnthaveadomain.leo.calendartracker.MyFragment has leaked: D/LeakCanary﹕ * GC ROOT static com.doesnthaveadomain.leo.calendartracker.MyBus.BUS D/LeakCanary﹕ * references com.squareup.otto.Bus.handlersByType D/LeakCanary﹕ * references java.util.concurrent.ConcurrentHashMap.table D/LeakCanary﹕ * references array java.util.concurrent.ConcurrentHashMap$Node[].[3] D/LeakCanary﹕ * references java.util.concurrent.ConcurrentHashMap$Node.val D/LeakCanary﹕ * references java.util.concurrent.CopyOnWriteArraySet.al D/LeakCanary﹕ * references java.util.concurrent.CopyOnWriteArrayList.elements D/LeakCanary﹕ * references array java.lang.Object[].[0] D/LeakCanary﹕ * references com.squareup.otto.EventHandler.target D/LeakCanary﹕ * leaks com.doesnthaveadomain.leo.calendartracker.MyFragment […]

是否有可能“看到”垃圾收集的对象图?

我有一个泄漏内存的Java应用程序。 我知道在垃圾收集过程中哪些对象没有被释放,但我无法确定引用它们的内容。 是否可以对JVM内部保存的对象图具有某种可见性? 否则可以找出哪些对象引用另一个对象?

为什么要处理超出范围的java.awt.Window?

我在我们的应用程序中发现的一个内存泄漏是java.awt.Window.allWindows私有静态字段,它跟踪实例化的每个Window 。 我们创建,使用,然后忘记了对话框,期望这些对话框会消失并被垃圾收集。 这个私有字段无限期地将它们保留在范围内,直到在它们上调用dispose()方法。 根据定义,当他们超出范围时,我们不能这样做。 我不明白为什么这是这样设计的。 与垃圾收集的精神相反,当我完成Window对象时,必须明确地让系统知道。 显然我已经完成了它,因为它超出了范围。 我理解dispose()方法正在做什么:摆脱系统对等对象。 我确实理解这是在Java之外,你需要一些方法来做到这一点,并且Swing不应该只是失去对这些对象的跟踪,否则它会有内存泄漏。 但是,当我永远不再使用它时,通过永久保持对我的Window的引用来实现什么? 有人可以解释为什么这是必要的吗?