国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

OpenJDK9 Hotspot java 虛擬機(jī)入口

JaysonWang / 2034人閱讀

摘要:假設(shè)源代碼目錄為函數(shù)函數(shù)在,它處理完命令行參數(shù)后跳轉(zhuǎn)到函數(shù)處理命令行選項(xiàng)函數(shù)在,它調(diào)用加載這個(gè)就是編譯的產(chǎn)出在系統(tǒng)下在使用加載動(dòng)態(tài)庫(kù)并獲取函數(shù)入口地址在系統(tǒng)下在熟悉的同學(xué),對(duì)下面的代碼應(yīng)該會(huì)感到很親切創(chuàng)建對(duì)象,并將控制流跳轉(zhuǎn)到呵呵,在

假設(shè) openjdk 源代碼目錄為 jdk9dev

main函數(shù)

main 函數(shù)在 jdk9dev/jdk/src/java.base/share/native/launcher/main.c,它處理完命令行參數(shù)后跳轉(zhuǎn)到 JLI_Launch 函數(shù)

    int main(int argc, char** argv) {
        // 處理命令行選項(xiàng)
        ...

        return JLI_Launch(margc, margv,
                   sizeof(const_jargs) / sizeof(char *), const_jargs,
                   appclassc, const_appclasspath,
                   VERSION_STRING,
                   DOT_VERSION,
                   (const_progname != NULL) ? const_progname : *margv,
                   (const_launcher != NULL) ? const_launcher : *margv,
                   HAS_JAVA_ARGS,
                   const_cpwildcard, const_javaw, const_ergo_class);
    }
JLI_Launch

JLI_Launch 函數(shù)在 jdk9dev/jdk/src/java.base/share/native/libjli/java.c,
它調(diào)用 LoadJavaVM 加載 libjvm.dylib , 這個(gè) libjvm.dylib 就是 hotspot 編譯的產(chǎn)出!

    int JLI_Launch(...) {
        ...

        if (!LoadJavaVM(jvmpath, &ifn)) {
            return (6);
        }

        ...

        return JVMInit(&ifn, threadStackSize, argc, argv, mode, what, ret);
    }
LoadJavaVM

在 mac osx 系統(tǒng)下 LoadJavaVM 在 jdk9dev/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c

jboolean LoadJavaVM(const char* jvmpath, InvocationFunctions* ifn) {
    ...
#ifndef STATIC_BUILD
    libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);
#else
    libjvm = dlopen(NULL, RTLD_FIRST);
#endif
    ifn->CreateJavaVM = (CreateJavaVM_t)
       dlsym(libjvm, "JNI_CreateJavaVM");
    if (ifn->CreateJavaVM == NULL) {
        JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror());
        return JNI_FALSE;
    }
    ...
}

使用 dlopen 加載動(dòng)態(tài)庫(kù)并獲取 JNI_CreateJavaVM 函數(shù)入口地址

JVMInit

在 mac osx 系統(tǒng)下 JVMInit 在jdk9dev/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c

熟悉 objc 的同學(xué),對(duì)下面的代碼應(yīng)該會(huì)感到很親切:

int JVMInit(InvocationFunctions* ifn, jlong threadStackSize, ...) {
    ...
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    {
        JavaLaunchHelper* launcher = [[[JavaLaunchHelper alloc] init] autorelease];
        [launcher performSelectorOnMainThread:@selector(launchJava:)
                                   withObject:[NSValue valueWithPointer:(void*)&args]
                                waitUntilDone:YES];
        rslt = [launcher getReturnValue];
    }
    [pool drain];
    return rslt;
    ...
}

創(chuàng)建 JavaLaunchHelper 對(duì)象,并將控制流跳轉(zhuǎn)到 launchJava

@implementation JavaLauncherHelper
-(int) launchJava:(NSValue*) argsValue {
    _returValue = JavaMain([argsValue pointerValue]);
}
@end

呵呵,在 objc 環(huán)境短暫停留后控制留又回到 c/c++ 的世界-JavaMain

JavaMain

JavaMain 函數(shù)在 jdk9dev/jdk/src/java.base/share/native/libjli/java.c,
在 JavaMain 函數(shù)中 會(huì)初始化 java 虛擬機(jī),查找 main class,獲取 main class 的 main 方法,并開(kāi)始執(zhí)行 java 字節(jié)碼

int JNICALL JavaMain(void* _args) {
    ...
    // 初始化 jvm
    if (!InitializeJVM(&vm, &env, &ifn)) {
        ...
    }

    ...
    // 加載 main class
    mainClass = LoadMainClass(env, mode, what);

    ...
    // 獲取 main 方法
    mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                                       "([Ljava/lang/String;)V");

    ...
    // 調(diào)用 main 方法
    (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

    LEAVE();    
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65888.html

相關(guān)文章

  • OpenJDK9 Hotspot:Zero 解釋器 初探

    摘要:準(zhǔn)備工作假設(shè)源代碼目錄為編譯時(shí)啟用了解釋器參考編譯和調(diào)試調(diào)用棧先在函數(shù)參考虛擬機(jī)入口中設(shè)斷點(diǎn),然后在的方法中設(shè)置斷點(diǎn)通過(guò)宏獲取當(dāng)前,然后創(chuàng)建第個(gè)棧幀,然后進(jìn)入解釋執(zhí)行字節(jié)碼 準(zhǔn)備工作 假設(shè) openjdk 源代碼目錄為 jdk9dev 編譯 openjdk 時(shí)啟用了 zero 解釋器(參考 OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試) 調(diào)用棧 先在 JavaMai...

    zhangqh 評(píng)論0 收藏0
  • OpenJDK9 Hotspot 虛擬機(jī)內(nèi)部對(duì)象內(nèi)存管理

    摘要:前言語(yǔ)言可以精確控制對(duì)象內(nèi)存分配,出于性能考慮框架系統(tǒng)程序基本都會(huì)自己造輪子開(kāi)發(fā)各種內(nèi)存管理模塊也不例外,它通過(guò)和方法的訪(fǎng)問(wèn)級(jí)別以及重載和方法來(lái)管理虛擬機(jī)內(nèi)部對(duì)象的內(nèi)存內(nèi)存管理相關(guān)的基類(lèi)定義了幾個(gè)基類(lèi)來(lái)作為大部分對(duì)象的基類(lèi)顧名思義,它們只能 前言 C++ 語(yǔ)言可以精確控制對(duì)象內(nèi)存分配,出于性能考慮 C++ 框架 or 系統(tǒng)程序基本都會(huì)自己 造輪子 開(kāi)發(fā)各種內(nèi)存管理模塊. hotspot...

    W_BinaryTree 評(píng)論0 收藏0
  • OpenJDK9 Hotspot : Thread

    摘要:前言本文從類(lèi)的方法的內(nèi)部實(shí)現(xiàn)入手,分析多線(xiàn)程相關(guān)的數(shù)據(jù)結(jié)構(gòu)類(lèi)和原理類(lèi)方法類(lèi)的方法用于啟動(dòng)線(xiàn)程,方法內(nèi)部調(diào)用了方法在源代碼中搜索,可以看到對(duì)應(yīng)函數(shù)在源代碼中搜索函數(shù)核心代碼計(jì)算線(xiàn)程堆棧大小創(chuàng)建對(duì)象初始化啟動(dòng)線(xiàn)程在創(chuàng)建時(shí)傳入了一個(gè)函數(shù)指針, 前言 本文從 Java Thread 類(lèi)的 start 方法的內(nèi)部實(shí)現(xiàn)入手,分析 Hotspot JVM 多線(xiàn)程相關(guān)的數(shù)據(jù)結(jié)構(gòu)(類(lèi))和原理 Threa...

    roundstones 評(píng)論0 收藏0
  • OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試

    摘要:占用率太高,還出各種奇怪問(wèn)題,轉(zhuǎn)投調(diào)試安裝下載源代碼漫長(zhǎng)等待,中間無(wú)數(shù)次中斷安裝安裝可選如果要使用解釋器,需要安裝設(shè)置調(diào)試級(jí)別,設(shè)成可以提供更多的調(diào)試信息設(shè)置路徑 Intellij CLion CPU 占用率太高,還出各種奇怪問(wèn)題,轉(zhuǎn)投 Xcode 調(diào)試 hotspot 安裝 hg # brew install hg 下載 open jdk 9 源代碼 # hg clone http...

    zhichangterry 評(píng)論0 收藏0
  • OpenJDK9 Hotspot : synchronized 淺析

    摘要:前言網(wǎng)上各路大神總結(jié)過(guò)各種關(guān)于內(nèi)部實(shí)現(xiàn),看別人的文章總覺(jué)得不過(guò)癮,所以有了這篇文章,嘗試再扒一次的底褲數(shù)據(jù)結(jié)構(gòu)在分析源代碼之前需要了解相關(guān)概念,比如等,參考網(wǎng)絡(luò)上各種解說(shuō)或者之前系列文章,這里重點(diǎn)介紹一下,,每個(gè)在內(nèi)部都有一個(gè)的對(duì)象與之對(duì)應(yīng) 前言 網(wǎng)上各路大神總結(jié)過(guò)各種關(guān)于 hotspot jvm synchronized 內(nèi)部實(shí)現(xiàn),看別人的文章總覺(jué)得不過(guò)癮,所以有了這篇文章,嘗試再扒...

    Amio 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<