Java 在struts操作中运行无限循环:错误
我正在struts操作中运行一个无限循环。当tomcat上托管的java服务器启动时,它调用以下文件,其中包含无限循环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
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.