public class SwingFx extends Application {
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode);
Button bt = new Button("Add New");
bt.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
swingNode.setContent(null);
swingNode.setContent(new TestComp());
}
});
BorderPane borderPane = new BorderPane();
borderPane.setCenter(swingNode);
borderPane.setTop(bt);
stage.setScene(new Scene(borderPane, 200, 150));
stage.show();
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JButton bt = new JButton("Click me!");
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Click me...");
}
});
swingNode.setContent(bt);
}
});
}
public static void main(String[] args) {
launch(args);
}
class TestComp extends JComponent {
private String[] strArr;
TestComp() {
this.strArr = new String[1000];
for (int i = 0; i < 1000; i++) {
strArr[i] = Math.random() + "";
}
}
}
}
if we click the "Add New" button which will set content to null at first ,and then add a class with array.
we using Eclispe Memory Analysis tool to analysis the heapdump,and find that the variable lwFrame with type JLightweightFrame increase, and force gc cannot release the memory:
•sun.swing.JLightweightFrame @ 0x921b8e0 - 278,288 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x911bc10 - 278,272 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x915fa88 - 278,208 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c64068 - 278,200 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921bd80 - 278,200 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921d298 - 278,184 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921c958 - 278,176 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c642b8 - 278,168 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8d3cef8 - 278,168 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c63e18 - 278,160 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x91e3af8 - 278,160 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8a20c58 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c63b80 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8d3d920 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8d3dae8 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921c220 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921bb30 - 278,136 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c63930 - 278,120 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8a207b8 - 278,112 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8a20a08 - 278,112 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921d738 - 278,104 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x882b810 - 278,096 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c649a8 - 278,080 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921cba8 - 278,080 (1.56%) bytes.
how can we reset the SwingNode content rightly?
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode);
Button bt = new Button("Add New");
bt.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
swingNode.setContent(null);
swingNode.setContent(new TestComp());
}
});
BorderPane borderPane = new BorderPane();
borderPane.setCenter(swingNode);
borderPane.setTop(bt);
stage.setScene(new Scene(borderPane, 200, 150));
stage.show();
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JButton bt = new JButton("Click me!");
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Click me...");
}
});
swingNode.setContent(bt);
}
});
}
public static void main(String[] args) {
launch(args);
}
class TestComp extends JComponent {
private String[] strArr;
TestComp() {
this.strArr = new String[1000];
for (int i = 0; i < 1000; i++) {
strArr[i] = Math.random() + "";
}
}
}
}
if we click the "Add New" button which will set content to null at first ,and then add a class with array.
we using Eclispe Memory Analysis tool to analysis the heapdump,and find that the variable lwFrame with type JLightweightFrame increase, and force gc cannot release the memory:
•sun.swing.JLightweightFrame @ 0x921b8e0 - 278,288 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x911bc10 - 278,272 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x915fa88 - 278,208 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c64068 - 278,200 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921bd80 - 278,200 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921d298 - 278,184 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921c958 - 278,176 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c642b8 - 278,168 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8d3cef8 - 278,168 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c63e18 - 278,160 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x91e3af8 - 278,160 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8a20c58 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c63b80 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8d3d920 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8d3dae8 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921c220 - 278,144 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921bb30 - 278,136 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c63930 - 278,120 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8a207b8 - 278,112 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8a20a08 - 278,112 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921d738 - 278,104 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x882b810 - 278,096 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x8c649a8 - 278,080 (1.56%) bytes.
•sun.swing.JLightweightFrame @ 0x921cba8 - 278,080 (1.56%) bytes.
how can we reset the SwingNode content rightly?
- relates to
-
JDK-8262518 SwingNode.setContent does not close previous content, resulting in memory leak
- Resolved