Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在struts操作中运行无限循环:错误_Java_Struts - Fatal编程技术网

Java 在struts操作中运行无限循环:错误

Java 在struts操作中运行无限循环:错误,java,struts,Java,Struts,我正在struts操作中运行一个无限循环。当tomcat上托管的java服务器启动时,它调用以下文件,其中包含无限循环 package Android; import dao.DBService; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; imp

我正在struts操作中运行一个无限循环。当tomcat上托管的java服务器启动时,它调用以下文件,其中包含无限循环

package Android;

import dao.DBService;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.sql.ResultSet;
import java.util.Properties;
import javax.mail.*;
import javax.net.ssl.HttpsURLConnection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.json.JSONObject;

public class MainThread extends org.apache.struts.action.Action {

    private static final String SUCCESS = "success";


    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        PrintWriter out=response.getWriter();
        out.print("hii<br/>");
        //String flag = "1";
            //String q = "select count(*) from info;";
        int t = -1;
        while(t<0){
        String q = "select * from info;";
        ResultSet rs = DBService.selectData(q);

            while(rs.next())
            {
                int change = uidChange(rs.getString(1), rs.getString(2), rs.getString(4),out);  //Function that checks for a new mail

                if(change==1 && rs.getString(5).equals("1"))// && rs.getString(5) == 1)
                {
                    int res = sendNotification(rs.getString(3)); //sending notification to GCM Server
                    if(res == 200)
                    {
                        q = "update info set flag = '0' where username = '"+rs.getString(1)+"';";                    
                        DBService.updateData(q);
                    }                    
                }
            }   

       }
        return mapping.findForward(SUCCESS);
    }

    public int uidChange(String usn, String pwd, String lastuid, PrintWriter out)
    {
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "imaps");
    props.put("mail.imaps.ssl.trust", "*");
        try {
            Session session = Session.getInstance(props, null);
            Store store = session.getStore();
            store.connect("****", usn, pwd);  //Real store location in original code

            Folder inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);


            UIDFolder in = (UIDFolder) inbox;
            Message[] msg1 = inbox.getMessages();
            long highuid = in.getUID(msg1[msg1.length-1]);

                        inbox.close(true);
                        store.close();

                        if(highuid>Long.parseLong(lastuid))
                            return 1;
                        else
                            return 0;   
        } catch (Exception mex) {

                        return 2;
        }
    }



   public int sendNotification(String regid) throws Exception
   {

        String url = "https://android.googleapis.com/gcm/send";
        URL obj = new URL(url);
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

        //add request header
                String s="New Mail";
        con.setRequestMethod("POST");
                String KEY = "application/json";
        con.setRequestProperty("Content-Type", "application/json");
        con.setRequestProperty("Authorization", "key=***"); //Real key in the original code

        String urlParameters = "{ \"data\": {\n"
                        + "\"msg\": \"" + s + "\"\n"
                        + "},\n"
                        + "\"registration_ids\": [ \""+regid+"\" ] \n"
                        + "}"; 

        // Send post request
        con.setDoOutput(true);
                JSONObject json = new JSONObject(urlParameters);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
                wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();               
        return con.getResponseCode();
    }
}
它可以正常运行30分钟左右,但过了一段时间,我得到java.lang.OutOfMemoryError:java堆空间异常。完整跟踪如下所示:

例外情况

javax.servlet.ServletException: The HTTP Monitor server side component intercepted and rethrew an error while processing a JSP or servlet. Please see the stack trace under the root cause message below to identify the problem.
    org.netbeans.modules.web.monitor.server.MonitorFilter.rethrow(MonitorFilter.java:1656)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:473)
根本原因

java.lang.OutOfMemoryError: Java heap space
    sun.security.provider.DigestBase.engineDigest(DigestBase.java:163)
    java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:576)
    java.security.MessageDigest.digest(MessageDigest.java:353)
    com.sun.crypto.provider.HmacCore.doFinal(HmacCore.java:207)
    com.sun.crypto.provider.HmacSHA1.engineDoFinal(HmacSHA1.java:110)
    javax.crypto.Mac.doFinal(Mac.java:546)
    sun.security.ssl.MAC.compute(MAC.java:252)
    sun.security.ssl.MAC.compute(MAC.java:160)
    sun.security.ssl.InputRecord.checkMacTags(InputRecord.java:243)
    sun.security.ssl.InputRecord.decrypt(InputRecord.java:194)
    sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:969)
    sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
    com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:124)
    java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    java.io.BufferedInputStream.read(BufferedInputStream.java:254)
    com.sun.mail.iap.ResponseInputStream.readResponse(ResponseInputStream.java:95)
    com.sun.mail.iap.Response.<init>(Response.java:95)
    com.sun.mail.imap.protocol.IMAPResponse.<init>(IMAPResponse.java:60)
    com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:293)
    com.sun.mail.iap.Protocol.command(Protocol.java:313)
    com.sun.mail.imap.protocol.IMAPProtocol.examine(IMAPProtocol.java:952)
    com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:974)
    com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:919)
    Android.MainThread.uidChange(MainThread.java:100)
    Android.MainThread.execute(MainThread.java:59)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.

而t<0是罪魁祸首。你没有在任何地方增加变量t的值,因此它总是-1,它小于0

你能粘贴uidChange的代码吗?你从循环中调用的方法之一是,你没有向我们显示它们的代码,导致创建新对象,并在某个地方保留它们的引用,防止它们被复制垃圾收集。最终你会耗尽内存。你得挖得更深一点。您可能需要使用一个好的堆分析器工具。如果您使用的是Eclipse,那么就有。还有一个经典。根本原因似乎是uidChange,但一定要在执行结束时调用rs.close来关闭结果集。@music\u coder症状在uidChange中显示出来,但泄漏可能在任何地方。@Wamiq仅仅通过查看您发布的代码就很难判断。这是一个需要调试的非常重要的问题。不幸的是,您将不得不自己进行更多的调试。你看过我推荐的堆分析工具吗?它们是专门设计来帮助你追踪像这样的漏洞的。这就是我在循环中无限运行代码所做的。有没有其他方法可以无限地运行一段代码…对不起,我没有正确地阅读这个问题,尽管无限循环是个问题。当内存不足时,能否请您进行堆转储并对其进行分析,以了解是什么占用了内存。如果您自己的应用程序对象占用了空间,您将知道问题所在。
java.lang.OutOfMemoryError: Java heap space
    sun.security.provider.DigestBase.engineDigest(DigestBase.java:163)
    java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:576)
    java.security.MessageDigest.digest(MessageDigest.java:353)
    com.sun.crypto.provider.HmacCore.doFinal(HmacCore.java:207)
    com.sun.crypto.provider.HmacSHA1.engineDoFinal(HmacSHA1.java:110)
    javax.crypto.Mac.doFinal(Mac.java:546)
    sun.security.ssl.MAC.compute(MAC.java:252)
    sun.security.ssl.MAC.compute(MAC.java:160)
    sun.security.ssl.InputRecord.checkMacTags(InputRecord.java:243)
    sun.security.ssl.InputRecord.decrypt(InputRecord.java:194)
    sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:969)
    sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
    com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:124)
    java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    java.io.BufferedInputStream.read(BufferedInputStream.java:254)
    com.sun.mail.iap.ResponseInputStream.readResponse(ResponseInputStream.java:95)
    com.sun.mail.iap.Response.<init>(Response.java:95)
    com.sun.mail.imap.protocol.IMAPResponse.<init>(IMAPResponse.java:60)
    com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:293)
    com.sun.mail.iap.Protocol.command(Protocol.java:313)
    com.sun.mail.imap.protocol.IMAPProtocol.examine(IMAPProtocol.java:952)
    com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:974)
    com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:919)
    Android.MainThread.uidChange(MainThread.java:100)
    Android.MainThread.execute(MainThread.java:59)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.