From a1118b3717bd0751f3f4be2a0bb296d5e7543307 Mon Sep 17 00:00:00 2001 From: markt Date: Fri, 12 Feb 2010 17:51:06 +0000 Subject: [PATCH] Add a find leaks option - with a suitable warning to the manager app (html & text) git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@909528 13f79535-47bb-0310-9956-ffa450edef68 --- .../catalina/manager/HTMLManagerServlet.java | 87 +++++++++++++++++++--- .../catalina/manager/LocalStrings.properties | 7 ++ .../apache/catalina/manager/ManagerServlet.java | 22 ++++++ 3 files changed, 106 insertions(+), 10 deletions(-) diff --git a/java/org/apache/catalina/manager/HTMLManagerServlet.java b/java/org/apache/catalina/manager/HTMLManagerServlet.java index f462c5d1b..93de53d81 100644 --- a/java/org/apache/catalina/manager/HTMLManagerServlet.java +++ b/java/org/apache/catalina/manager/HTMLManagerServlet.java @@ -218,6 +218,8 @@ public final class HTMLManagerServlet extends ManagerServlet { message = start(path); } else if (command.equals("/stop")) { message = stop(path); + } else if (command.equals("/findleaks")) { + message = findleaks(); } else { // Try GET doGet(request,response); @@ -616,6 +618,17 @@ public final class HTMLManagerServlet extends ManagerServlet { args[4] = newNonce; writer.print(MessageFormat.format(UPLOAD_SECTION, args)); + // Diagnostics section + args = new Object[6]; + args[0] = sm.getString("htmlManagerServlet.diagnosticsTitle"); + args[1] = sm.getString("htmlManagerServlet.diagnosticsLeak"); + args[2] = response.encodeURL( + request.getContextPath() + "/html/findleaks"); + args[3] = newNonce; + args[4] = sm.getString("htmlManagerServlet.diagnosticsLeakWarning"); + args[5] = sm.getString("htmlManagerServlet.diagnosticsLeakButton"); + writer.print(MessageFormat.format(DIAGNOSTICS_SECTION, args)); + // Server Header Section args = new Object[7]; args[0] = sm.getString("htmlManagerServlet.serverTitle"); @@ -751,6 +764,33 @@ public final class HTMLManagerServlet extends ManagerServlet { } /** + * Find potential memory leaks caused by web application reload. + * + * @see ManagerServlet#findleaks(PrintWriter) + * + * @return message String + */ + protected String findleaks() { + + StringBuilder msg = new StringBuilder(); + + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + + super.findleaks(printWriter); + + if (stringWriter.getBuffer().length() > 0) { + msg.append(sm.getString("htmlManagerServlet.findleaksList")); + msg.append(stringWriter.toString()); + } else { + msg.append(sm.getString("htmlManagerServlet.findleaksNone")); + } + + return msg.toString(); + } + + + /** * @see javax.servlet.Servlet#getServletInfo() */ @Override @@ -1126,7 +1166,7 @@ public final class HTMLManagerServlet extends ManagerServlet { " \n" + "
\n" + " \n" + - " " + "   {10}  {12} \n" + " \n" + "
\n" + @@ -1137,11 +1177,11 @@ public final class HTMLManagerServlet extends ManagerServlet { " \n" + "  {1} \n" + "
" + - " " + " " + "
\n" + "
" + - " " + " " + "
\n" + "
" + @@ -1153,7 +1193,7 @@ public final class HTMLManagerServlet extends ManagerServlet { " \n" + " \n" + " \n" + - " " + "   {10}  {12} \n" + " \n" + "
\n" + @@ -1163,13 +1203,13 @@ public final class HTMLManagerServlet extends ManagerServlet { private static final String STOPPED_DEPLOYED_APPS_ROW_BUTTON_SECTION = " \n" + "
" + - " " + " " + "
\n" + "  {3} \n" + "  {5} \n" + "
" + - " " + " " + "
\n" + " \n" + @@ -1179,11 +1219,11 @@ public final class HTMLManagerServlet extends ManagerServlet { " \n" + "  {1} \n" + "
" + - " " + " " + "
\n" + "
" + - " " + " " + "
\n" + "  {7} \n" + @@ -1193,7 +1233,7 @@ public final class HTMLManagerServlet extends ManagerServlet { private static final String STOPPED_NONDEPLOYED_APPS_ROW_BUTTON_SECTION = " \n" + "
" + - " " + " " + "
\n" + "  {3} \n" + @@ -1215,7 +1255,7 @@ public final class HTMLManagerServlet extends ManagerServlet { "\n" + " \n" + "
\n" + - "" + "\n" + "\n" + "
\n" + @@ -1285,4 +1325,31 @@ public final class HTMLManagerServlet extends ManagerServlet { "
\n" + "\n"; + private static final String DIAGNOSTICS_SECTION = + "\n" + + "\n" + + " \n" + + "\n" + + "\n" + + " \n" + + "\n" + + "\n" + + " \n" + + "\n" + + "
{0}
{1}
\n" + + "\n" + + "" + + "\n" + + "\n" + + " \n" + + " \n" + + "\n" + + "
\n" + + " \n" + + " \n" + + " {4}\n" + + "
\n" + + "\n" + + "
\n" + + "
"; } diff --git a/java/org/apache/catalina/manager/LocalStrings.properties b/java/org/apache/catalina/manager/LocalStrings.properties index 867d3f849..4032f2292 100644 --- a/java/org/apache/catalina/manager/LocalStrings.properties +++ b/java/org/apache/catalina/manager/LocalStrings.properties @@ -43,6 +43,12 @@ htmlManagerServlet.deployUploadNotWar=FAIL - File uploaded \"{0}\" must be a .wa htmlManagerServlet.deployUploadNoFile=FAIL - File upload failed, no file htmlManagerServlet.deployUploadWarExists=FAIL - War file \"{0}\" already exists on server htmlManagerServlet.deployWar=WAR or Directory URL: +htmlManagerServlet.diagnosticsLeak=Check to see if a web application has caused a memory leak on reload +htmlManagerServlet.diagnosticsLeakButton=Find leaks +htmlManagerServlet.diagnosticsLeakWarning=This diagnostic check will trigger a full garbage collection. Use it with extreme caution on production systems. +htmlManagerServlet.diagnosticsTitle=Diagnostics +htmlManagerServlet.findleaksList=The following web applications appear to have triggered a memory leak on reload (use a profiler to confirm):\n +htmlManagerServlet.findleaksNone=No web applications appear to have triggered a memory leak on reload. htmlManagerServlet.list=List Applications htmlManagerServlet.manager=Manager htmlManagerServlet.messageLabel=Message: @@ -64,6 +70,7 @@ managerServlet.deployed=OK - Deployed application at context path {0} managerServlet.deployFailed=FAIL - Failed to deploy application at context path {0} managerServlet.deployedButNotStarted=FAIL - Deployed application at context path {0} but context failed to start managerServlet.exception=FAIL - Encountered exception {0} +managerServlet.findleaksFail=FAIL - Find leaks failed: Host not instance of StandardHost managerServlet.invalidPath=FAIL - Invalid context path {0} was specified managerServlet.invalidWar=FAIL - Invalid application URL {0} was specified managerServlet.listed=OK - Listed applications for virtual host {0} diff --git a/java/org/apache/catalina/manager/ManagerServlet.java b/java/org/apache/catalina/manager/ManagerServlet.java index 4de80bb89..00fd10a42 100644 --- a/java/org/apache/catalina/manager/ManagerServlet.java +++ b/java/org/apache/catalina/manager/ManagerServlet.java @@ -53,6 +53,7 @@ import org.apache.catalina.Server; import org.apache.catalina.Session; import org.apache.catalina.UserDatabase; import org.apache.catalina.Wrapper; +import org.apache.catalina.core.StandardHost; import org.apache.catalina.core.StandardServer; import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; @@ -364,6 +365,8 @@ public class ManagerServlet stop(writer, path); } else if (command.equals("/undeploy")) { undeploy(writer, path); + } else if (command.equals("/findleaks")) { + findleaks(writer); } else { writer.println(sm.getString("managerServlet.unknownCommand", command)); @@ -497,6 +500,25 @@ public class ManagerServlet /** + * Find potential memory leaks caused by web application reload. + */ + protected void findleaks(PrintWriter writer) { + + if (!(host instanceof StandardHost)) { + writer.println(sm.getString("managerServlet.findleaksFail")); + return; + } + + String[] results = + ((StandardHost) host).findReloadedContextMemoryLeaks(); + + for (String result : results) { + writer.println(result); + } + } + + + /** * Store server configuration. * * @param path Optional context path to save -- 2.11.0