在我们之前的测试中,如果你访问你的WEB站点URL时不加任何上下文,实际上你看到的web界面是系统自带的测试页面index.jsp,位于/site/wwwroot/webapps/ROOT目录下,是Tomcat默认的根目录。
1 <%@ page import="java.lang.management.*" %> 2 3 <% 4 5 ArrayList<String> mainPageProps = new ArrayList<String>(); 6 7 …… 8 9 …… 10 11 int MB=1024*1024; 12 13 Runtime runtime = Runtime.getRuntime(); 14 15 out.print("<tr><td>Runtime Total memory:</td><td>" + runtime.totalMemory()/MB+"M</td></tr>"); 16 17 out.print("<tr><td>Runtime Free memory:</td><td>" + runtime.freeMemory()/MB+"M</td></tr>"); 18 19 out.print("<tr><td>Runtime Used memory:</td><td>" + (runtime.totalMemory() - runtime.freeMemory())/MB+"M</td></tr>"); 20 21 out.print("<tr><td>Runtime Max memory:</td><td>" + runtime.maxMemory()/MB+"M</td></tr>"); 22 23 24 25 Iterator iter = ManagementFactory.getMemoryPoolMXBeans().iterator(); 26 27 28 29 out.print("<tr><td><h3>Memory MXBean</h3></td></tr>"); 30 31 out.print("<tr><td>Heap Memory Usage:</td><td>" + ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()+"</td></tr>"); 32 33 out.print("<tr><td>Non-Heap Memory Usage:</td><td>" + ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()+"</td></tr>"); 34 35 out.print("<tr><td><h3>Memory Pool MXBeans</h3></td></tr>"); 36 37 38 39 while (iter.hasNext()) { 40 41 MemoryPoolMXBean item = (MemoryPoolMXBean) iter.next(); 42 43 out.print("<tr><td><b>"+item.getName()+"</b></td></tr>"); 44 45 out.print("<tr><td>Type:</td><td>" + item.getType()+"</td></tr>"); 46 47 out.print("<tr><td>Usage:</td><td>" + item.getUsage()+"</td></tr>"); 48 49 out.print("<tr><td>Peak Usage:</td><td>" + item.getPeakUsage()+"</td></tr>"); 50 51 out.print("<tr><td>Collection Usage:</td><td>" + item.getCollectionUsage()+"</td></tr>"); 52 53 } 54 55 %>
对于PermGen大小,初始大小为:
init = 22020096(21504K) used = 41871616(40890K) committed = 41943040(40960K) max = 85983232(83968K)
这个时候你会看到默认的heap size也发生了变化:
那么Azure是如何调整Tomcat的运行环境和配置的呢?这样动态的调整是如何做到的呢?
其实没有什么magic,Azure的website底层是Windows Server,采用IIS来对其他第三方的服务器例如Tomcat进行管理。IIS有一个管理模块,叫做HttpPlatformHandler,他会做这么几件事情:
那么经由上述介绍你可以知道,在Azure website这个PAAS平台上,如果我们需要做些定制化环境部署,需要使用这个机制,由HttpPlatformHandler通过web.config配置文件来实现。
在本测试场景中,我们假定用户需要修改默认运行环境下的heap size和PemGen的大小,因为在常见的Java应用错误中,出现的OutOfMemory错误,有些就是由于PermGen大小设置过小引起的。
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <configuration> 4 5 <system.webServer> 6 7 <handlers> 8 9 <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" /> 10 11 </handlers> 12 13 <httpPlatform processPath="%AZURE_TOMCAT7_HOME%\bin\startup.bat" 14 15 arguments=""> 16 17 <environmentVariables> 18 19 <environmentVariable name="CATALINA_OPTS" value="-Dport.http=%HTTP_PLATFORM_PORT%" /> 20 21 <environmentVariable name="JAVA_OPTS" value="-Djava.net.preferIPv4Stack=true -Xms256m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m" /> 22 23 </environmentVariables> 24 25 </httpPlatform> 26 27 </system.webServer> 28 29 </configuration>
注意事项:
Heap Size:
Heap Memory Usage: init = 58712896(57336K) used = 150252200(146730K) committed = 360710144(352256K) max = 835190784(815616K)
Perm Gen:
Usage: init = 22020096(21504K) used = 42138168(41150K) committed = 42467328(41472K) max = 85983232(83968K)
Heap Memory Usage: init = 536870912(524288K) used = 118235616(115464K) committed = 660602880(645120K) max = 954728448(932352K)
Usage: init = 134217728(131072K) used = 37151352(36280K) committed = 134217728(131072K) max = 268435456(262144K)
可以看到,通过web.config和HttpPlatformHandler机制,可以对Azure的站点进行定制。
原文:http://www.cnblogs.com/cloudapps/p/5202389.html