有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

图像Java应用程序中断10%的时间

我有一个应用程序,它使用2400x1800缓冲图像(我知道这需要很多资源),但它在90%以上的时间都能正常工作。占用130 mb的RAM,占用5%的CPU

问题是,10%的时间,它有一个很大的滞后,只消耗40到50 mb的RAM,并使用50%的CPU。为什么它没有吃掉同样的记忆

我知道我应该发布一些代码,但是这个应用程序真的很大,一个关于这个特定问题的链接可能会有很大帮助


共 (5) 个答案

  1. # 1 楼答案

    首先,130Mb是很多,即使对于2400x1800图像,这意味着每像素消耗27字节

    对于典型的每像素32位(或4字节)图像,只需要16-17MB

    从你说的第二点来看,在垃圾收集器被调用之前,你似乎消耗了越来越多的内存,而垃圾收集器做了很多工作来释放内存

    你可能需要: -增加可用的最大内存 -调整垃圾收集器,使暂停更小,但更频繁

    编辑:也许你创建了很多这样大小的新图像,而不是更新它们,迫使大量的内存分配和内存分配

  2. # 2 楼答案

    这个问题没有什么可谈的,但应用程序中的周期性放缓通常是由于garbage collection。运行jvisualvm并查看与内存相关的图表。如果你看到一个锯齿状的模式,其峰值与性能下降的开始重合,那么这表明你的应用程序由于垃圾收集器处理大量对象而变慢。这可能是由于在代码中浪费创建对象造成的,也可能只是需要为vm分配更多内存

    这是一本指南

  3. # 3 楼答案

    通过剖析器进行分析。JProfiler是一个很好的使用工具

  4. # 4 楼答案

    你是在用一个镜头加载图片吗?为什么不平铺它并制作一些线程来加载图像?如果你的程序中加载视图的部分太大了,为什么不把它分散在线程中呢?需要更多建议吗

    祝你好运

  5. # 5 楼答案

    也许运行诸如Xmx(这是应用程序可使用的最大大小)和Xss(这是该应用程序的启动内存)之类的JVM参数可以帮助您

    在eclipse中试试这个(假设您使用它)

    进入跑步菜单

    然后运行配置

    然后选择你的跑步者

    然后点击(x)=参数选项卡

    将此添加到VM参数中

    -Xmx512m-Xss150m

    试着运行它。。。这将使你的JVM启动时,至少有150mb的空闲RAM已经分配给它

    如果不使用eclipse,只需将这些参数添加到java命令行即可