【发布时间】:2014-11-26 23:23:02
【问题描述】:
我用 Java 为桌面小部件制作了一个小时钟(该小部件还包括许多其他功能)。我检查了任务管理器中的应用程序 RAM 使用情况,以查看时钟使用了 700+ MB 的 RAM。我禁用了时钟,RAM 使用量下降到大约 60 MB。这是时钟代码:
final int timeRun = 0;
new Thread()
{
public void run()
{
while(timeRun == 0)
{
Calendar cal = new GregorianCalendar();
int hour = cal.get(Calendar.HOUR);
int min = cal.get(Calendar.MINUTE);
int sec = cal.get(Calendar.SECOND);
int AM_PM = cal.get(Calendar.AM_PM);
String day_night = "";
if (AM_PM == 1){
day_night = "PM";
}else{
day_night = "AM";
}
String time = hour + ":" + min + ":" + sec + " " + day_night;
Clock.setText(time);
}
}
}.start();
为什么要使用这么多内存?我该如何解决?
【问题讨论】:
-
你在不断地创建实例,虽然 GC 应该收集它,但你真的不需要每次迭代都创建新的 Calendar
-
如果您测量秒数,您的循环/线程应该等待 1000 毫秒。
-
您正在创建大量的短期对象,只要 CPU 可以使它们尽可能快...因为您只更新秒数,请尝试在显示后放置
Thread.sleep(500)。 ..你是在 GUI 上显示这个吗?因为你违反了大多数 UI 的单线程规则...... -
什么GUI框架? Swing/AWT/SWT/JavaFX/Android/...?
-
也许你的 RAM 不喜欢每次迭代中的字符串连接(和新的日历),因为你的程序使用无限循环,没有任何“中断”的机会(没有睡眠,没有等待,没有yield),垃圾收集器很难完成他的工作。