相关疑难解决方法(0)

如何估计JVM是否有足够的可用内存用于特定数据结构?

我有以下情况:有几台机器组成一个集群.客户端可以加载数据集,我们需要选择将加载数据集的节点,如果没有一台机器可以适合数据集,则拒绝加载/避免OOM错误.

我们当前所做的事情:我们现在entry count在数据集中估算memory to be usedas entry count * empirical factor(手动确定).然后检查它是否低于空闲内存(得到Runtime.freeMemory()),如果是,则加载它(否则重做其他节点上的进程/报告没有空闲容量).

这种方法的问题是:

  • empirical factor需要被重新和手动更新
  • freeMemory有时可能会因为一些未清理的垃圾而少报(这可以通过System.gc在每次这样的通话之前运行来避免,但这会减慢服务器的速度并且还可能导致过早的促销)
  • 另一种方法是"只是尝试加载数据集"(如果抛出OOM则返回)但是一旦抛出OOM,你可能会破坏在同一个JVM中运行的其他线程,并且没有优雅的方法从中恢复.

这个问题有更好的解决方案吗?

java memory-management out-of-memory

12
推荐指数
1
解决办法
380
查看次数

System.gc()导致Activity的第二次启动减慢

我遇到了一个非常奇怪的现象(测试设备:HTC Desire HD,Android 2.3.5).我知道这System.gc()是不必要的和沮丧的,我不会尝试另外建议,但关键是它不应该引起问题(即它最多应该是无用).

我有一个GLSurfaceView在其视图层次结构中包含a的应用程序.该GLSurfaceView实例化和增加Activity.onCreate().通常,应用程序的工作方式如下:

  1. 用户启动应用程序并转到mainmenu
  2. 用户选择该设置一个MainMenu项目GLSurfaceViewView.VISIBLE
  3. 用户使用内置游戏进行游戏 GLSurfaceView
  4. 用户进入mainmenu并退出活动(=> Activity.finish()被调用)

Activity.onPause()看起来像这样:

mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,一切正常.但是,在我添加以下代码后出现问题onPause()(对于用户从主菜单退出游戏的情况):

mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread    
if (isFinishing()) {
    System.gc();
}
Run Code Online (Sandbox Code Playgroud)

详细说明:如果Activity第一次 …

android garbage-collection android-layout android-view

11
推荐指数
1
解决办法
2661
查看次数

Java中是否存在不产生垃圾的HashMap实现?

我注意到,java.util.HashMap当我在高性能系统上使用GC时会产生垃圾,它基本上是从网络读取的选择器.是否有替代java.util.HashMap(即,甚至不需要实现java.util.Map,换句话说,它可以有自己的API),我可以使用,不会留下任何垃圾?


GARBAGE =超出范围的对象,必须由GC收集.


对于@ durron597:

public static void main(String[] args) {

    Map<String, String> map = new HashMap<String, String>();

    while(true) {

        map.put("foo1", "bah1");
        map.put("foo2", "bah2");

        map.remove("foo1");

        Iterator<String> iter = map.keySet().iterator();

        while(iter.hasNext()) {
            iter.next();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用-verbose:gc运行它,看看会发生什么...... :)

java collections hashtable real-time hashmap

11
推荐指数
2
解决办法
2079
查看次数

强制在Java中释放大型缓存对象

我使用一个大的(数百万)条目hashmap来缓存算法所需的值,关键是两个对象的组合作为long.由于它不断增长(因为地图中的键发生了变化,所以不再需要旧的),能够强行擦除其中包含的所有数据并在执行过程中重新开始会很好,有没有办法有效地执行在Java?

我的意思是释放相关的内存(大约1-1.5gb的hashmap)并从空的hashmap重新启动.

java garbage-collection

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

使用App时Java内存使用量会增加,但在不使用时不会减少

我有一个java应用程序,使用时会占用大量内存,但是当程序没有被使用时,内存使用量不会下降.

有没有办法强制Java释放这个内存?因为当时不需要这个内存,我可以理解保留少量内存,但Java只保留它曾经使用过的所有内存.它也会在以后重用这个内存,但必须有一种方法可以强制Java在不需要时释放它.

System.gc不起作用.

java memory memory-management

10
推荐指数
1
解决办法
3339
查看次数

图像出现内存错误

我在列表视图中显示图像并出现内存错误任何人都指导我这个问题的解决方案是我的代码

logcat的

ERROR/AndroidRuntime(1010): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
ERROR/AndroidRuntime(1010):     at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
ERROR/AndroidRuntime(1010):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:405)
ERROR/AndroidRuntime(1010):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:418)
ERROR/AndroidRuntime(1010):     at com.Adapters.AdapterTours.getView(AdapterTours.java:73)
ERROR/AndroidRuntime(1010):     at android.widget.AbsListView.obtainView(AbsListView.java:1409)
ERROR/AndroidRuntime(1010):     at android.widget.ListView.makeAndAddView(ListView.java:1745)
ERROR/AndroidRuntime(1010):     at android.widget.ListView.fillUp(ListView.java:700)
ERROR/AndroidRuntime(1010):     at android.widget.ListView.fillGap(ListView.java:646)
ERROR/AndroidRuntime(1010):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3399)
ERROR/AndroidRuntime(1010):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:2233)
ERROR/AndroidRuntime(1010):     at android.widget.ListView.onTouchEvent(ListView.java:3446)
ERROR/AndroidRuntime(1010):     at android.view.View.dispatchTouchEvent(View.java:3885)
ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
ERROR/AndroidRuntime(1010):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691)
ERROR/AndroidRuntime(1010):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125)
ERROR/AndroidRuntime(1010):     at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
ERROR/AndroidRuntime(1010):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675)
ERROR/AndroidRuntime(1010):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194)
ERROR/AndroidRuntime(1010):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1878)
ERROR/AndroidRuntime(1010): …
Run Code Online (Sandbox Code Playgroud)

android listview image-processing

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

如何显式执行垃圾回收

通过内置的垃圾收集,Java允许开发人员创建新对象,而无需明确担心内存分配和释放,因为垃圾收集器会自动回收内存以供重用.

AFAIK垃圾收集器通常在您的应用程序内存不足时运行.它包含一个图形,表示对象和孤立对象之间的链接可以被释放.

虽然我们有System.gc(),但如果您System.gc()在代码中编写,Java VM可能会或可能不会在运行时决定在该点进行垃圾收集,如本文中的System.gc()解释

所以我对java的垃圾收集过程有些怀疑.

  • 我想知道free()在C语言中是否存在这样的方法,我们可以在明确想要释放new运算符分配的内存部分时调用.

  • 也不会new因为这样做执行相同的操作malloc()calloc()

  • 是否有任何候补委员delete(),free(),malloc(),calloc()sizeof()在Java方法.

java android garbage-collection

9
推荐指数
2
解决办法
1330
查看次数

我如何明确清除字节[]

我正在创建新的字节数组,这些数组不是由GC收集的,而是存在于内存中并增加了专用字节.下面的代码每10秒执行一次.完成后如何明确清除变量?

byte[] outputMessage = new byte[10000];
//Do some work here
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection memory-leaks memory-management

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

JavaFX 线程崩溃

我有一个 JavaFX 应用程序,它可以在屏幕上为机器人(黑点)设置动画,并在它们去过的任何地方在浅灰色背景上绘制一条小白线(想想 Tron)。为此,我保留了机器人和所有白色像素的所有坐标。机器人的行为由实现 Runnable 的不同线程控制,并且可以在模拟运行时更改。机器人坐标存储在 HashMap 中,坐标是扩展 Point 的类,并使用双精度数来提高 x 和 y 值的内部计算精度。对于白点,我使用 HashMap,因为整数精度足以满足它们,因为它们不会移动并无限期地停留在屏幕上的 x 和 y 坐标处。

现在程序运行得很好,但是当存储白点点的 HashMap 增长时,应用程序的 JavaFX 线程崩溃的可能性就越来越大(想想看,更具体地说,它只是绘制机器人的画布。 )控件的滑块保持响应,迭代的文本字段和 HashMap 的大小不断更新。但没有任何动画,几秒钟后画布变成白色。增加 Thread.sleep(ms) 的 ms 可以使程序更加稳定,但速度已经非常慢了。而且,这种情况在我的慢速学校上网本(运行 Win XP)上比在我的家用台式电脑(运行 Win7 64 位)上发生得更频繁、更快。例外也有不同的。对于台式电脑来说,如下:

java.lang.InternalError: Unrecognized PGCanvas token: 68
at com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:651)
at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:320)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:187)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:39)
at com.sun.javafx.sg.BaseNode.render(BaseNode.java:1145)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:204)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:420)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:187)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:39)
at com.sun.javafx.sg.BaseNode.render(BaseNode.java:1145)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:117)
at com.sun.javafx.tk.quantum.AbstractPainter.paintImpl(AbstractPainter.java:175)
at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:73)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)
at com.sun.prism.render.RenderJob.run(RenderJob.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at …
Run Code Online (Sandbox Code Playgroud)

javafx exception hashmap runnable

7
推荐指数
1
解决办法
5707
查看次数

垃圾收集器没有像在 Android 应用程序中那样释放“垃圾内存”

你好!

我是一名初级 Java 和 Android 开发人员,最近在处理我的应用程序的内存管理方面遇到了麻烦。我将把这篇文章分成几个部分,以使其更清晰易读。


我的应用程序的简要说明

这是一个由几个阶段(级别)组成的游戏。每个阶段都有一个玩家的起点和一个出口,引导玩家进入下一个阶段。每个阶段都有自己的一套障碍。目前,当玩家到达最后阶段(我目前只创建了 4 个)时,他/她会自动回到第一阶段(1 级)。

一个名为GameObject(扩展Android.View)的抽象类定义了玩家和游戏中存在的所有其他对象(障碍物等)的基本结构和行为。所有对象(本质上是视图)都绘制在我创建的自定义视图中(扩展 FrameLayout)。游戏逻辑和游戏循环由一个侧线程(gameThread)处理。这些阶段是通过从 xml 文件中检索元数据来创建的。

问题

除了我的代码中所有可能的内存泄漏(我一直在努力寻找和解决所有这些问题)之外,还有一个与垃圾收集器发生相关的奇怪现象。我将使用图像,而不是用文字来描述它并冒着让您感到困惑的风险。孔子说:“千言万语”。好吧,在这种情况下,我刚刚让您免于阅读 150,000 个单词,因为我下面的 GIF 有 150 帧。

第一次加载时的第 1 阶段。 该应用程序的总内存分配为 85mb。 第二次加载时的第 1 阶段。 该应用程序的总内存分配为 130mb。 在我强制执行 2 次垃圾回收(使用 Android Profiler)后,内存回到 85mb。

描述:第一张图片代表我的应用程序在第一次加载“stage 1”时的内存使用情况。第二个图像 (GIF) 首先表示第二次加载“阶段 1”时我的应用程序的内存使用时间线(这种情况发生,如前所述,当玩家击败最后一个阶段时),然后是四个强制启动的垃圾收集由我。

您可能已经注意到,这两种情况在内存使用方面存在巨大差异(几乎 50MB)。第一次加载“第一阶段”时,当游戏开始时,应用程序使用 85MB 内存。第二次加载同一个stage的时候,稍晚一点,内存使用量已经是130MB了!这可能是由于我的一些糟糕的编码,因此我不在这里。你有没有注意到,在我强行执行了 2 次(实际上是 4 次,但只有前 2 次重要)垃圾收集之后,内存使用情况又回到了它的“正常状态”(与第一次加载舞台时的内存使用情况相同)?这就是我所说的奇怪现象

问题

如果垃圾收集器应该从不再被引用的内存对象中删除(或者至少只有弱引用),为什么你在上面看到的“垃圾内存”只有在我强行调用GC和不是关于GC的正常执行?我的意思是,如果我手动启动的垃圾收集可以删除这个“thrash”,那么正常的GC执行也可以删除它。为什么没有发生?

我什至尝试在切换阶段时调用System.gc(),但是,即使垃圾收集发生这种情况,这种“颠簸”内存不会像我手动执行GC那样被删除。我是否遗漏了一些关于垃圾收集器如何工作或 Android 如何实现它的重要信息?

最后的考虑

我花了几天时间搜索、研究和修改我的代码,但我找不到为什么会这样。StackOverflow 是我最后的选择。谢谢!

注意:我打算发布一些可能与我的应用程序源代码相关的部分,但由于问题已经太长了,我将在这里停止。如果您觉得需要检查某些代码,请告诉我,我将编辑此问题。

我已经读过: …

java performance android garbage-collection memory-leaks

7
推荐指数
1
解决办法
3207
查看次数