中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

無錫高端網(wǎng)站建設(shè)寧波seo搜索引擎優(yōu)化公司

無錫高端網(wǎng)站建設(shè),寧波seo搜索引擎優(yōu)化公司,自適應(yīng)網(wǎng)站制作,wordpress 字體設(shè)置Class 文件格式、執(zhí)行引擎主要以 Class 文件描述了存儲格式、類何時加載、如何連接、VM 如何執(zhí)行字節(jié)碼指令,這些動作基本都是 JVM 直接控制,用戶代碼無法干預(yù)和改變; 用戶可以干預(yù)的只有字節(jié)碼生成、類加載器兩部分,而這兩部分的…

Class 文件格式、執(zhí)行引擎主要以 Class 文件描述了存儲格式、類何時加載、如何連接、VM 如何執(zhí)行字節(jié)碼指令,這些動作基本都是 JVM 直接控制,用戶代碼無法干預(yù)和改變;

用戶可以干預(yù)的只有字節(jié)碼生成、類加載器兩部分,而這兩部分的應(yīng)用是許多常用功能和程序?qū)崿F(xiàn)的基礎(chǔ);

文章目錄

      • 1. Tomcat: 正統(tǒng)的類加載器架構(gòu)
      • 2. OSGi: 靈活的類加載器架構(gòu)
      • 3. 字節(jié)碼生成技術(shù)與動態(tài)代理的實現(xiàn)
      • 4. Backport 工具: Java 逆向移植

1. Tomcat: 正統(tǒng)的類加載器架構(gòu)

一個功能完備的 Web 服務(wù)器(Tomcat、Jetty、WebLogic、WebSphere),都要解決如下問題:

  • 部署在同一服務(wù)器的兩個 Web 應(yīng)用程序所使用的 Java 類庫實現(xiàn)相互隔離,相互獨立使用;
  • 部署在同一服務(wù)器的兩個 Web 應(yīng)用程序所使用的 Java 類庫實現(xiàn)相互共享,減少資源(主要是內(nèi)存,JVM 方法區(qū))浪費;
  • 服務(wù)器要盡可能保障自身安全不受部署的 Web 應(yīng)用程序影響,服務(wù)器使用的類庫應(yīng)與應(yīng)用程序的類庫相互獨立;
  • 支持 JSP 的 Web 服務(wù)器大多支持 HotSwap 功能,而 JSP 純文本存儲的特性導(dǎo)致其被篡改的幾率遠(yuǎn)大于 Java 類庫和自身 Class 文件,因此也需要提供 Production Mode(生成模式) 下不處理 JSP 文件的功能(如 WebLogic);

單獨的一個 ClassPath 無法滿足 Web 應(yīng)用的部署需求,因此 Web Server 各自提供了不同含義的第三方類庫 ClassPath(lib、classes,各自對應(yīng)不同的訪問范圍和服務(wù)對象),每個路徑需要相應(yīng)的自定義類加載器去加載里面的 Java 類庫;

Tomcat 目錄

  • /common/*,Common 類加載器負(fù)責(zé),類庫可以被 Tomcat 和所有 Web 應(yīng)用程序共同使用;
  • /server/*,Catalina 類加載器(也稱 Server 類加載器)負(fù)責(zé),類庫可被 Tomcat 使用,對所有 Web 應(yīng)用程序不可見;
  • /shared/*,Shared 類加載器負(fù)責(zé),類庫可以被所有 Web 應(yīng)用程序共同使用,對 Tomcat 不可見;
  • /lib/*,Tomcat 6 之后,默認(rèn)不開啟 server.loader 和 share.loader 兩個類加載器,而是用 Common 類加載器替代,因此 /common/*、/server/*、/shared/* 三個路徑默認(rèn)合并到了一個 /lib/* 路徑,相當(dāng)于 /common/* 的作用,
  • /WEB-INF/*,Webapp 類加載器負(fù)責(zé),每個 Web 應(yīng)用程序?qū)?yīng)一個 Webapp 類加載器,類庫僅可被當(dāng)前 Web 應(yīng)用程序使用,對 Tomcat 和其他 Web 應(yīng)用程序不可見;

請?zhí)砑訄D片描述

JSP 類加載器負(fù)責(zé) JSP 文件的加載,每個 JSP 文件對應(yīng)一個 JasperLoader 類加載器;而 JSP 加載器存在的目的就是被丟棄,一旦 JSP 文件被修改,就需要新建一個 JSP 類加載器替換舊的,以實現(xiàn) JSP 文件的 HotSwap 功能;

Common 類加載器能夠加載的類可以被 Catalina 類加載器和 Shared 類加載器使用;Catalina 類加載器和 Shared 類加載器加載的類相互隔離;Webapp 類加載器可以使用 Shared 類加載器加載的類,但各 Webapp 類加載器加載實例之間相互隔離;

2. OSGi: 靈活的類加載器架構(gòu)

OSGi 的研究有助于學(xué)習(xí)類加載器的知識;

OSGiOpen Service Gateway Initiative,OSGi 聯(lián)盟制定的一個基于 Java 語言的動態(tài)的模塊系統(tǒng)規(guī)范(JDK 9 引入的 JPMS 是靜態(tài)的模塊系統(tǒng));因與 JPMS 模塊化特性重疊,OSGi 現(xiàn)在著重向動態(tài)模塊化系統(tǒng)的方向發(fā)展,用于實現(xiàn)模塊級熱插拔等;許多大型軟件平臺和中間件服務(wù)器都是基于或聲明將要基于 OSGi 規(guī)范來實現(xiàn)的(如 IBM Jazz、GlassFish、JBoss OSGi 等);

Bundle,OSGi 的模塊,類似于普通 Java 類庫,且都是以 JAR 格式封裝,內(nèi)部都是 Java 的 Package 和 Class;但 Bundle 可以額外聲明它所依賴的 Package(Import Package)和它允許導(dǎo)出發(fā)布的 Package(Export Package,未 export 的 package 和 Class 對外將是不可見的),用于精準(zhǔn)控制可見性和依賴關(guān)系;

OSGi 的 Bundle 類加載器之間只有規(guī)則,沒有固定的委派關(guān)系;所有 Package 的類加載動作都會委派給發(fā)布它的 Bundle 類加載器來完成;不涉及某個具體 Package 時,所有 Bundle 加載器都是平級關(guān)系,只有具體到某個 Package 或 Class 時,才根據(jù) Package 導(dǎo)入導(dǎo)出定義來構(gòu)造 Bundle 間的委派和依賴;

假設(shè)存在 Bundle A、Bundle B、Bundle C,且 3 個 Bundle 的依賴關(guān)系如下:

  • Bundle A: 聲明發(fā)布了 packageA,依賴了 java.* 的包;
  • Bundle B: 聲明依賴了 packageA 和 packageC,同時也依賴了 java.* 的包;
  • Bundle C: 聲明發(fā)布了 packageC,依賴了 packageA;

3 個 Bundle 之間的類加載器及父類加載器之間的關(guān)系如下:

請?zhí)砑訄D片描述

  • 以 java.* 開頭的類,委派給父類加載器;
  • 否則,在委派列表名單的類,委派給父類加載器;
  • 否則,Import 列表中的類,委派給 Export 這個類的 Bundle 的類加載器;
  • 否則,查找當(dāng)前 Bundle 的 ClassPath,使用自己的類加載器;
  • 否則,查找是否在自己的 Fragment Bundle 中,若在,則委派給 Fragment Bundle 的類加載器;
  • 否則,查找 Dynamic Import 列表的 Bundle,委派給對應(yīng) Bundle 的類加載器;
  • 否則,類查找失敗;

若 Bundle A 依賴 Bundle B 的 Package B,Bundle B 依賴 Bundle A 的 Package A;在類加載時,首先加載 Bundle A 時會鎖定 Bundle A 的類加載器實例,然后委派 Bundle B 的類加載器去加載 Bundle B;而此時加載 Bundle B 的線程也會鎖定 Bundle B 的類加載器實例,再去請求 Bundle A 的 Package A,如此相互等待,就會形成死鎖;(這個問題在 JDK 7 之前可以通過 osgi.classloader.singleTheadLoads 參數(shù)強制單線程串行進(jìn)行類加載解決,但會損耗性能;在 JDK 7 之后才從 JDK 層面得到解決,將鎖的級別從 ClassLoader 對象本身降到了要加載的類名級別)

3. 字節(jié)碼生成技術(shù)與動態(tài)代理的實現(xiàn)

JDK 中的 javac 是字節(jié)碼技術(shù)的老祖宗,學(xué)習(xí)字節(jié)碼的最好方式是閱讀 javac 的源碼(jdk.compiler/xhare/classes/com/sun/tools/javac);

使用字節(jié)碼的場景有 Web 服務(wù)器中的 JSP 編譯器、編譯時織入的 AOP、動態(tài)代理、反射也可能通過運行時生成字節(jié)碼提高執(zhí)行速度;

動態(tài)代理,針對使用 Java 代碼實現(xiàn)代理類的靜態(tài)代理寫法,動態(tài)代理在原始類和接口未知的情況下,實現(xiàn)代理類的行為,讓代理類和原始類脫離了直接關(guān)系,從而讓代理可以靈活的重用在不同場景;Spring 通過動態(tài)代理的方式對 Bean 進(jìn)行增強;

動態(tài)代理示例

public class DynamicProxyTest {interface IHello {void sayHello();}static class Hello implements IHello {@Overridepublic void sayHello() {System.out.println("hello world");}}static class DynamicProxy implements InvocationHandler {Object originalObj;Object bind(Object originalObj) {this.originalObj = originalObj;return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(), originalObj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("welcome");return method.invoke(originalObj, args);}}public static void main(String[] args) {IHello hello = (IHello) new DynamicProxy().bind(new Hello());hello.sayHello();hello.toString();// 輸出:// welcome// hello world// welcome}
}

Proxy::newProxyInstance() 方法返回一個實現(xiàn)了 IHello 的接口,并代理了 new Hello() 實例化的對象;其中程序進(jìn)行了驗證、優(yōu)化、緩存、同步、生成字節(jié)碼、顯示類加載等;

設(shè)置保存運行時生成的代理類字節(jié)碼文件

// 在 main() 中添加如下代碼
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

可以得到 #Proxy0.class 的 Class 文件,通過反編譯,可以得到動態(tài)代理類;

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package edu.aurelius.jvm.clazz;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;final class $Proxy0 extends Proxy implements DynamicProxyTest.IHello {private static Method m1;private static Method m3;private static Method m2;private static Method m0;public $Proxy0(InvocationHandler var1) throws  {super(var1);}public final boolean equals(Object var1) throws  {try {return (Boolean)super.h.invoke(this, m1, new Object[]{var1});} catch (RuntimeException | Error var3) {throw var3;} catch (Throwable var4) {throw new UndeclaredThrowableException(var4);}}public final void sayHello() throws  {try {super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final String toString() throws  {try {return (String)super.h.invoke(this, m2, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final int hashCode() throws  {try {return (Integer)super.h.invoke(this, m0, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}static {try {m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));m3 = Class.forName("edu.aurelius.jvm.clazz.DynamicProxyTest$IHello").getMethod("sayHello");m2 = Class.forName("java.lang.Object").getMethod("toString");m0 = Class.forName("java.lang.Object").getMethod("hashCode");} catch (NoSuchMethodException var2) {throw new NoSuchMethodError(var2.getMessage());} catch (ClassNotFoundException var3) {throw new NoClassDefFoundError(var3.getMessage());}}
}

這里 super.h 是父類 Proxy 中保存的 InvocationHandler 對象(DynamicProxy 對象),統(tǒng)一調(diào)用 super.h 對象的 invoke() 方法來實現(xiàn)代理方法,讓 DynamicProxy 對象 的 invoke() 中插入的邏輯可以作用在所有被代理對象(new Hello() 實例化的對象)的方法上;

實際開發(fā)中以字節(jié)為單位拼接字節(jié)碼的應(yīng)用場景幾乎是很少見的,在需要大量操作字節(jié)碼時,建議使用封裝好的字節(jié)碼類庫(Javassist、GCLib、ASM);

4. Backport 工具: Java 逆向移植

Java Backporting Tools,Java 逆向移植工具,如 Retrotranslator 和 Retrolambda;

  • Retrotranslator,將 JDK 5 編譯出來的 Class 文件轉(zhuǎn)變?yōu)榭梢栽?JDK 1.4 或 1.3 上部署的版本,從而支持自動裝箱、泛型、動態(tài)注解、枚舉、變長參數(shù)、遍歷循環(huán)、靜態(tài)導(dǎo)入、集合改進(jìn)、并發(fā)包、泛型與注解等的反射等語法特性;
  • Retrolambda,將 JDK 8 的 Lambda 表達(dá)式、try-resources、接口默認(rèn)方法等語法轉(zhuǎn)換為在 JDK 5、6、7 部署環(huán)境上支持的形式;

JDK 升級新增功能分類

  • 對 Java 類庫 API 增強;如 JDK 1.2 引入的 java.util.Collections 集合包,JDK 5 引入的 java.util.concurrent 并發(fā)包,JDK 7 引入的 java.lang.invoke 包;
  • 對前端編譯層面做改進(jìn),支持新的語法糖;如自動裝箱拆箱(編譯器自動對包裝對象使用 Integer.valueOf() 等代碼)、變成參數(shù)(編譯后自動轉(zhuǎn)化為數(shù)組)、泛型(編譯階段擦除泛型信息,在元數(shù)據(jù)中保存,編譯器自動插入類型轉(zhuǎn)換代碼);
  • 在字節(jié)碼中進(jìn)行支持的改動;如 JDK 7 引入的動態(tài)語言支持,在 JVM 中新增了 invokedynamic 字節(jié)碼指令;
  • JDK 整體結(jié)構(gòu)層面的改進(jìn);如 JDK 9 引入的 Java 模塊化系統(tǒng),涉及 JDK 結(jié)構(gòu)、Java 語法、類加載和連接過程、JVM 等各個層面;
  • JVM 內(nèi)部的改進(jìn);如 JDK 5 定義的 Java 內(nèi)存模型(Java Memory Model,JMM),JDK 7、JDK 11、JDK 12 中新增的 G1、ZGC、Shenandoah 收集器等;這類改動對 Java 應(yīng)用程序是透明的,只會影響程序運行時;

逆向移植可以較好的模擬前 2 類升級,后 3 類則無能為力或影響運行效率;

對第 1 類升級的逆向移植可以通過獨立類庫代替 JDK 中部分功能的方式來實現(xiàn);
對第 2 類升級需要使用 ASM 等字節(jié)碼操作工具對字節(jié)碼中元數(shù)據(jù)信息和一些語法支持的內(nèi)容做相應(yīng)修改;
對第 3 類升級則需要繞開字節(jié)碼指令,犧牲了性能;如 lambda 表達(dá)式的逆向支持,其實是生成了一組匿名內(nèi)部類代替 Lambda;IntelliJ IDEA 中將匿名內(nèi)部類顯示成 Lambda 表達(dá)式其實就是反向使用這個過程的效果;


上一篇:「JVM 執(zhí)行引擎」棧架構(gòu)的字節(jié)碼的解釋執(zhí)行引擎

PS:感謝每一位志同道合者的閱讀,歡迎關(guān)注、評論、贊!


參考資料:

  • [1]《深入理解 Java 虛擬機》
http://www.risenshineclean.com/news/48157.html

相關(guān)文章:

  • 網(wǎng)站換了域名還被k站不安仁網(wǎng)絡(luò)推廣
  • 整站排名優(yōu)化品牌怎么推廣網(wǎng)站鏈接
  • 專業(yè)做淘寶網(wǎng)站公司嗎seo是什么職業(yè)崗位
  • 部署在本地的wordpress太原網(wǎng)站優(yōu)化公司
  • 武昌網(wǎng)站建設(shè)推廣手段和渠道有哪些
  • 專業(yè)做網(wǎng)站app的公司有哪些有品質(zhì)的網(wǎng)站推廣公司
  • 如何網(wǎng)站建設(shè)seo優(yōu)化排名百度教程
  • 物流三方網(wǎng)站怎么做重慶森林電影
  • 網(wǎng)站數(shù)據(jù)鏈接怎么做商城推廣軟文范文
  • 泉州網(wǎng)站制作平臺谷歌google play下載
  • 如何做網(wǎng)絡(luò)營銷直播倉山區(qū)seo引擎優(yōu)化軟件
  • 北京最好的網(wǎng)站建設(shè)公司全國疫情高峰感染高峰進(jìn)度
  • 西寧商城網(wǎng)站建設(shè)公司網(wǎng)站關(guān)鍵詞優(yōu)化有用嗎
  • 滄州網(wǎng)站備案哈爾濱網(wǎng)絡(luò)推廣
  • 如何做電商網(wǎng)站成都seo培
  • 世界杯視頻直播網(wǎng)站房地產(chǎn)十大營銷手段
  • 太原網(wǎng)站制作案例公司網(wǎng)站模版
  • 柯橋做網(wǎng)站的公司百度網(wǎng)盤官網(wǎng)登錄首頁
  • 怎么做網(wǎng)站訪問統(tǒng)計手機創(chuàng)建網(wǎng)站免費注冊
  • 有pc網(wǎng)站 移動網(wǎng)站怎么做關(guān)鍵詞怎么找出來
  • 企業(yè)網(wǎng)站建設(shè)哪里好推廣鏈接點擊器
  • 鶴壁seo東莞做網(wǎng)站優(yōu)化
  • 網(wǎng)站是誰做的企業(yè)產(chǎn)品網(wǎng)絡(luò)推廣
  • java網(wǎng)站開發(fā)計劃表情感營銷案例
  • 廣州部隊網(wǎng)站建設(shè)費用拓客團隊怎么聯(lián)系
  • 做網(wǎng)站需要用什么開發(fā)軟件福州百度分公司
  • 北京網(wǎng)站編程培訓(xùn)石家莊關(guān)鍵詞優(yōu)化平臺
  • 刪除的網(wǎng)站做404東莞網(wǎng)站seo優(yōu)化托管
  • 免費發(fā)布信息網(wǎng)站大全666代刷網(wǎng)站推廣快速
  • 智能建站軟件東莞網(wǎng)站seo公司哪家大