The issue I am having is that, if a user starts to copy and paste the
JLabels, an OutOfMemoryException quickly occurs. I ran some memory
profiling (via TPTP) and the JLabels are taking up quite a bit of
memory, but not nearly enough to cause an OOMEx. I tested this theory
by creating a test program to head into an infinite loop and create a
ton of JLabels and it was up to >30,000 before it decided to hit a
OOMEx. The number of JLabels being copied and pasted are < 1,000.
Nothing else in the application was taking up any significant amount
of memory. I have allocated 512MB to the JVM.
Is there anything that is apparently wrong with this code (this is
where the JLabels are added)? I am really stuck. It's not a memory
leak (based on my research with TPTP) and I'm not creating *THAT* many
JLabels. Any suggestions?
(For the record, "this" class refers to a class that extends JPanel.)
private void setTokens(List<String> tokens) {
List<JLabel> components = new ArrayList<JLabel>();
// convert the tokens to JLabels which will be added to the
panel
for (String tokenString : tokens) {
JLabel tokenLabel = new JLabel(" " + tokenString + " ");
tokenLabel.setSize(tokenLabel.getPreferredSize());
tokenLabel.setOpaque(false);
tokenLabel.addMouseListener(tokenSelection);
tokenLabel.addMouseListener(panelFocusSetter);
components.add(tokenLabel);
}
// get the panel's size
Dimension panelSize = this.calculatePanelSize(components);
this.setPreferredSize(panelSize);
this.setSize(panelSize);
// now populate the panel
// populating with line wrapping turned on requires that the
size of the
// panel is taken into consideration
this.removeAll();
for (JLabel label : components) {
this.add(label);
}
}
Thanks