Java – 使用大量RAM的GUI时钟?

我为Java中的桌面小部件制作了一个小时钟(该小部件还包括许多其他function)。 我检查了任务管理器中的应用程序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(); 

为什么要使用这么多内存? 我该怎么办呢?

  1. 将更新次数减少到所需的最小值
  2. 尽可能减少临时对象的数量
  3. 确保对UI的所有更新都是在主UI线程的上下文中进行的(Swing的事件调度线程)

看一眼:

  • Swing中的并发性
  • 如何使用Swing Timers

例如…

时钟

 import java.awt.EventQueue; import java.awt.Font; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class ClockMeBaby { public static void main(String[] args) { new ClockMeBaby(); } public ClockMeBaby() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public static class TestPane extends JPanel { protected static final DateFormat CLOCK_FORMAT = new SimpleDateFormat("hh:mm:ss a"); private JLabel clock; public TestPane() { setLayout(new GridBagLayout()); clock = new JLabel("..."); clock.setFont(clock.getFont().deriveFont(Font.BOLD, 64f)); add(clock); updateClock(); Timer timer = new Timer(500, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateClock(); } }); timer.start(); } protected void updateClock() { clock.setText(CLOCK_FORMAT.format(System.currentTimeMillis())); } } } 

SwingTimer使用500毫秒延迟的原因是为了确保我们保持同步,否则您的时钟可能会与UI的其余部分“不同步”更新,因为您错过了第二个边界。 如果这对您来说不重要,那么我们可能会延迟1000毫秒