Hi,
I have a very simple test program. A button to add an object(Sphere) every
time, another button to delete an object every time. If I deleted all the
objects that I added, I suppose there should no BranchGroup, Sphere,
Material objects left in the memory if there is no memory leak. But in the
snapshot that I took using JProbe, there is still one instance of each
those objects in the memory. The reference graph shows like:
SimpleUniverser---SetLiveState---ArrayList....BranchGroup
I don't know why there is such a reference graph, and I think I can do
nothing to cut this reference path. Is this a memory leak bug or what?
I welcome your comments and Thanks a lot. ---white
Java3D 1.3.1 OpenGL version is used.
/*
* MemoryTest2.java
*
* Created on June 23, 2003, 4:50 PM
*/
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.picking.PickTool;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.universe.PlatformGeometry;
import com.sun.j3d.utils.geometry.*;
public class MemoryTest2 extends javax.swing.JFrame {
private SimpleUniverse universe;
private int numObjects = 0;
private BranchGroup[] objects = new BranchGroup[40];
/** Creates new form MemoryTest */
public MemoryTest2() {
initComponents();
init();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
addButton = new javax.swing.JButton();
deleteButton = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jPanel2 = new javax.swing.JPanel();
getContentPane().setLayout(new java.awt.BorderLayout(10, 20));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 15, 5));
addButton.setText("Add Object");
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addButtonActionPerformed(evt);
}
});
jPanel1.add(addButton);
deleteButton.setText("Delete Object");
deleteButton.setEnabled(false);
deleteButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteButtonActionPerformed(evt);
}
});
jPanel1.add(deleteButton);
jLabel1.setText("Number of Objects:");
jPanel1.add(jLabel1);
jTextField1.setEditable(false);
jTextField1.setText(Integer.toString(numObjects));
jPanel1.add(jTextField1);
getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);
jPanel2.setLayout(new java.awt.BorderLayout());
getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);
pack();
java.awt.Dimension screenSize =
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setSize(new java.awt.Dimension(640, 480));
setLocation((screenSize.width-640)/2,(screenSize.height-480)/2);
}
private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {
// Add your handling code here:
universe.getLocale().removeBranchGraph(objects[--numObjects]);
objects[numObjects] = null;
com.sun.j3d.utils.universe.Viewer.clearViewerMap();
jTextField1.setText(Integer.toString(numObjects));
if (numObjects == 0)
deleteButton.setEnabled(false);
if (numObjects < 30)
addButton.setEnabled(true);
//universe.cleanup();
jPanel2.updateUI();
System.gc();
}
private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {
// Add your handling code here:
BranchGroup object = createGraph();
objects[numObjects++] = object;
universe.addBranchGraph(object);
jTextField1.setText(Integer.toString(numObjects));
if (numObjects >= 30)
addButton.setEnabled(false);
if (numObjects > 0)
deleteButton.setEnabled(true);
jPanel2.updateUI();
}
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
private void init() {
Canvas3D c3d = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
universe = new SimpleUniverse(c3d);
Transform3D t = new Transform3D();
t.set(new Vector3d(0.0, 0.0, 5.0));
((universe.getViewingPlatform()).getViewPlatformTransform()).setTransform(t);
OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(new BoundingSphere(new Point3d(), 100));
universe.getViewingPlatform().setViewPlatformBehavior(orbit);
jPanel2.add(c3d, java.awt.BorderLayout.CENTER);
PlatformGeometry pg = new PlatformGeometry();
DirectionalLight light1 = new DirectionalLight(true, new Color3f(1.0f,
1.0f, 1.0f), new Vector3f(0.0f, 0.0f, -1.0f));
light1.setCapability(DirectionalLight.ALLOW_DIRECTION_WRITE);
Bounds bound = new BoundingSphere(new Point3d(0, 0, 0), 100);
light1.setInfluencingBounds(bound);
AmbientLight light2 = new AmbientLight(true, new Color3f(0.3f, 0.3f, 0.3f));
light2.setInfluencingBounds(bound);
pg.addChild(light1);
pg.addChild(light2);
universe.getViewingPlatform().setPlatformGeometry(pg);
}
private BranchGroup createGraph() {
BranchGroup root = new BranchGroup();
root.setCapability(BranchGroup.ALLOW_DETACH);
Sphere sphere = new Sphere();
Material myMaterial = new Material();
myMaterial.setCapability(Material.ALLOW_COMPONENT_WRITE);
myMaterial.setAmbientColor(0.2f, 0.2f, 0.2f);
myMaterial.setDiffuseColor(0.6f, 0.3f, 0.2f);
myMaterial.setShininess(15.0f);
myMaterial.setLightingEnable(true);
Appearance app = new Appearance();
app.setMaterial(myMaterial);
sphere.setAppearance(app);
root.addChild(sphere);
root.compile();
return root;
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new MemoryTest2().show();
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JButton deleteButton;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JButton addButton;
private javax.swing.JTextField jTextField1;
// End of variables declaration
}
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".