程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 定制化Azure站點Java運行環境(3)

定制化Azure站點Java運行環境(3)

編輯:JAVA綜合教程

定制化Azure站點Java運行環境(3)


定制化Azure Website提供的默認的Tomcat和JDK環境

在我們之前的測試中,如果你訪問你的WEB站點URL時不加任何上下文,實際上你看到的web界面是系統自帶的測試頁面index.jsp,位於/site/wwwroot/webapps/ROOT目錄下,是Tomcat默認的根目錄。

由於要檢測JVM的usage信息以便確定,定制化修改的Java參數是否生效,所以我們需要寫一些測試代碼,打印出當前JVM的參數信息;首先使用FileZilla連接到你的網站,進入到/site/wwwroot/webapps/ROOT目錄下,下載index.jsp文件到本地。

我寫了一個簡單的測試程序,測試Java運行時heap size大小,使用ManagmentBeans獲得的JVM參數,已經上傳到了github,請直接下載,或者你也可以打開index.jsp文件添加相關代碼如下:

https://github.com/kingliantop/azurelabs/blob/master/Java/websites/index.jsp

<[email protected]="java.util.*"%>
<[email protected]="java.lang.management.*"%>
<%
ArrayListmainPageProps=newArrayList();
mainPageProps.add("java.version");
mainPageProps.add("java.vendor");
mainPageProps.add("os.arch");
mainPageProps.add("catalina.base");
mainPageProps.add("jetty.base");
mainPageProps.add("user.timezone");
for(Stringname:mainPageProps)
{
Stringvalue=System.getProperty(name);
if(value!=null)
{
out.print(""+name);
out.print(""+value);
out.print("");
}
}
intMB=1024*1024;
Runtimeruntime=Runtime.getRuntime();
out.print("RuntimeTotalmemory:"+runtime.totalMemory()/MB+"M");
out.print("RuntimeFreememory:"+runtime.freeMemory()/MB+"M");
out.print("RuntimeUsedmemory:"+(runtime.totalMemory()-runtime.freeMemory())/MB+"M");
out.print("RuntimeMaxmemory:"+runtime.maxMemory()/MB+"M");

Iteratoriter=ManagementFactory.getMemoryPoolMXBeans().iterator();

out.print("

MemoryMXBean

"); out.print("HeapMemoryUsage:"+ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()+""); out.print("Non-HeapMemoryUsage:"+ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()+""); out.print("

MemoryPoolMXBeans

"); while(iter.hasNext()){ MemoryPoolMXBeanitem=(MemoryPoolMXBean)iter.next(); out.print(""+item.getName()+""); out.print("Type:"+item.getType()+""); out.print("Usage:"+item.getUsage()+""); out.print("PeakUsage:"+item.getPeakUsage()+""); out.print("CollectionUsage:"+item.getCollectionUsage()+""); } %>

3. 上傳修改後的index.jsp文件到ROOT目錄下,覆蓋原來的文件,重新打開你的web站點主頁,你可以看到測試程序會打印出當前運行環境下內存大小,heap size,non-heap size大小等相關信息:\

4. 我們可以看到默認運行環境下,初始Heap大小為28664K,已經使用大約54M,最大內容使用量是433M,而當前測試環境使用的網站實例大小為小型,大約是一個core,1.75G內存:

\

對於PermGen大小,初始大小為:

init = 22020096(21504K) used = 41871616(40890K) committed = 41943040(40960K) max = 85983232(83968K)

 

5. 做個簡單的實驗,我們將web站點的實例升級,看看Azure website是否會自動根據當前系統實例的大小來調整JVM相關參數,在"縮放"頁面,我們將實例升級到中型實例,點擊保存:

\

這個時候你會看到默認的heap size也發生了變化:

\

那麼Azure是如何調整Tomcat的運行環境和配置的呢?這樣動態的調整是如何做到的呢?

其實沒有什麼magic,Azure的website底層是Windows Server,采用IIS來對其他第三方的服務器例如Tomcat進行管理。IIS有一個管理模塊,叫做HttpPlatformHandler,他會做這麼幾件事情:

  1. 所有以前直接處理Http請求的第三方應用服務器,如Tomcat,Jetty,Node.JS等等,HTTP請求都交由IIS來進行接受。

    由IIS接管的請求,都會被轉發至後台真正處理的服務器,比如Tomcat等等,作用類似於Nginx,apache httpd

    管理第三方程序,啟動第三方程序,設定啟動參數,定制化相應環境等等,所有這些操作都通過一個叫做web.config的文件來配置實現。

    那麼經由上述介紹你可以知道,在Azure website這個PAAS平台上,如果我們需要做些定制化環境部署,需要使用這個機制,由HttpPlatformHandler通過web.config配置文件來實現。

    在本測試場景中,我們假定用戶需要修改默認運行環境下的heap size和PermGen的大小,因為在常見的Java應用錯誤中,出現的OutOfMemory錯誤,有些就是由於PermGen大小設置過小引起的。

    1. 首先我們需要准備一個web.config文件,在本示例中我們使用Azure站點提供的Tomcat和JDK,我們需要配置的相關參數-Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m放在JAVA_OPTS下:

       

      注意事項:

      1. 默認的系統的tomcat路徑是"%AZURE_TOMCAT7_HOME%\bin\startup.bat",需要注意正確設置

        Java相關的參數設置放在JAVA_OPTS裡面如-Xms,-Xmx等

        2. 我們先來記錄一下,默認設置下的Heap size,PermGen等大小設置,刷新測試頁面,可以看到:\

        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)

        3.使用你的FTP工具,將web.config文件上傳到你的Azure站點根目錄/site/wwwroot:\

        4. 重新刷新頁面,你會看到相關JVM參數值已經發生了變化:

        \

        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的站點進行定制。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved