各位大神,我最近在帮办公室写程序,功能基本完成了,但是,有几个很大的问题。
第一、在程序跑了几遍之后,会越跑越慢。比如刚开机,第一次要跑10分钟,第5次好像就要快20分钟了。这个问题不知道怎么解决。
第二、程序是会生成几个窗口弹出的,是JFrame。但是,只要关闭其中一个窗口,整个程序就会退出了,不知道这个问题,各位大神有没有什么好的解决办法?
小弟以前在学校是学计算机的,后来去了国企,基本没什么开发经验。所以,可能提的问题比较低级,希望大家不吝赐教!JavaJFrame

解决方案 »

  1.   

    用java自带的工具看看 是不是有内纯泄露
      

  2.   

    不是点击 JFrame的关闭界面,界面就关闭了,进程就结束了吗?
      

  3.   

    代码貌似很多啊,而且关键是,是点击关闭界面JFrame之后,进程不是就退出了吗?
      

  4.   

    不是点击 JFrame的关闭界面,界面就关闭了,进程就结束了吗?这要看你关闭的方式哈,方便的话把关键代码贴上来大家帮忙看看,
    不方便的话,你去看一下你的内存占用是不是每跑一次都要增加,然后用DEBUG一步一步的走,看一下程序是不是那里逻辑出问题了,比如读写文件是不是在上次的基础上累加的。
      

  5.   

    不是点击 JFrame的关闭界面,界面就关闭了,进程就结束了吗?这要看你关闭的方式哈,方便的话把关键代码贴上来大家帮忙看看,
    不方便的话,你去看一下你的内存占用是不是每跑一次都要增加,然后用DEBUG一步一步的走,看一下程序是不是那里逻辑出问题了,比如读写文件是不是在上次的基础上累加的。
    好吧,我贴代码
    下面是主界面的代码:
    /*
     * SelectPDF.java
     *
     * Created on __DATE__, __TIME__
     */package forms;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.UIManager;
    import javax.swing.filechooser.FileFilter;
    import java.io.File;/**
     *
     * @author  __USER__
     */
    public class SelectPDF extends javax.swing.JFrame { /** Creates new form SelectPDF */
    public SelectPDF() {
    try
    {
    if( System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") != -1 )
    {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    }
    }
    catch(Exception ex)
    {
    ex.printStackTrace();
    Warn warn = new Warn( ex.toString() );
    warn.setVisible( true );
    }
    initComponents();
    } /** 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.
     */
    //GEN-BEGIN:initComponents
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() { String[] actypes = {"A319-112","A319-115","A319-132","A319-133","A320-214","A320-232","A321-211","A321-231","A330-223","A330-243B","A330-243C","A330-323","A330-343B","A330-343C","B737-300","B737-700(22K)","B737-700(24K)","B737-800","B737-800W","B737-800W(24K)","B777-200A","B777-200B","B777-200F","B787-8"};
    jComboBox1 = new javax.swing.JComboBox();
    jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(actypes));
    jButton1 = new javax.swing.JButton();
    jLabel1 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); //jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
    // "Item 1", "Item 2", "Item 3", "Item 4" })); jButton1.setText("\u8bf7\u9009\u62e9PDF\u6587\u4ef6"); jLabel1.setText("\u8bf7\u9009\u62e9\u673a\u578b\uff1a"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
    getContentPane());
    getContentPane().setLayout(layout);
    layout
    .setHorizontalGroup(layout
    .createParallelGroup(
    javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(
    layout
    .createSequentialGroup()
    .addGroup(
    layout
    .createParallelGroup(
    javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(
    layout
    .createSequentialGroup()
    .addGap(
    60,
    60,
    60)
    .addComponent(
    jLabel1)
    .addGap(
    30,
    30,
    30)
    .addComponent(
    jComboBox1,
    javax.swing.GroupLayout.PREFERRED_SIZE,
    97,
    javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGroup(
    layout
    .createSequentialGroup()
    .addGap(
    117,
    117,
    117)
    .addComponent(
    jButton1,
    javax.swing.GroupLayout.PREFERRED_SIZE,
    165,
    javax.swing.GroupLayout.PREFERRED_SIZE)))
    .addContainerGap(118, Short.MAX_VALUE)));
    layout
    .setVerticalGroup(layout
    .createParallelGroup(
    javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(
    layout
    .createSequentialGroup()
    .addGap(83, 83, 83)
    .addGroup(
    layout
    .createParallelGroup(
    javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel1)
    .addComponent(
    jComboBox1,
    javax.swing.GroupLayout.PREFERRED_SIZE,
    javax.swing.GroupLayout.DEFAULT_SIZE,
    javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGap(53, 53, 53).addComponent(
    jButton1).addContainerGap(116,
    Short.MAX_VALUE))); //button添加监听事件
    jButton1.addActionListener( 
    new SelectPDFButtonAction( this.jComboBox1 )
    );


    pack();




    }// </editor-fold>
    //GEN-END:initComponents /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new SelectPDF().setVisible(true);
    }
    });
    } //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private int jcomboboxselect;
    // End of variables declaration//GEN-END:variables
    }由于我的程序要解析PDF,所以,我用了PDFBox,每次都解析一页
    下面是解析某一页的代码
    package handlepdf;import org.apache.pdfbox.pdmodel.*;
    import org.apache.pdfbox.util.*;
    import java.util.List;
    import forms.PDFResult;
    import handleSql.AirBus;
    import java.util.ArrayList;
    import forms.Warn;;public class HandleAirBusPDF 
    {
        private String filepath;    //PDF文件的路径
        private int pagecount;      //PDF文件的总页数
        private PDDocument pdfdocument;     //PDF文件
        private String[] output;     //输出某一页的结果
        private PDFResult result;
        private List<Integer> numlist;   //有内容的书页号
        private List<AirBus>  airbuslist;   //将整个PDF的内容归结到一个列表里面
        
       //获得PDF的内容
        public HandleAirBusPDF( String filepath,PDFResult result )
        {
         this.output = new String[9];
         this.filepath = filepath;
         try
         {
           this.pdfdocument = PDDocument.load(this.filepath);
           this.setpagenumber();
           this.result = result;
           this.airbuslist = new ArrayList<AirBus>();
           this.numlist = new ArrayList<Integer>();
         }catch(Exception ex)
         {
         ex.printStackTrace();
         Warn warn = new Warn( ex.toString() );    //提出警告
         warn.setVisible( true );
         }
        }
        
        //获得列表
        public List<AirBus> getAirbusList()
        {
         return this.airbuslist;
        }
        //获得书页列表
        public List<Integer> getNumlist()
        {
         return this.numlist;
        }
        
        //输出整本PDF的内容
        public void handleallpage()
        {
         int number = 1;
         String [] checkresult = new String[10];
         HandleAirbusPage handleAirbusPage = new HandleAirbusPage();
         while( number<=pagecount )
         {
         String content = this.getPageContent(number);
         
         //字符串较短,有可能是空白页,也有可能是目录
         if( (content.length()<3000) || (content.contains("本页有意留空")) || content.contains("BLANK") )
         {
         //处理目录
         if( content.contains("目录") )
           {
         checkresult[1] = "目录";
           }     
         else
         {
         //处理封面
         if( content.contains("运行指挥中心") )
         {
        checkresult[1] = "封面";
         }
         //处理空页
         else
         {            
                 checkresult[1] = "空白页";
         }
         }    
         
         //处理表格某一行的其他东西
         Integer num = number;
         checkresult[0] = num.toString();
           for( int i=2;i<10;i++ )
       {
        checkresult[i] = " ";
       }
           
           //将结果添加到表格中
         result.addRow( checkresult );
         number++;
         continue;   
         }
         
        //字符串足够长
            int gaiping = 0; //该值主要用来测试是否有改平高度
            gaiping = handleAirbusPage.handlepagecontent(content);
         
        Integer num = number;
        //有异常出现
        if( gaiping==3 )
        {
      checkresult[0] = num.toString();
      checkresult[1] = "*****在校对过程中有异常出现,请人工检查*****";
      number++;
      continue;
      }
        
      //将有内容的页数添加进去
      this.numlist.add(number);
        this.output = handleAirbusPage.getOutput();
       
      checkresult[0] = num.toString();
       
        AirBus airbus = new AirBus( this.output );
         
        if( airbus.getSql()==0 )
        checkresult[1] = "*****清单中没有记录*****";
        if( airbus.getSql()==1 )
        checkresult[1] = "校对结果正确";
        if( airbus.getSql()==2 )
        checkresult[1] = "*****在校对过程中有异常出现,请人工检查*****";
        if( airbus.getSql()==3 )
        checkresult[1] = "*****日期有误,请再检查****";
     
       if( gaiping==2 )
           checkresult[1] += "(下一页应该是改平高度)";
       if( gaiping==5 )
           checkresult[1] += "(这一页是改平高度)";    //获得PDF里面那一页的关键信息
            this.output = handleAirbusPage.getOutput();
          this.airbuslist.add( airbus );
               
         for( int i=1;i<9;i++ )
           {
             checkresult[i+1] = output[i];
           }
               
       this.result.addRow( checkresult );
         for( int i=0;i<10;i++ )
    System.out.print( checkresult[i] + " " );
         System.out.println();     
         number++;
               content = null;
         }
         result.setVisible(true);
         try
         {
             this.pdfdocument.close();
         }catch(Exception ex)
         {
         ex.printStackTrace();
         Warn warn = new Warn( ex.toString() );
       warn.setVisible( true );
         }
        }
    //获得每一页
        public String getPageContent( int pagenumber )
        {
         String content = null;
         try
         {
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setStartPage( pagenumber );
            stripper.setEndPage( pagenumber );
            content = stripper.getText(this.pdfdocument);
         }catch(Exception ex)
         {
         ex.printStackTrace();
         Warn warn = new Warn( ex.toString() );
       warn.setVisible( true );
         }
         return content;
        }
        //获得PDF文档的总页数
        public void setpagenumber()
        {
             List PDpages = this.pdfdocument.getDocumentCatalog().getAllPages();
           this.pagecount = PDpages.size();    //获得总页数
        }
    }我觉得,问题有可能就出现在这些地方。我每次读一个PDF中某一页完成后,有进行调用PDFBox的close()函数的。
      

  6.   

    越跑越慢无非是两种原因:
    1. 资源开了没有释放一直占着,像数据库资源或者文件资源这种
    2. 内存泄露,构造的对象太多,又没有回收,一直放在内存,时间一长你做任意一个操作都要full gc,就会卡
      

  7.   

    给你的Frame指定关闭窗口时的默认动作,当关闭主窗口时完全退出程序(setDefaultCloseOperation(JRame.EXIT_ON_CLOSE)),然后,其他Frame的窗口关闭事件中就只销毁当前Frame(setDefaultCloseOperation(DISPOSE_ON_CLOSE)).还有,看你代码里捕捉异常后,弹出的提示没用SWING里自带的提示框,而且根据代码我推测你的提示也只是提示错误信息,没有复杂的表格或者List之类的展示,那么自己来写这个提示框就没什么必要
    至于占用内存越来越多,一般来说,只要你上次运行正常退出了程序的话,下次执行不会增加内存占用的,有可能就是你程序在你关闭窗口之后并没有真正退出导致的
      

  8.   

    不是点击 JFrame的关闭界面,界面就关闭了,进程就结束了吗?怎么样了?问题解决没有?
    这个问题还是只有你自已解决了,先看内存占用是不是有异常?要是没有的话用断点跑一下,看一下是不是逻辑那里出问题了,然后就是写单元测试测试一下方法的执行时间是在那里出的问题
      

  9.   

    不是点击 JFrame的关闭界面,界面就关闭了,进程就结束了吗?怎么样了?问题解决没有?
    这个问题还是只有你自已解决了,先看内存占用是不是有异常?要是没有的话用断点跑一下,看一下是不是逻辑那里出问题了,然后就是写单元测试测试一下方法的执行时间是在那里出的问题你跑几次是什么意思?  是每次重新打开的程序吗?你看下进度里面 java.exe是不是每次运行完过后都没有关闭,再运行又增加一个
      

  10.   

    不是点击 JFrame的关闭界面,界面就关闭了,进程就结束了吗?怎么样了?问题解决没有?
    这个问题还是只有你自已解决了,先看内存占用是不是有异常?要是没有的话用断点跑一下,看一下是不是逻辑那里出问题了,然后就是写单元测试测试一下方法的执行时间是在那里出的问题你跑几次是什么意思?  是每次重新打开的程序吗?你看下进度里面 java.exe是不是每次运行完过后都没有关闭,再运行又增加一个就是我关闭程序之后,再重新打开运行,会越来越慢!
      

  11.   

    你在Main()中是这样
    new SelectPDF().setVisible(true);
    写到的,而你没有定关于关闭的一些东西
    例如:this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    好像没有写上面的那句话的时候会造成内存泄漏,
    个人感觉应该把setVisible(true)
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    都写到构造函数里,而在main()函数里只要写一句new SelectPDF();就可以了!
      

  12.   

    不是点击 JFrame的关闭界面,界面就关闭了,进程就结束了吗?怎么样了?问题解决没有?
    这个问题还是只有你自已解决了,先看内存占用是不是有异常?要是没有的话用断点跑一下,看一下是不是逻辑那里出问题了,然后就是写单元测试测试一下方法的执行时间是在那里出的问题你跑几次是什么意思?  是每次重新打开的程序吗?你看下进度里面 java.exe是不是每次运行完过后都没有关闭,再运行又增加一个就是我关闭程序之后,再重新打开运行,会越来越慢!你看了内存占用没有啊?
    1. 要是内存占用越来越大就是资源释放的问题,而且你每次都关闭的,你看一下是不是进程里面有多个java.exe
    2. 要是内存变化不大的话,应该就是你程序里面访问的资源变大了
      

  13.   

    swing开发要维护好内存,很可能因为内存不断增长导致溢出。
      

  14.   

    你说的越来越慢是什么?是在不关闭程序的情况下,越来越慢?按你说的,第一次很快,如果不重新打开程序,一直都很快?
    好多人说内存占用什么,当你再次打开程序的时候会变慢,我觉得如果存在内存问题,那肯定是你的JVM没关闭,因为你也知道,而且反复在和他们说“进程结束之后,会自动清空内存”。所以唯一的可能就是JVM没关闭。另外,java是gc回收,而且gc的回收不可控,就算你强制执行gc操作,也不一定就会马上执行