PROBLEMA CON MEMORIA EN JAVA
Hola chicos, tengo un problema con respecto a la memoria, he hecho una aplicacion de escritorio con conexion base de datos mysql , mi problema esta que cuando abro ventanas de tipo jdialog la memoria crece pero al cerrar el jdialog no baja la memoria a su tamaño normal se queda en el tamaño que crecio al abrir el jdialog y asi es copn todo y me parece extraño ya que a los dialog los cierro con dispose().
aluna sugerencia que me podria decir de como hacer para que baje la memoria cuando no se use las ventanas, o cuando se realize una consulta con la BD, ya que me preocupa porque mi programa va a ser corrido en algunos casos en maquinas que tiene 256mb de ram mi temor es que colapse.
esto es de suma urgencia ya que por esto aun no puedo sustentar mi programa.
de antemano se los agradesco
- Inicie sesión o regístrese para enviar comentarios
Eso es un poco extraño,
Eso es un poco extraño, podrías poner la parte crítica de tu código fuente ?
JavaRanch big moose saloon member
Aui te mando el codigo
bueno aqui te mando la manera de como llamo a mi jdialog:
Frmdc= new Documentos(this,true,this);
Frmdc.setTitle("RESOLUCIONES");
Frmdc.setVisible(true);
Bueno, por mi parte yo lo veo bien, ahora te mando el codigo la parte inicial del jdialog:
static String dir = System.getProperty("user.dir");
String dir2 = System.getProperty("user.dir");
Connection con = null;Statement stmt_costas;ResultSet rsbuscar,rsdirec1,rsbuscar2,rsdirec2,rsimporte,rscostas;
public String bd = "maestrobd";CallableStatement stmt_buscar, stmt_direc1,stmt_buscar2,stmt_direc2,stmt_importe;
public String login ="root";
public String password ="123456";
public String url;int c=0,ff=0;
Administrador Frma;String fecha,fecha2,anio;int mes,mes2,num;
private File file;int comp;private MiWorker trabajador;
public Documentos(java.awt.Frame parent, boolean modal,Administrador Administrador) {
super(parent, modal);
Frma = Administrador;
initComponents();
jDateChooser1.getJCalendar().setWeekOfYearVisible(false);
jDateChooser2.getJCalendar().setWeekOfYearVisible(false);
jDateChooser1.getJCalendar().setSundayForeground(java.awt.Color.RED);
this.setLocationRelativeTo(null);
}
private Documentos(javax.swing.JFrame JFrame, boolean b) {
super(JFrame, b);
initComponents();
}
public class Modelo extends DefaultTableModel
{
@Override
public boolean isCellEditable (int row, int column)
{
return false;
}
}
Modelo modelo = new Modelo();
como dije anteriormente en todos los jdialog que llamo crecen pero este que te mando es el que crece mas de memoria que los otros por eso te lo mando, a mi parecer ahi no veo nada extaño.
Esperes tu encuentre el problema y lo puedas solucionar.
de antemano te lo agradesco
El codigo parece estar bien,
El codigo parece estar bien, que tanto crece la memoria?
JavaRanch big moose saloon member
Crece Aproximadamente...
bueno crece Aproximadamente entre 5 y 10mb, peor a mi lo que me preocupa mas es que al cerrar el jdialog sigue con esos 5 mb de memoria de mas osea mi programa esta corriendo con una memoria de 30mb de ram cuando abro el dialog sube hasta 40mb y supuestamente si cierro el dialog deberia bajar de nuevo a los 30mb, pero no mi programa sigue con los 40mb y si abro otro jdialog sigue subiendo hasta ah llegoad a los 65mb, y no tengo idea como hacer para que baje al minimizarlo si baja pero no quiero estar minimizando a cada rato es mas mi programa va aser usado por otras personas que derrepente ni lo piensan minimizar.
espero que me puedas ayudar.
Ok, el comportamiento por
Ok, el comportamiento por default de un JDialog al cerrarse es "disponse" (Nb) lo cual significa que ahi queda para ser reutilizado cuando lo vuelvas a invocar, esa es la razón por la que la memoria no baja cada que lo cierras.
El problema aqui esque no existe alguna otra operación por default (setDefaultCloseOperation) que pueda ayudarte, por lo tanto la alternativa que yo veo es que al cerrar el JDialog le avises al padre para que éste lo iguale a null y el garbage collector pase por él en algún momento, de esta forma debería liberarse la memoria.
JavaRanch big moose saloon member
Gracias por la respuesta
Gracias por la respuesta, pero no tengo idea de como avisarle al padre(en este caso viene a ser mi jFrame), que el jdialog ah sido cerrado para ponerlo en valor nulo.
me podrias dar una idea de como hago eso?
mi opinion
Mira yo te hago las siguientes odservaciones..
*veo que en cada JDialog tienes una conexion, yo te recomendaria que solo tengas una para toda tu aplicacion..
En cuando al JDialog aqui te adjunto el codigo fuente de como los he trabajado, odserva con cuidado que yo en ningun momento tengo un Connection o un ResultSet o un Statement.
A la hora de llamarlo mando a llamar el metodo static showMessage(xxx,xxx);
Saludos
private ProductInfoExt m_ReturnProduct;
private ListProvider lpr;
/** Creates new form JProductFinder */
private JProductFinder(java.awt.Frame parent, boolean modal) {
super(parent, modal);
}
/** Creates new form JProductFinder */
private JProductFinder(java.awt.Dialog parent, boolean modal) {
super(parent, modal);
}
private ProductInfoExt init(DataLogicSales dlSales) {
initComponents();
jScrollPane1.getVerticalScrollBar().setPreferredSize(new Dimension(35, 35));
//ProductFilter jproductfilter = new ProductFilter(app);
ProductFilterSales jproductfilter = new ProductFilterSales(dlSales, m_jKeys);
jproductfilter.activate();
m_jProductSelect.add(jproductfilter, BorderLayout.CENTER);
lpr = new ListProviderCreator(dlSales.getProductList(), jproductfilter);
jListProducts.setCellRenderer(new ProductRenderer());
getRootPane().setDefaultButton(jcmdOK);
m_ReturnProduct = null;
//show();
setVisible(true);
return m_ReturnProduct;
}
private static Window getWindow(Component parent) {
if (parent == null) {
return new JFrame();
} else if (parent instanceof Frame || parent instanceof Dialog) {
return (Window)parent;
} else {
return getWindow(parent.getParent());
}
}
public static ProductInfoExt showMessage(Component parent, DataLogicSales dlSales) {
Window window = getWindow(parent);
JProductFinder myMsg;
if (window instanceof Frame) {
myMsg = new JProductFinder((Frame) window, true);
} else {
myMsg = new JProductFinder((Dialog) window, true);
}
return myMsg.init(dlSales);
}
private static class MyListData extends javax.swing.AbstractListModel {
private java.util.List m_data;
public MyListData(java.util.List data) {
m_data = data;
}
public Object getElementAt(int index) {
return m_data.get(index);
}
public int getSize() {
return m_data.size();
}
}
/** 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel4 = new javax.swing.JPanel();
m_jKeys = new com.openbravo.editor.JEditorKeys();
jPanel2 = new javax.swing.JPanel();
m_jProductSelect = new javax.swing.JPanel();
jPanel3 = new javax.swing.JPanel();
jButton3 = new javax.swing.JButton();
jPanel5 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jListProducts = new javax.swing.JList();
jPanel1 = new javax.swing.JPanel();
jcmdOK = new javax.swing.JButton();
jcmdCancel = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle(AppLocal.getIntString("form.productslist")); // NOI18N
jPanel4.setLayout(new java.awt.BorderLayout());
jPanel4.add(m_jKeys, java.awt.BorderLayout.NORTH);
getContentPane().add(jPanel4, java.awt.BorderLayout.LINE_END);
jPanel2.setLayout(new java.awt.BorderLayout());
m_jProductSelect.setLayout(new java.awt.BorderLayout());
jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/openbravo/images/launch.png"))); // NOI18N
jButton3.setText(AppLocal.getIntString("button.executefilter")); // NOI18N
jButton3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton3ActionPerformed(evt);
}
});
jPanel3.add(jButton3);
m_jProductSelect.add(jPanel3, java.awt.BorderLayout.SOUTH);
jPanel2.add(m_jProductSelect, java.awt.BorderLayout.NORTH);
jPanel5.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
jPanel5.setLayout(new java.awt.BorderLayout());
jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jListProducts.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jListProducts.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
jListProductsValueChanged(evt);
}
});
jListProducts.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jListProductsMouseClicked(evt);
}
});
jScrollPane1.setViewportView(jListProducts);
jPanel5.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jPanel2.add(jPanel5, java.awt.BorderLayout.CENTER);
jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));
jcmdOK.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/openbravo/images/button_ok.png"))); // NOI18N
jcmdOK.setText(AppLocal.getIntString("Button.OK")); // NOI18N
jcmdOK.setEnabled(false);
jcmdOK.setMargin(new java.awt.Insets(8, 16, 8, 16));
jcmdOK.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jcmdOKActionPerformed(evt);
}
});
jPanel1.add(jcmdOK);
jcmdCancel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/openbravo/images/button_cancel.png"))); // NOI18N
jcmdCancel.setText(AppLocal.getIntString("Button.Cancel")); // NOI18N
jcmdCancel.setMargin(new java.awt.Insets(8, 16, 8, 16));
jcmdCancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jcmdCancelActionPerformed(evt);
}
});
jPanel1.add(jcmdCancel);
jPanel2.add(jPanel1, java.awt.BorderLayout.SOUTH);
getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-665)/2, (screenSize.height-565)/2, 665, 565);
}// </editor-fold>
private void jListProductsMouseClicked(java.awt.event.MouseEvent evt) {
if (evt.getClickCount() == 2) {
m_ReturnProduct = (ProductInfoExt) jListProducts.getSelectedValue();
dispose();
}
}
private void jcmdOKActionPerformed(java.awt.event.ActionEvent evt) {
m_ReturnProduct = (ProductInfoExt) jListProducts.getSelectedValue();
dispose();
}
private void jcmdCancelActionPerformed(java.awt.event.ActionEvent evt) {
dispose();
}
private void jListProductsValueChanged(javax.swing.event.ListSelectionEvent evt) {
jcmdOK.setEnabled(jListProducts.getSelectedValue() != null);
}
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
try {
jListProducts.setModel(new MyListData(lpr.loadData()));
if (jListProducts.getModel().getSize() > 0) {
jListProducts.setSelectedIndex(0);
}
} catch (BasicException e) {
e.printStackTrace();
}
}
// Variables declaration - do not modify
private javax.swing.JButton jButton3;
private javax.swing.JList jListProducts;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton jcmdCancel;
private javax.swing.JButton jcmdOK;
private com.openbravo.editor.JEditorKeys m_jKeys;
private javax.swing.JPanel m_jProductSelect;
// End of variables declaration
}
Coloca el código
Podrias colocar todo el código de tu dialogo? inclusive el evento en el Frame que lo manda a llamar.
Además recuerda que el código es para que lo entiendan los demás, no solo tú, dale un poco de formato.
Sobres
juego memoria
Hola tengo que programar un juego en java que es memoria pero no se por favor me podrian enviar el codigo, seria de mucha utilidad el juegoconsiste en encontrar pares y se sube de nivel mientras mas rapido logremos encontrarlos y se pierde cuando el tiempo se acaba
En este hilo no se está
En este hilo no se está discutiendo acerca del juego de memoria, sino de la RAM en Java.
Para aprovechar y orientarte (porque nadie aquí creo que te vaya a hacer tu tarea) puedes basarte en JPexeso, que es un juego de memoria hecho en Java, la página oficial es la siguiente: http://jpexeso.sourceforge.net/
Saludos.
--
Javier Benek