图像Java应用程序中断10%的时间
我有一个应用程序,它使用2400x1800缓冲图像(我知道这需要很多资源),但它在90%以上的时间都能正常工作。占用130 mb的RAM,占用5%的CPU
问题是,10%的时间,它有一个很大的滞后,只消耗40到50 mb的RAM,并使用50%的CPU。为什么它没有吃掉同样的记忆
我知道我应该发布一些代码,但是这个应用程序真的很大,一个关于这个特定问题的链接可能会有很大帮助
你可以在下面搜索框中键入要查询的问题!
我有一个应用程序,它使用2400x1800缓冲图像(我知道这需要很多资源),但它在90%以上的时间都能正常工作。占用130 mb的RAM,占用5%的CPU
问题是,10%的时间,它有一个很大的滞后,只消耗40到50 mb的RAM,并使用50%的CPU。为什么它没有吃掉同样的记忆
我知道我应该发布一些代码,但是这个应用程序真的很大,一个关于这个特定问题的链接可能会有很大帮助
# 1 楼答案
首先,130Mb是很多,即使对于2400x1800图像,这意味着每像素消耗27字节
对于典型的每像素32位(或4字节)图像,只需要16-17MB
从你说的第二点来看,在垃圾收集器被调用之前,你似乎消耗了越来越多的内存,而垃圾收集器做了很多工作来释放内存
你可能需要: -增加可用的最大内存 -调整垃圾收集器,使暂停更小,但更频繁
编辑:也许你创建了很多这样大小的新图像,而不是更新它们,迫使大量的内存分配和内存分配
# 2 楼答案
这个问题没有什么可谈的,但应用程序中的周期性放缓通常是由于garbage collection。运行jvisualvm并查看与内存相关的图表。如果你看到一个锯齿状的模式,其峰值与性能下降的开始重合,那么这表明你的应用程序由于垃圾收集器处理大量对象而变慢。这可能是由于在代码中浪费创建对象造成的,也可能只是需要为vm分配更多内存
这是一本指南
# 3 楼答案
通过剖析器进行分析。JProfiler是一个很好的使用工具
# 4 楼答案
你是在用一个镜头加载图片吗?为什么不平铺它并制作一些线程来加载图像?如果你的程序中加载视图的部分太大了,为什么不把它分散在线程中呢?需要更多建议吗
祝你好运
# 5 楼答案
也许运行诸如Xmx(这是应用程序可使用的最大大小)和Xss(这是该应用程序的启动内存)之类的JVM参数可以帮助您
在eclipse中试试这个(假设您使用它)
进入跑步菜单
然后运行配置
然后选择你的跑步者
然后点击(x)=参数选项卡
将此添加到VM参数中
-Xmx512m-Xss150m
试着运行它。。。这将使你的JVM启动时,至少有150mb的空闲RAM已经分配给它
如果不使用eclipse,只需将这些参数添加到java命令行即可