實例詳解java日誌相關技術(java中日誌的作用)

本文目錄一覽:

java方面主流的技術有哪些

Structs hibernate spring Struts

Struts是一個基於Sun J2EE平台的MVC框架,主要是採用Servlet和JSP技術來實現的。

Struts框架可分為以下四個主要部分,其中三個就和MVC模式緊密相關:

1、模型(Model),本質上來說在Struts中Model是一個Action類(這個會在後面詳細討論),開發者通過其實現商業邏輯,同時用戶請求通過控制器(Controller)向Action的轉發過程是基於由struts-config.xml文件描述的配置信息的。

2、視圖(View),View是由與控制器Servlet配合工作的一整套JSP定製標籤庫構成,利用她們我們可以快速建立應用系統的界面。

3、控制器(Controller),本質上是一個Servlet,將客戶端請求轉發到相應的Action類。

4、一堆用來做XML文件解析的工具包,Struts是用XML來描述如何自動產生一些JavaBean的屬性的,此外Struts還利用XML來描述在國際化應用中的用戶提示信息的(這樣一來就實現了應用系統的多語言支持)。

Spring

Spring是輕量級的J2EE應用程序框架。

Spring的核心是個輕量級容器(container),實現了IoC(Inversion of Control)模式的容器,Spring的目標是實現一個全方位的整合框架,在Spring框架下實現多個子框架的組合,這些子框架之間彼此可以獨立,也可以使用其它的框架方案加以替代,Spring希望提供one-stop shop的框架整合方案 。

Spring不會特別去提出一些子框架來與現有的OpenSource框架競爭,除非它覺得所提出的框架夠新夠好,例如Spring有自己的 MVC框架方案,因為它覺得現有的MVC方案有很多可以改進的地方,但它不強迫您使用它提供的方案,您可以選用您所希望的框架來取代其子框架,例如您仍可以在Spring中整合您的Struts框架 。

Spring的核心概念是IoC,IoC的抽象概念是「依賴關係的轉移」,像是「高層模組不應該依賴低層模組,而是模組都必須依賴於抽象」是 IoC的一種表現,「實現必須依賴抽象,而不是抽象依賴實現」也是IoC的一種表現,「應用程序不應依賴於容器,而是容器服務於應用程序」也是IoC的一種表現。

Spring的架構性的好處

Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的framework,你會發現Spring關注了遺留下的問題。

.Spring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統的可測試性和面向對象特性。

Spring 能消除使用各種各樣格式的屬性定製文件的需要,在整個應用和工程中,可通過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。Spring能通過介面而不是類促進好的編程習慣,減少編程代價到幾乎為零。

.Spring被設計為讓使用它創建的應用儘可能少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。

.使用Spring構建的應用程序易於單元測試。

.Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務介面,卻不會影響調用代碼。

.Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web應用。例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的資料庫打交道,甚至不需要JTA實現。

.Spring為數據存取提供了一致的框架,不論是使用JDBC或O/R mapping產品(如Hibernate)。

Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。

Spring能做什麼?

Spring提供許多功能,在此我將快速地依次展示其各個主要方面。

任務描述:

首先,讓我們明確Spring範圍。儘管Spring覆蓋了許多方面,但我們已經有清楚的概念,它什麼應該涉及和什麼不應該涉及。

Spring的主要目的是使J2EE易用和促進好編程習慣。

Spring 不重新開發已有的東西。因此,在Spring中你將發現沒有日誌記錄的包,沒有連接池,沒有分布事務調度。這些均有開源項目提供(例如 Commons Logging 用來做所有的日誌輸出,或Commons DBCP用來作數據連接池),或由你的應用程序伺服器提供。因為同樣的的原因,我們沒有提供O/R mapping層,對此,已有有好的解決辦法如Hibernate和JDO。

Spring的目標是使已存在的技術更加易用。例如,儘管我們沒有底層事務協調處理,但我們提供了一個抽象層覆蓋了JTA或任何其他的事務策略。

Spring沒有直接和其他的開源項目競爭,除非我們感到我們能提供新的一些東西。例如,象許多開發人員,我們從來沒有為Struts高興過,並且感到在MVC web framework中還有改進的餘地。在某些領域,例如輕量級的 IoC容器和AOP框架,Spring有直接的競爭,但是在這些領域還沒有已經較為流行的解決方案。(Spring在這些區域是開路先鋒。)

Spring也得益於內在的一致性。

所有的開發者都在唱同樣的的讚歌,基礎想法依然是Expert One-on-One J2EE設計與開發的那些。

並且我們已經能夠使用一些主要的概念,例如倒置控制,來處理多個領域。

Spring在應用伺服器之間是可移植的。

當然保證可移植性總是一次挑戰,但是我們避免任何特定平台或非標準化,並且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的應用伺服器上的用戶。

Spring的核心即是個IoC/DI的容器,它可以幫程序設計人員完成組件之間的依賴關係注入,使得組件之間的依賴達到最小,進而提高組件的重用性,Spring是個低侵入性(invasive)的框架,Spring中的組件並不會意識到它正置身於Spring中,這使得組件可以輕易的從框架中脫離,而幾乎不用任何的修改,反過來說,組件也可以簡單的方式加入至框架中,使得組件甚至框架的整合變得容易。

Spring最為人重視的另一方面是支持AOP(Aspect-Oriented Programming),然而AOP框架只是Spring支持的一個子框架,說Spring框架是AOP框架並不是一件適當的描述,人們對於新奇的 AOP關注映射至Spring上,使得人們對於Spring的關注集中在它的AOP框架上,雖然有所誤解,但也突顯了Spring的另一個令人關注的特色。

Spring也提供MVC Web框架的解決方案,但您也可以將自己所熟悉的MVC Web框架與Spring解合,像是Struts、Webwork等等,都可以與Spring整合而成為進用於自己的解決方案。Spring也提供其它方面的整合,像是持久層的整合如JDBC、O/R Mapping工具(Hibernate、iBATIS)、事務處理等等,Spring作了對多方面整合的努力,故說Spring是個全方位的應用程序框架。

AJAX

AJAX

全稱「Asynchronous JavaScript and XML」(非同步JavaScript和XML),是指一種創建互動式網頁應用的網頁開發技術。它有機地包含了以下幾種技術:基於web標準(standards-based presentation)XHTML+CSS的表示; 使用 DOM(Document Object Model)進行動態顯示及交互; 使用 XML 和 XSLT 進行數據交換及相關操作; 使用 XMLHttpRequest 進行非同步數據查詢、檢索;使用 JavaScript 將所有的東西綁定在一起。

類似於DHTML或LAMP,AJAX不是指一種單一的技術,而是有機地利用了一系列相關的技術。事實上,一些基於AJAX的「派生/合成」式(derivative/composite)的技術正在出現,如「AFLAX」。

ajax優勢

傳統的web應用允許用戶填寫表單(form),當提交表單時就向web伺服器發送一個請求。伺服器接收並處理傳來的表單,然後返回一個新的網頁。這個做法浪費了許多帶寬,因為在前後兩個頁面中的大部分HTML代碼往往是相同的。由於每次應用的交互都需要向伺服器發送請求,應用的響應時間就依賴於伺服器的響應時間。這導致了用戶界面的響應比本地應用慢得多。與此不同,AJAX應用可以僅向伺服器發送並取回必需的數據,它使用SOAP或其它一些基於XML的web service介面,並在客戶端採用JavaScript處理來自伺服器的響應。因為在伺服器和瀏覽器之間交換的數據大量減少,結果我們就能看到響應更快的應用。同時很多的處理工作可以在發出請求的客戶端機器上完成,所以Web伺服器的處理時間也減少了。

Hibernate

Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了輕量級的對象封裝,使得Java程序員可以使用對象編程思維來操縱資料庫。Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化。它還可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序實用,也可以在Servlet/JSP的Web應用中使用

Hibernate不會對您造成妨礙,也不會強迫您修改對象的行為方式。它們不需要實現任何不可思議的介面以便能夠持續存在。惟一需要做的就是創建一份XML「映射文檔」,告訴Hibernate您希望能夠保存在資料庫中的類,以及它們如何關聯到該資料庫中的表和列,然後就可以要求它以對象的形式獲取數據,或者把對象保存為數據。與其他解決方案相比,它幾乎已經很完美了。

運行時,Hibernate讀取映射文檔,然後動態構建Java類,以便管理資料庫與Java之間的轉換。在Hibernate中有一個簡單而直觀的API,用於對資料庫所表示的對象執行查詢。要修改這些對象,(一般情況下)只需在程序中與它們進行交互,然後告訴Hibernate保存修改即可。類似地,創建新對象也很簡單;只需以常規方式創建它們,然後告訴Hibernate有關它們的信息,這樣就能在資料庫中保存它們。

Hibernate API學習起來很簡單,而且它與程序流的交互相當自然。在適當的位置調用它,就可以達成目的。它帶來了很多自動化和代碼節省方面的好處,所以花一點時間學習它是值得的。而且還可以獲得另一個好處,即代碼不用關心要使用的資料庫種類(否則的話甚至必須知道)。我所在的公司就曾有過在開發過程後期被迫更換資料庫廠商的經歷。這會造成巨大的災難,但是藉助於Hibernate,只需要簡單地修改Hibernate配置文件即可。

這裡的討論假定您已經通過創建Hibernate映射文檔,建立了一個關係資料庫,並且擁有要映射的Java類。有一個Hibernate「工具集」可在編譯時使用,以支持不同的工作流。例如,如果您已經擁有Java類和映射文檔,Hibernate可以為您創建(或更新)必需的資料庫表。或者,僅僅從映射文檔開始,Hibernate也能夠生成數據類。或者,它可以反向設計您的資料庫和類,從而擬定映射文檔。還有一些用於Eclipse的alpha 插件,它們可以在IDE中提供智能的編輯支持以及對這些工具的圖形訪問。

如果您使用的是Hibernate 2環境,這些工具鮮有提供,但是存在可用的第三方工具。

使用Hibernate的場合

既然Hibernate看起來如此靈活好用,為什麼還要使用其他的工具呢?下面有一些場景,可以幫助您做出判斷(或許通過提供一些比較和上下文,可以有助於鑒別非常適用Hibernate的場合)。

如果應用對於數據存儲的需要十分簡單——例如,您只想管理一組用戶優先選擇——您根本不需要資料庫,更不用說一個優秀的對象-關係映射系統了(即使它也如Hibernate這般易於使用)!從Java 1.4開始,有一個標準的Java Preferences API可以很好地發揮這個作用。(在ONJava文章中可以找到有關Preferences API的更多信息。)

對於熟悉使用關係資料庫和了解如何執行完美的SQL查詢與企業資料庫交互的人來說,Hibernate似乎有些礙手礙腳,這就像帶有動力和自動排擋的快艇車會使注重性能的賽車駕駛員不耐煩一樣。如果您屬於這種人,如果您所在的項目團隊擁有一個強大的DBA,或者有一些存儲過程要處理,您可能想研究一下iBATIS。Hibernate的創建者本身就把iBATIS當作是另一種有趣的選擇。我對它很有興趣,因為我們曾為一個電子商務站點開發了一個類似的系統(其功能更為強大),而且從那時到現在,我們已經在其他環境中使用過它,儘管在發現Hibernate之後,在新項目中我們通常更喜歡使用Hibernate。您可以認為,以SQL為中心的解決方案(比如iBATIS)是「反向的」對象/關係映射工具,而Hibernate是一個更為傳統的ORM。

當然,還有其他的外部原因會導致採用另外的方法。比如,在一個企業環境中,必須使用成熟的EJB架構(或者其他的一些非普通對象映射系統)。可以為提供自己的數據存儲工具的平台量身定做代碼,比如Mac OS X’s Core Data。使用的可能是像XML DTD這樣的存儲規範,而它根本不涉及關係資料庫。

java開發需要掌握哪些技術?

第一階段,Java SE基礎:

Java環境搭建、Java流程式控制制語句-for循環、switch選擇判斷、循環嵌套、數組bai拷貝、多維數組、final關鍵字、構造函數的調用、類的訪問許可權和路徑、面向對象高級特性、Java異常處理、Set,Map,List介面及介面實現類、Java線程、同步阻塞、Java IO流、文件的操作,複製,讀寫,刪除等。

第二階段,JavaWeb:

MySQL安裝、管理、創建資料庫、MySQL UPDATE 查詢、Mysql高級操作、JDBC、JDBC資料庫連接操作,JDBC動態Sql處理、Servlet3.0 網頁重定向、Servlet3.0 新增的註解支持、AJAX、responseText屬性詳解等。

第三階段,Java高級框架-SSH:

Struts2 異常處理、Struts2+Log4j集成、Struts2和JSON實例、Hibernate5、Hibernate集合映射、Hibernate組件映射、Spring4.0、Spring AOP + AspectJ框架、Spring 與其它Web框架集成、Spring Hibernate支持等。

第四階段,Java高級框架-SSM:

SpringMVC、Spring MVC生成JSON數據、MyBatis、MyBatis 環境配置及入門、Mybatis set標籤、Mybatis trim標籤、Shiro、Shiro快速入門教程、Shiro Web應用等。

第五階段,SpringBoot+VUE全棧框架:

SpringBoot、全局異常處理、過濾器監聽器、EHCache緩存、SpringBoot Quartz定時任務、Vue、Vue.js 安裝、模板語法、計算屬性、事件處理器、Vue.js 自定義指令、Vue.js 路由等

第六階段,特色課程:

ActiveM環境搭建、生產者和消費者、消息持久化操作、RSA數字加密演算法、Codebar條形碼生成器、zxing二維碼生成器、HighCharts統計圖、Echarts統計圖、網路播放器ckplayer、嵌入式網路播放器,可以瀏覽器和移動端隨意使用

第七階段,互聯網框架的高級應用1:

分散式服務框架的理解,Dubbo架構設計詳解及其核心要點,框架運行原理分析、SpringData數據訪問、Lucene搜索引擎、Lucene的全文搜索伺服器介紹、索引建立方式、Solr海量數據搜索引擎、Socket網路通信、實現RMI遠程對象通訊、使用JMS消息服務、Kafka分散式消息系統、Web Service與Restful WS等

第八階段,互聯網框架的高級應用2:

Spring Security安全框架、實現Web應用安全控制、緩存應用與EhCache框架、OSCache與JBossCache框架、MyBatis與Hibernate緩存機制、NoSQL應用與SQL調優、MongoDB NoSQL資料庫、Redis內存資料庫、實現Redis Session共享、SQL語句的優化、實現資料庫讀寫分離、WEB應用集群及性能優化、Maven項目管理工具、Web伺服器負載均衡、實現Nginx與Tomcat集群、使用LoadRunner測試工具、性能優化之內存調優、代碼優化與重構的方法等。

對java有興趣的小夥伴們,不妨先從java入門開始!B站上有很多的java教學視頻,從基礎到高級的都有,還挺不錯的,知識點講的很細緻,還有完整版的學習路線圖。也可以自己去看看,下載學習試試。

java日誌的filter

Filter可以視作是servlet的加強版,主要用作對用戶的請求進行預處理,或者對返回給客戶端的結果進行再次加工,是一個典型的鏈式處理模式。本篇簡單介紹filter的基本使用方法,主要涉及以下內容:

Filter的背景知識

使用Filter的流程

Filter的生命周期

一個完整的實例

一、Filter的簡單介紹

Filter在英文中是過濾器的意思,當然在此處的使用也是完美的切合了它的意思,我們使用filter的主要目的就是完成一個過濾的作用。可以在一個請求到達servlet之前,將其截取進行邏輯判斷,然後決定是否放行到請求的servlet。也可以在一個response到達客戶端之前,截取結果進行邏輯判斷,然後決定是否允許返回給客戶端。所以filter有如下幾個種類:

用戶授權的filter:filter負責判斷用戶是否有許可權請求該頁面,給予過濾判斷

日誌filter:截取某個用戶在本網站上的所有請求,記錄軌跡

負責解碼的filter:規定處理本次請求的解碼方式

最後需要注意的是,一個filter過濾器可以加在多個servlet控制器上,當然多個filter過濾器也是可以加在一個servlet控制器上的。由此也是可以看出來,我們使用filter往往是對一些公共的操作進行處理,例如:判斷用戶許可權,解碼本次請求等,還比如,我們的web應用中某些頁面是需要用戶登錄後才能訪問的,以往我們都是在每個servlet頁面加上判斷控制,導致代碼冗餘,有了filter,我們可以定義一個實現了filter的過濾器,讓需要判斷是否登錄的頁面都加上這麼一個過濾器,可以大大降低代碼的冗餘程度。

二、Filter的使用流程

在Java中如果想要自定義一個filter過濾器的話,需要繼承Javax.servlet.Filter介面,這個介面中只有三個方法:

default void init(FilterConfig filterConfig)void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3)default void destroy()

其中init和destroy方法是有默認實現的,也就是我們不是必須重寫這兩個方法,但是doFilter 這個方法是一個核心的方法,是我們必須要實現的。首先我們看init方法的作用,這個方法是用來初始化filter實例的,也就是當用戶請求了某個攔截器而此攔截器又匹配了某個過濾器,此時web容器就會定位到該過濾器然後創建該filter類的實例對象並調用此實例的init方法,完成初始化工作。對於destroy方法毋庸置疑就是在過濾器執行結束的時候調用,主要完成對一些資源的釋放。下面主要看dofilter這個方法。

doFilter方法是filter介面中的核心方法,一旦創建完該過濾器的實例之後,會執行dofilter方法,所有的過濾邏輯都是在此方法中進行的。主要有三個參數,第一個參數是一個ServletRequest對象,HttpServletRequest繼承於此介面,當用戶請求某個攔截器的時候,檢測到此請求存在過濾器,於是會封裝好本次請求的相關數據,傳遞給dofilter的ServletRequest參數,ServletResponse參數的來源和ServletRequest是一樣的,都是由客戶端封裝過來的。至於第三個參數,這是一個FilterChain處理鏈,詳細的介紹等說明了web.xml中配置filter之後。

第一步如上,創建一個繼承自filter介面的類,並實現其中的三個方法。第二步是在web.xml中配置該類用於過濾哪些攔截器。web.xml代碼如下:

?xml version=”1.0″ encoding=”UTF-8″?web-app xmlns=””

        xmlns:xsi=””

        xsi:schemaLocation=” “

        version=”3.1″

   !–定義filter–

   filter

       filter-nameisLogin/filter-name

       filter-classTest_f.MyFilter/filter-class

   /filter

   !–定義filter攔截的地址–

   filter-mapping

       filter-nameisLogin/filter-name

       url-pattern/a/url-pattern

   /filter-mapping

   filter-mapping

       filter-nameisLogin/filter-name

       url-pattern/b/url-pattern

   /filter-mapping/web-app

如上述的代碼,我們需要兩個操作,首先是定義一個filter,指定了該filter的name和相對應的過濾器類。然後我們可以通過filter-mapping映射過濾器和URL,此處使用了兩個映射,對該過濾器指定了對路徑名為/a和/b的請求進行攔截。當然這個url-pattern元素的值可以有以下三種形式,完全匹配(/a/b等),目錄匹配(/* 、 /abc/等),擴展名(.a,*.b等)。

了解了配置filter的主要操作之後,我們回去看過濾器類,我們說init方法是在首次創建filter實例的時候,用於執行初始化操作的,其中有個參數FilterConfig ,這是當前filter的配置信息,其中方法如下:

String getFilterName();ServletContext getServletContext();String getInitParameter(String var1);EnumerationString getInitParameterNames();

其實在創建filter實例的時候,web容器會將此實例對應在web.xml中的配置信息讀取並封裝成一個FilterConfig 對象傳遞給init方法,getFilterName方法就是我們在web.xml中配置的filter-name,getServletContext會獲取當前servlet的上下文,當我們在定義filter的時候使用init-param來定義一些初始化參數的時候,就可以使用此方法來獲取這些初始化參數。getInitParameterNames方法用於獲取所有初始化參數的枚舉集合。這樣我們在init方法中就可以獲取這些配置參數,初始化filter實例。

上面我們只定義了一個filter,如果我們對於一次請求需要執行多個filter,進行過濾操作的話,web容器會在你請求某個URL的時候,在web.xml中找到所有匹配的filter,按照註冊的順序以FilterChain 鏈的形式傳遞到方法doFilter的第三個參數中,而這個filterChain中只有一個方法:

void doFilter(ServletRequest var1, ServletResponse var2)

如果我們在 void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) 方法中調用var3.doFilter(var1,var2),就代表此filter實例結束,則web伺服器會檢查FilterChain對象中是否還有filter對象(因為這是一個鏈,filter的數量是大於等於一的),如果沒有就會放行,直接調用目標地址,如果還有filter對象,就會轉而執行下一個filter。正是由於這樣的機制,我們才可以對於一個URL請求添加多個filter過濾器。

三、一個簡單的實例

下面通過一個簡單的實例直觀的感受下filter過濾器的作用:

public class MyFilter implements Filter {    @Override

   public void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException{

       HttpServletRequest req = (HttpServletRequest)var1;

       HttpSession session = req.getSession();

       String state = (String)session.getAttribute(“state”);        if(state.equals(“1”)){

           var3.doFilter(var1,var2);

       }else{

           HttpServletResponse response =  (HttpServletResponse)var2;

           response.sendRedirect(“Error_page.html”);

       }

   }

}

//web.xml    filter

       filter-nameisLogin/filter-name

       filter-classTest_f.MyFilter/filter-class

   /filter

   !–定義filter攔截的地址–

   filter-mapping

       filter-nameisLogin/filter-name

       url-pattern/index.jsp/url-pattern

   /filter-mapping

%@ page contentType=”text/html;charset=UTF-8″ language=”java” %html

 head

   title/title

 /head

 body

   h1這是index頁面/h1

 /body/html

//set.jsp//為了使程序簡單,我們採用手動設置session//在實際的項目中,當用戶登錄之後自動設置session%@ page contentType=”text/html;charset=UTF-8″ language=”java” %html

 head

   title/title

 /head

 body

   %pageContext.getSession().setAttribute(“state”,”0″);%

 /body/html

我們首先訪問set.jsp頁面設置本次會話的session值,然後修改瀏覽器地址欄訪問index.jsp頁面

敲下回車鍵,結果如下:

我們先看,敲下回車鍵之後,程序怎麼執行的,因為我們在web.xml中配置了MyFilter的攔截URL為index.jsp,所以當我們訪問index.jsp的時候,會創建MyFilter 實例對象,封裝配置信息到FilterConfig對象中,然後封裝request請求和response,還有從web.xml 中讀取的FilterChain對象傳入MyFilter的doFilter方法中,我們在其中獲取本次會話的session對象,取得其中的數據,如果為一放行,否則跳轉到錯誤頁面。此處的state的session值為0,我們在set.jsp中設置的,大家也可以在set.jsp頁面設置其值為1,這樣最終的結果會是這樣的:

上述的demo只是為了簡單的演示,其實使用filter可以完成大大的降低我們的代碼的冗餘程度。這個例子是為了演示,所以很簡單。

四、Filter 的生命周期

當用戶請求某個頁面時候,會到web.xml中匹配是否存在能夠匹配上此次請求的filter,如果有封裝它的配置信息,FilterChain鏈。然後調用init方法,完成初始化,接著調用dofilter方法,處理核心邏輯,當此實例被銷毀的時候,會調用destroy方法。

Java的核心技術有哪些?

第一:Java虛擬機    Java虛擬機的主要任務是裝在class文件並且執行其中的位元組碼。Java虛擬機包含一個類裝載器,它可以從程序和API中裝載class文件。Java API中只有程序執行時需要的那些類才會被裝載。位元組碼由執行引擎來執行。不同的Java虛擬機中,執行引擎可能實現得非常不同。在由軟體實現的虛擬機中,最簡單的執行引擎就是一次性解釋位元組碼。另一種執行引擎更快,但是也更消耗內存,叫做”即時編譯器(just-in-time compiler)”。在這種情況下,第一次被執行的位元組碼會被編譯成本地機器代碼。編譯出的本地機器代碼會被緩存,當方法以後被調用的時候可以重用。第三種執行引擎是自適應優化器。在這種方法里,虛擬機開始的時候解釋位元組碼,但是會監視運行中程序的活動,並且記錄下使用最頻繁的代碼段。程序運行的時候,虛擬機只把那些活動最頻繁的代碼編譯成本地代碼,其他的代碼由於使用得不是很頻繁,繼續保留為位元組碼-由虛擬機繼續解釋它們。一個自適應的優化器可以使得Java虛擬機在80%~90%的時間裡執行被優化過的本地代碼,而只需要編譯10%~20%的對性能有影響的代碼。    當Java虛擬機是由主機操作系統上的軟體實現的時候,Java程序通過調用本地方法(native method)和主機交互。Java中有兩種方法: Java方法和本地方法。Java方法是由Java語言編寫,編譯成位元組碼文件,存儲在class文件中的。本地方法是由其他語言(比如c,c++或彙編語言)編寫的,編譯成何處理器相關的機器代碼。本地方法保存在動態鏈接庫中,格式是各個平台專有的。運行中Java程序調用本地方法時,虛擬機裝載包含這個本地方法的動態庫,並調用這個方法。本地方法是聯繫Java程序和底層主機操作系統的連接方法。

第二:類裝載器的體系結構    一個Java應用程序可以使用兩種類裝載器:”啟動(bootstrap)”類裝載器和用戶定義的類裝載器。啟動類裝載器(這是系統中唯一的)是Java虛擬機實現的一部分。啟動類裝載器通常使用某種默認方式從本地磁碟中裝載類,包括Java API類(啟動類裝載器也被稱為原始類裝載器、系統類裝載器或者默認類裝載器)。    Java應用程序能夠在運行時安裝用戶定義的類裝載器,這種類裝載器能夠使用自定義的方式來裝載類。例如,從網路下載class文件。儘管啟動類裝載器是虛擬機實現的本質部分,而用戶定義的類裝載器不是,但用戶定義的類裝載器能夠用Java來編寫,能夠被編譯成class文件,能夠被虛擬機裝載,還能夠像其它對象一樣實例化。    由於有用戶定義類裝載器,所以不必再編譯的時候就知道運行中的Java應用程序中最終會加入的所有的類。用戶定義的類裝載器使得在運行擴展Java應用程序成為可能。當它運行時,應用程序能夠解決它需要哪些額外的類,能夠決定是使用一個或是更多的用戶定義的類裝載器來裝載。由於類裝載器是用Java編寫的,所以用任何在Java代碼中可以表述的風格來進行類裝載。這些類可以通過網路下載,可以從某些資料庫中獲取,甚至可以動態生成。    每一個類被裝載的時候,Java虛擬機都監視這個類,看到它到底是被啟動類裝載器還是被用戶定義類裝載器裝載。當被裝載的類引用了另外一個類時,虛擬機就會使用裝載第一個類的類裝載器裝載引用的類。例如,如果虛擬機使用一個特定的類裝載器裝載Volcano這個類,它就會使用這個類裝載器裝載Volcano類使用的所有類。    由於Java虛擬機採取這種方式進行類的裝載,所以被裝載的類默認情況下只能看到被同一個類裝載器裝載的別的類。通過這種方法,Java的體系結構允許在一個Java應用程序中建立多個命名空間。運行時的Java程序中的每一個類裝載器都有自己的命名空間。    Java應用程序可以創建多少個(或多少種)被不同的類裝載器裝載的類存放在不同的命名空間中,它們不能相互訪問,除非應用程序顯示地允許這麼做。當編寫一個Java應用程序的時候,從不同源文件裝載的類可以分隔在不同的命名空間中。通過這種方法,就能夠使用Java類裝載器的體系結構來控制任何不同源文件中裝載的代碼之間的相互影響,特別是能夠阻止惡意代碼獲取訪問或破壞善意代碼的許可權。    Web瀏覽器是一個動態擴展的例子,Web瀏覽器使用用戶定義的類裝載器從網路下載用於Java applet的class文件。Web瀏覽器使用一個用來安裝用戶定義類裝載器的Java應用程序。這個用戶定義的類裝載器通常被稱為Java Applet類裝載器,它知道如何向HTTP伺服器請求class文件。Java Applet可以作為動態擴展的例子,因為Java應用程序並不知道它什麼時候會開始從網路下載瀏覽器請求的class文件。只有當瀏覽器遇到有Java applet的頁面時,才決定是否需要下載class文件。    Web瀏覽器啟動的Java應用程序通常為每個提供class文件的網路地址分別創建不同的用戶定義類裝載器,因此,不同的用戶定義類裝載器裝載不同來源的class文件。這就可以把它們分別放置在Java主機應用程序的不同命名空間之下。由於不同來源的Java applet文件放置在不同的命名空間中,惡意的Java applet代碼就不會直接訪問從別的地方下載的class文件。這就能夠限制或阻止不同來源的代碼之間的相互訪問。

第三:Java class文件    Java class文件主要在平台無關性和網路移動性方面使Java更適合網路。它在平台無關性方面的任務是:為Java程序提供獨立於底層主機平台的二進位形式的服務。這種途徑途徑打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程序通常首先被編譯,然後被連接成單獨的、專門支持特定硬體平台和操作系統的二進位文件。通常情況下,一個平台上的二進位可執行文件不能在其他平台上工作。而Java class文件時可以運行在任何支持Java虛擬機的硬體平台和操作系統上的二進位文件。    當編譯和連接一個C++程序時,所獲得的可執行二進位文件只能在指定的硬體平台和操作系統上運行,因為這個二進位文件包含了對目標處理器的機器語言。而Java編譯器把Java源文件的指令翻譯成位元組碼,這種位元組碼就是Java虛擬機的”機器語言”。class文件設計得緊湊,因此它們可以快速地在網路上傳送。其次,由於Java程序是動態連接和動態擴展的,class文件可以在需要的時候才下載。這個特點使得Java應用程序能夠安排從網路上下載class文件的時間,從而可以最大限度地減少終端用戶的等待時間。

第四:Java API    Java API通過支持平台無關性和安全性,使得Java適應於網路應用。Java API是運行庫的集合,它提供了一套訪問主機系統資源的標準方法。運行Java程序時,虛擬機裝載程序的class文件所使用的Java API class文件。所有被裝載的class文件(包括從應用程序中和從Java API中提取的)和所有已經裝載的動態庫(包含本地方法)共同組成了再Java虛擬機上運行的整個程序。    在一個平台能偶支持Java程序以前,必須在這個特定平台上明確地實現API的功能。為訪問主機上的本地資源,Java API調用了本地方法。由於Java API class文件調用了本地方法,Java程序就不需要再調用它們了。通過這種方法,Java API class文件為底層主機提供了具有平台無關性、標準介面的Java程序。對Java程序而言,無論平台內部如何,Java API都會有同樣的表現和可預測的行為。正是由於在每個特定的主機平台上明確地實現了Java虛擬機和Java API,因此,Java程序自身就能夠成為具有平台無關性的程序。    Java API在Java安全性模型方面也有貢獻。當Java API的方法進行任何有潛在危險的操作(比如進行本地磁碟寫操作)之前,都會通過查詢訪問控制器來檢驗是否得到了授權。訪問控制器是一個類,該類用來執行棧檢驗,已決定是否允許某種操作。

怎樣分析java線程堆棧日誌

itjobJava老師講過:1) 線程堆棧概述及基礎知識

2) 線程堆棧的生成原理以及相關工具

3) 不同JVM線程堆棧的格式的差異(Sun HotSpot、IBM JRE、Oracal JRockit)

4) 線程堆棧日誌介紹以及解析方法

5) 線程堆棧的分析和相關的技術

6) 常見的問題模板(線程竟態、死鎖、IO調用掛死、垃圾回收/OutOfMemoryError問題、死循環等)

7) 線程堆棧問題實例分析

我希望這一系列的培訓能給你帶來確實的幫助,所以請持續關注每周的文章更新。

但是如果我在學習過程中有疑問或者無法理解文章中的內容該怎麼辦?

不用擔心,把我當做你的導師就好。任何關於線程堆棧的問題都可以諮詢我(前提是問題不能太low)。請隨意選擇下面的幾種方式與我取得聯繫:

1) 直接本文下面發表評論(不好意思的話可以匿名)

2) 將你的線程堆棧數據提交到Root Cause Analysis forum

3) 發Email給我,地址是 @phcharbonneau@hotmail.com

能幫我分析我們產品上遇到的問題么?

當然可以,如果你願意的話可以把你的堆棧現場數據通過郵件或論壇 Root Cause Analysis forum發給我。處理實際問題是才是學習提升技能的王道。

我真心期望大家能夠喜歡這個培訓。所以我會盡我所能去為你提供高質量的材料,並回答大家的各種問題。

在介紹線程堆棧分析技術和問題模式之前,先要給大家講講基礎的內容。所以在這篇帖子里,我將先覆蓋到最基本的內容,這樣大家就能更好的去理解JVM、中間件、以及Java EE容器之間的交互。

Java VM 概述

Java虛擬機是Jave EE 平台的基礎。它是中間件和應用程序被部署和運行的地方。

JVM向中間件軟體和你的Java/Java EE程序提供了下面這些東西:

– (二進位形式的)Java / Java EE 程序運行環境

– 一些程序功能特性和工具 (IO 基礎設施,數據結構,線程管理,安全,監控 等等.)

– 藉助垃圾回收的動態內存分配與管理

你的JVM可以駐留在許多的操作系統 (Solaris, AIX, Windows 等等.)之上,並且能根據你的物理伺服器配置,你可以在每台物理/虛擬伺服器上安裝1到多個JVM進程.

JVM與中間件之間的交互

下面這張圖展示了JVM、中間件和應用程序之間的高層交互模型。

如你所見,標準Java EE應用程序的線程的分配實在中間件內核與JVM之間完成的。(當然也有例外,應用程序可以直接調用API來創建線程,這種做法並不常見,而且在使用的過程中也要特別的小心)

同時,請注意一些線程是由JVM內部來進行管理的,典型的例子就是垃圾回收線程,JVM內部使用這個線程來做並行的垃圾回收處理。

因為大多數的線程分配都是由Java EE容器完成的,所以能夠理解和認識線程堆棧跟蹤,並能從線程堆棧數據中識別出它來,對你而言很重要. 這可以讓你能夠快速的知道Java EE容器正要執行的是什麼類型的請求.

從一個線程轉儲堆棧的分析角度來看,你將能了解從JVM發現的線程池之間的不同,並識別出請求的類型.

最後一節會向你提供對於HotSop VM而言什麼是JVM線程堆棧的一個概述,還有你將會遇到的各種不同的線程. 而對 IBM VM 線程堆棧形式詳細內容將會在第四節向你提供.

請注意你可以從根本原因分析論壇獲得針對本文的線程堆棧示例.

JVM 線程堆棧——它是什麼?

JVM線程堆棧是一個給定時間的快照,它能向你提供所有被創建出來的Java線程的完整清單.

java程序中實現系統日誌功能怎麼做?就是用來記錄使用系統的操作記錄的那種,有例子的話更好,在線等候…

其實系統日誌就是在系統操作者完成操作的同時,記錄操作的詳細信息,這個記錄功能一般是在操作者完成操作同時進行處理的。例如,系統使用者對某一個表完成了插入操作,那麼插入操作完成的同時,加一行代碼,或者在插入操作調用的存儲過程中加一段向程序日誌表內插入一條操作信息!

以後想要知道操作人的操作信息,檢索操作日誌表就可以了!

先建立一個操作日誌表,通常不止一個,按照操作分類添加!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245537.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:09
下一篇 2024-12-12 13:09

相關推薦

  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • Cron執行日誌用法介紹

    本文將從多個方面對cron執行日誌進行詳細闡述,包括cron執行日誌的定義、cron執行日誌的產生原因、cron執行日誌的格式以及如何解讀cron執行日誌。 一、定義 Cron是一…

    編程 2025-04-29
  • Hibernate日誌列印sql參數

    本文將從多個方面介紹如何在Hibernate中列印SQL參數。Hibernate作為一種ORM框架,可以通過列印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 使用Snare服務收集日誌:完整教程

    本教程將介紹如何使用Snare服務收集Windows伺服器上的日誌,並將其發送到遠程伺服器進行集中管理。 一、安裝和配置Snare 1、下載Snare安裝程序並安裝。 https:…

    編程 2025-04-29
  • Log4j日誌列印到Systemout.log

    Log4j是Apache的一個強大的日誌組件,可以幫助開發者更好地管理日誌。在Java應用程序中,很多開發者都會選擇使用Log4j來實現日誌輸出。本文將介紹如何使用Log4j將日誌…

    編程 2025-04-28
  • @scope("prototype")的作用及應用

    本文將從以下幾個方面進行詳細闡述@scope(“prototype”)在編程開發中的作用和應用。 一、代碼復用 在開發中,往往會有很多地方需要復用同一個類的…

    編程 2025-04-28
  • Python中import sys的作用

    Python是一種非常強大的編程語言,它的標準庫提供了許多有用的模塊和函數。sys模塊是Python標準庫中的一個重要模塊,用於與Python解釋器和操作系統進行交互。它允許開發者…

    編程 2025-04-28
  • 如何在dolphinscheduler中運行chunjun任務實例

    本文將從多個方面對dolphinscheduler運行chunjun任務實例進行詳細的闡述,包括準備工作、chunjun任務配置、運行結果等方面。 一、準備工作 在運行chunju…

    編程 2025-04-28

發表回復

登錄後才能評論