+
+
+ item = new JMenuItem("Create 'Iso-Haisu'");
+ item.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ log.user("Create Iso-Haisu selected");
+ Rocket r = TestRockets.makeIsoHaisu();
+ OpenRocketDocument doc = new OpenRocketDocument(r);
+ doc.setSaved(true);
+ BasicFrame frame = new BasicFrame(doc);
+ frame.setVisible(true);
+ }
+ });
+ menu.add(item);
+
+
+ item = new JMenuItem("Create 'Big Blue'");
+ item.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ log.user("Create Big Blue selected");
+ Rocket r = TestRockets.makeBigBlue();
+ OpenRocketDocument doc = new OpenRocketDocument(r);
+ doc.setSaved(true);
+ BasicFrame frame = new BasicFrame(doc);
+ frame.setVisible(true);
+ }
+ });
+ menu.add(item);
+
+ menu.addSeparator();
+
+
+ item = new JMenuItem("Memory statistics");
+ item.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ log.user("Memory statistics selected");
+
+ // Get discarded but remaining objects (this also runs System.gc multiple times)
+ List<MemoryData> objects = MemoryManagement.getRemainingCollectableObjects();
+ StringBuilder sb = new StringBuilder();
+ sb.append("Objects that should have been garbage-collected but have not been:\n");
+ int count = 0;
+ for (MemoryData data : objects) {
+ Object o = data.getReference().get();
+ if (o == null)
+ continue;
+ sb.append("Age ").append(System.currentTimeMillis() - data.getRegistrationTime())
+ .append(" ms: ").append(o).append('\n');
+ count++;
+ // Explicitly null the strong reference to avoid possibility of invisible references
+ o = null;
+ }
+ sb.append("Total: " + count);
+
+ // Get basic memory stats
+ System.gc();
+ long max = Runtime.getRuntime().maxMemory();
+ long free = Runtime.getRuntime().freeMemory();
+ long used = max - free;
+ String[] stats = new String[4];
+ stats[0] = "Memory usage:";
+ stats[1] = String.format(" Max memory: %.1f MB", max / 1024.0 / 1024.0);
+ stats[2] = String.format(" Used memory: %.1f MB (%.0f%%)", used / 1024.0 / 1024.0, 100.0 * used / max);
+ stats[3] = String.format(" Free memory: %.1f MB (%.0f%%)", free / 1024.0 / 1024.0, 100.0 * free / max);
+
+
+ DetailDialog.showDetailedMessageDialog(BasicFrame.this, stats, sb.toString(),
+ "Memory statistics", JOptionPane.INFORMATION_MESSAGE);
+ }
+ });
+ menu.add(item);
+
+ //// Exhaust memory
+ item = new JMenuItem("Exhaust memory");
+ item.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ log.user("Exhaust memory selected");
+ LinkedList<byte[]> data = new LinkedList<byte[]>();
+ int count = 0;
+ final int bytesPerArray = 10240;
+ try {
+ while (true) {
+ byte[] array = new byte[bytesPerArray];
+ for (int i = 0; i < bytesPerArray; i++) {
+ array[i] = (byte) i;
+ }
+ data.add(array);
+ count++;
+ }
+ } catch (OutOfMemoryError error) {
+ data = null;
+ long size = bytesPerArray * (long) count;
+ String s = String.format("OutOfMemory occurred after %d iterations (approx. %.1f MB consumed)",
+ count, size / 1024.0 / 1024.0);
+ log.debug(s, error);
+ JOptionPane.showMessageDialog(BasicFrame.this, s);
+ }
+ }
+ });
+ menu.add(item);
+
+