{"id":1039,"date":"2022-08-21T13:11:21","date_gmt":"2022-08-21T04:11:21","guid":{"rendered":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=1039"},"modified":"2022-08-21T13:11:21","modified_gmt":"2022-08-21T04:11:21","slug":"java%e3%81%8c%e5%88%86%e3%81%8b%e3%82%89%e3%81%aa%e3%81%99%e3%81%8e%e3%82%8b%e3%81%ae%e3%81%a7%e3%80%81jvm%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e5%8b%89%e5%bc%b7%e3%81%99%e3%82%8b5-classloader","status":"publish","type":"post","link":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=1039","title":{"rendered":"Java\u304c\u5206\u304b\u3089\u306a\u3059\u304e\u308b\u306e\u3067\u3001JVM\u306b\u3064\u3044\u3066\u52c9\u5f37\u3059\u308b(5) -ClassLoader\u7de8 \u305d\u306e2-\u00a0"},"content":{"rendered":"\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=680\n\">https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=680<\/a><\/li><li><a href=\"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=743\n\">https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=743<\/a><\/li><li><a href=\"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=773\">https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=773<\/a><\/li><li><a href=\"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=931\">https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=931<\/a><\/li><\/ul>\n\n\n\n<p>\u5c11\u3057\u524d\u56de\u304b\u3089\u6642\u9593\u304c\u3042\u3044\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002<br>\u524d\u56de\u306f<code>java<\/code> \u30b3\u30de\u30f3\u30c9\u306e <code>main<\/code> \u95a2\u6570\u304b\u3089\u9806\u756a\u306b\u8aad\u3093\u3067\u3044\u3063\u3066\u3001\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u89e3\u91c8\u304c\u7d42\u308f\u3063\u305f\u3068\u3053\u308d\u307e\u3067\u3092\u8aad\u307f\u307e\u3057\u305f\u3002\u305d\u306e\u7d9a\u304d\u3092\u8aad\u3093\u3067\u3044\u304d\u307e\u3059\u3002\u65e9\u304f\u30af\u30e9\u30b9\u30ed\u30fc\u30c0\u30fc\u95a2\u4fc2\u306e\u3068\u3053\u308d\u3092\u307e\u3067\u8fbf\u308a\u3064\u304d\u305f\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4eca\u56de\u8aad\u3080\u3068\u3053\u308d\u3068\u8a18\u9332\u3064\u3051\u304b\u305f\u306e\u5909\u66f4<\/h2>\n\n\n\n<p>Java\u306e <code>main<\/code> \u95a2\u6570\u3092\u5b9f\u884c\u3059\u308b\u3068\u3053\u308d\u307e\u3067\u3001\u3068\u3044\u3046\u3053\u3068\u306b\u3057\u305f\u3044\u3067\u3059\u304c\u5168\u90e8\u306f\u96e3\u3057\u3044\u3068\u601d\u3046\u306e\u3067<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>classpath\u306e\u8a2d\u5b9a\u3092\u884c\u306a\u3046\u3068\u3053\u308d<\/li><li><code>.class<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u3053\u3093\u3067\u3044\u308b\u3068\u3053\u308d<\/li><\/ul>\n\n\n\n<p>\u306e\u7279\u5b9a\u3084\u51e6\u7406\u306e\u4e00\u90e8\u304c\u5206\u304b\u308c\u3070\u826f\u3044\u304b\u306a\u3068\u601d\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305d\u308d\u305d\u308d\u3001\u3084\u3063\u3066\u3044\u308b\u3053\u3068\u306e\u51e6\u7406\u304c\u5897\u3048\u3066\u304d\u305f\u306e\u3067\u8a18\u9332\u306e\u53d6\u308a\u65b9\u3092\u5c11\u3057\u5909\u3048\u307e\u3059\u3002\u610f\u5473\u304c\u3042\u308a\u305d\u3046\u306a\u5358\u4f4d\u3067\u7bc0\u3092\u533a\u5207\u308b\u3001\u30b3\u30fc\u30c9\u7247\u3092\u4f75\u8a18\u3059\u308b\u3088\u3046\u306a\u5f62\u3067\u8a18\u9332\u3057\u3066\u3044\u3053\u3046\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Java\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u8d77\u52d5\u51e6\u7406<\/h2>\n\n\n\n<p>\u524d\u56de\u306f <code>JLI_Launch<\/code> \u304c <code>JVMInitialize<\/code> \u3092\u547c\u3076\u3068\u3053\u308d\u3067\u7d42\u4e86\u3057\u305f\u306e\u3067\u3001\u4eca\u56de\u306f\u305d\u3053\u304b\u3089\u8aad\u3093\u3067\u3044\u304d\u307e\u3059\u3002<br>\u3053\u306e\u95a2\u6570\u306f\u540d\u524d\u306e\u3068\u304a\u308aJVM\u306e\u521d\u671f\u5316\u3092\u884c\u306a\u3063\u3066\u3044\u305d\u3046\u3067\u3059\u3002\u3053\u3053\u304b\u3089\u3001<code>JavaMain<\/code> \u95a2\u6570\u3092\u5b9f\u884c\u3059\u308b\u307e\u3067\u306f\u91cd\u8981\u306a\u51e6\u7406\u306f\u7121\u3044\u611f\u3058\u306a\u306e\u3067\u3056\u3063\u304f\u308a\u8aad\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p>  <a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20+11\/src\/java.base\/unix\/native\/libjli\/java_md.c#L713\">JVMInit<\/a> \u306f\u3001<code><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20+11\/src\/java.base\/share\/native\/libjli\/java.c#L2248\" target=\"_blank\">ContinueInNewThread<\/a><\/code> \u3092\u547c\u3076\u3060\u3051\u306e\u95a2\u6570\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u305d\u3057\u3066\u3001<code>ContinueInNewThread<\/code>\u306f\u3001<code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20+11\/src\/java.base\/unix\/native\/libjli\/java_md.c#L671\" target=\"_blank\" rel=\"noreferrer noopener\">CallJavaMainInNewThread<\/a><\/code>\u3092\u547c\u3093\u3067<code><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20+11\/src\/java.base\/share\/native\/libjli\/java.c#L391\" target=\"_blank\">JavaMain<\/a><\/code>\u306e\u5b9f\u884c\u306b\u79fb\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>CallJavaMainInNewThread<\/code>\u306f\u3001OS\u4f9d\u5b58\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u521d\u671f\u5316\u51e6\u7406\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002unix\u7248\u3092\u8aad\u3093\u3067\u3044\u308b\u306e\u3067pthread\u304c\u547c\u3070\u308c\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u3088\u3046\u306b p<code>thread_create<\/code> \u3057\u3066\u3001<code>pthread_join<\/code> \u3059\u308b\u51e6\u7406\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>if (pthread_create(&tid, &attr, ThreadJavaMain, args) == 0) {\n        void* tmp;\n        pthread_join(tid, &tmp);\n        rslt = (int)(intptr_t)tmp;\n    }\n\n\/\/  ThreadJavaMain\u306e\u5b9a\u7fa9\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\nstatic void* ThreadJavaMain(void* args) {\n    return (void*)(intptr_t)JavaMain(args);\n}<\/code><\/pre><\/div>\n\n\n\n<p>\u3053\u306e\u5f8c\u306b\u3001return\u304c\u3042\u3063\u3066\u3001\u7279\u306b\u5927\u304d\u306a\u51e6\u7406\u3082\u306a\u304f\u30d7\u30ed\u30b0\u30e9\u30e0\u3068\u3057\u3066\u3082\u7d42\u4e86\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u3002\u3064\u307e\u308a\u3001\u3053\u3053\u3067\u4f5c\u6210\u3057\u3066\u3044\u308b\u30b9\u30ec\u30c3\u30c9\u3053\u305d\u304cJava\u3067\u5b9f\u884c\u3055\u308c\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3068\u306a\u308a\u307e\u3059\u3002main\u304b\u3089\u8aad\u3093\u3067\u304d\u305f\u3001lanuncher\u306e\u6a5f\u80fd\u3068\u3057\u3066\u306f\u3059\u3079\u3066\u5b8c\u4e86\u3057\u3066\u3044\u308b\u3068\u8a00\u3048\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">JavaMain\u306e\u51e6\u7406<\/h2>\n\n\n\n<p>JavaMain\u306e\u4e2d\u3067\u306f\u8272\u3005\u521d\u671f\u5316\u3063\u307d\u3044\u51e6\u7406\u304c\u5b9f\u65bd\u3055\u308c\u3066\u3044\u305d\u3046\u3067\u3059\u3002\u3056\u3063\u304f\u308a\u4ee5\u4e0b\u306e\u9806\u3067Java\u306emain\u95a2\u6570\u304c\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>InitializeJVM<\/li><li>LoadMainClass<\/li><li>GetApplicationClass<\/li><li>CreateApplicationArgs<\/li><li>PostJVMInit<\/li><li>GetStaticMethodID<\/li><li>CallStaticVoidMethod<\/li><\/ul>\n\n\n\n<p>\u4e0a\u8a18\u306e\u95a2\u6570\u306e\u3046\u3061\u3001<code>InitializeJVM<\/code> \u3001<code>LoadMainClass<\/code>\u3001<code>CallStaticVoidMethod<\/code> \u3042\u305f\u308a\u306f\u6c17\u306b\u306a\u308b\u95a2\u6570\u3067\u3059\u306d\u3002\u4ed6\u306e\u95a2\u6570\u306f\u3001GUI\u7528\u3067\u3042\u308b\u3068\u304bJavaFX\u7528\u306e\u51e6\u7406\u3068\u30b3\u30e1\u30f3\u30c8\u304c\u66f8\u3044\u3066\u3042\u308b\u306e\u3067\u8aad\u307f\u98db\u3070\u3057\u3066\u3082\u826f\u3055\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">InitializeJVM\u306e\u51e6\u7406<\/h3>\n\n\n\n<p>InitializeJVM\u3092\u547c\u3073\u3060\u3059\u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>    \/* Initialize the virtual machine *\/\n    start = CurrentTimeMicros();\n    if (!InitializeJVM(&vm, &env, &ifn)) {\n        JLI_ReportErrorMessage(JVM_ERROR1);\n        exit(1);\n    }<\/code><\/pre><\/div>\n\n\n\n<p>InitializeJVM\u306e\u4e2d\u8eab\u3092\u898b\u3066\u3044\u304f\u3068\u3001\u5192\u982d\u3067\u5909\u6570\u306e\u521d\u671f\u5316\u51e6\u7406\u306a\u3069\u304c\u5b9f\u65bd\u3055\u308c\u3066\u3044\u307e\u3059\u3002<br>\u3053\u3053\u3067\u767b\u5834\u3057\u3066\u3044\u308b\u3001<code>options<\/code> \u3068\u3044\u3046\u5909\u6570\u306f\u8d77\u52d5\u6642\u306b\u8a2d\u5b9a\u3057\u305fJVM\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306a\u3069\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u5909\u6570\u3067\u3059\u3002<code>AddOption<\/code> \u95a2\u6570\u306a\u3069\u304c\u64cd\u4f5c\u3057\u3066\u3044\u308b\u306e\u306f\u3053\u306e\u5909\u6570\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>    JavaVMInitArgs args;\n    jint r;\n\n    memset(&args, 0, sizeof(args));\n    args.version  = JNI_VERSION_1_2;\n    args.nOptions = numOptions;\n    args.options  = options;\n    args.ignoreUnrecognized = JNI_FALSE;<\/code><\/pre><\/div>\n\n\n\n<p>\u305d\u3057\u3066\u3001InitializeJVM\u306e\u4e2d\u3067\u4ee5\u4e0b\u306e\u3088\u3046\u306bJVM\u3092\u4f5c\u6210\u3059\u308b\u95a2\u6570\u304c\u547c\u3070\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>    r = ifn-&gt;CreateJavaVM(pvm, (void **)penv, &args);<\/code><\/pre><\/div>\n\n\n\n<p>\u3053\u306e\u5909\u6570\u306f\u95a2\u6570\u30dd\u30a4\u30f3\u30bf\u3068\u306a\u3063\u3066\u3044\u3066\u3001<code>JLI_Launch<\/code> \u306e\u4e2d\u3067 <code>LoadJavaVM<\/code> \u3067\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u5b9f\u969b\u306b\u547c\u3070\u308c\u308b\u95a2\u6570\u3068\u3057\u3066\u306f\u3001<code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20+11\/src\/hotspot\/share\/prims\/jni.cpp#L3709\" target=\"_blank\" rel=\"noreferrer noopener\">JNI_CreateJavaVM<\/a><\/code> \u3068\u3044\u3046\u95a2\u6570\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>JNI_CreateJavaVM<\/code> \u306e\u4e2d\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002\u3053\u306e\u95a2\u6570\u306e\u5b9f\u969b\u306e\u51e6\u7406\u306f\u3001<code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20+11\/src\/hotspot\/share\/prims\/jni.cpp#L3569\" target=\"_blank\" rel=\"noreferrer noopener\">JNI_CreateJavaVM_inner<\/a><\/code> \u304c\u884c\u306a\u3046\u3088\u3046\u3067\u3059\u3002\u540c\u671f\u7528\u306e\u5909\u6570\u306a\u3069\u3092\u64cd\u4f5c\u3057\u306a\u304c\u3089\u4ee5\u4e0b\u306e\u95a2\u6570\u3092\u547c\u3093\u3067\u3001\u3053\u3053\u304b\u3089VM\u4f5c\u6210\u306e\u5b9f\u969b\u306e\u51e6\u7406\u304c\u59cb\u307e\u308a\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>  result = Threads::create_vm((JavaVMInitArgs*) args, &can_try_again);<\/code><\/pre><\/div>\n\n\n\n<p>\u3053\u306e <code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/runtime\/threads.cpp#L411\" target=\"_blank\" rel=\"noreferrer noopener\">Thraeds::create_vm<\/a><\/code> \u306e\u4e2d\u3092\u5168\u3066\u628a\u63e1\u3057\u3088\u3046\u3068\u3059\u308b\u306e\u306f\u5927\u5909\u305d\u3046\u3067\u3059\u3002\u306a\u306e\u3067\u9069\u5f53\u306b\u30a2\u30bf\u30ea\u3092\u3064\u3051\u3066(\u95a2\u6570\u5b9a\u7fa9\u3092\u3055\u3063\u3068\u8aad\u3093\u3067\u307f\u3066\u95a2\u4fc2\u304c\u3042\u308a\u305d\u3046\u304b\u5224\u65ad\u3057\u3066\u307f\u307e\u3057\u305f)\u8aad\u3093\u3067\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>vm_init_globals<\/li><li>init_globals<\/li><\/ul>\n\n\n\n<p>\u3042\u305f\u308a\u306f\u95a2\u4fc2\u304c\u3042\u308a\u305d\u3046\u306a\u540d\u524d\u3068\u51e6\u7406\u5185\u5bb9\u306a\u6c17\u304c\u3057\u307e\u3059\u3002<br>\u5b9f\u969b\u306b\u8efd\u304f\u8aad\u3093\u3067\u307f\u305f\u3068\u3053\u308d\u3001<code>vm_init_globals<\/code> \u306f\u3042\u307e\u308a\u95a2\u4fc2\u304c\u7121\u3055\u305d\u3046\u3060\u3063\u305f\u306e\u3067\u3001<code>init_globals<\/code> \u3092\u8aad\u3093\u3067\u3044\u3053\u3046\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>init_globals<\/code> \u306e\u306a\u304b\u3092\u898b\u3066\u307f\u308b\u3068\u2026\u2026<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>  \/\/ \u4e2d\u7565\n  \/\/ \u3059\u3054\u304f\u6c17\u306b\u306a\u308b\u95a2\u6570\uff01\n  classLoader_init1(); \n  \/\/ ...\n  universe2_init();  \/\/ dependent on codeCache_init and stubRoutines_init1\n  javaClasses_init();\/\/ must happen after vtable initialization, before referenceProcessor_init\n  interpreter_init_code();  \/\/ after javaClasses_init and before any method gets linked\n  \/\/ ...<\/code><\/pre><\/div>\n\n\n\n<p>\u3059\u3054\u304f\u6c17\u306b\u306a\u308b\u95a2\u6570\u304c\u3042\u308a\u307e\u3057\u305f\u3002\u4e2d\u3092\u898b\u3066\u3044\u304f\u3068\u2026\u2026<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>void classLoader_init1() {\n  EXCEPTION_MARK;\n  ClassLoader::initialize(THREAD);\n  if (HAS_PENDING_EXCEPTION) {\n    vm_exit_during_initialization(&quot;ClassLoader::initialize() failed unexpectedly&quot;);\n  }\n}<\/code><\/pre><\/div>\n\n\n\n<p>\u3064\u3044\u306b\u3001ClassLoader\u304c\u8868\u308f\u308c\u307e\u3057\u305f!! <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ClassLoader::initialize \u306e\u51e6\u7406<\/h2>\n\n\n\n<p><code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/classfile\/classLoader.cpp#L1362\" target=\"_blank\" rel=\"noreferrer noopener\">ClassLoader::initialize<\/a><\/code> \u306e\u5192\u982d\u306b\u30b3\u30e1\u30f3\u30c8\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>\/\/ Initialize the class loader&#39;s access to methods in libzip.  Parse and\n\/\/ process the boot classpath into a list ClassPathEntry objects.  Once\n\/\/ this list has been created, it must not change order (see class PackageInfo)\n\/\/ it can be appended to and is by jvmti.<\/code><\/pre><\/div>\n\n\n\n<p>libzip\u306e\u521d\u671f\u5316\u3084boot classpath\u3092\u51e6\u7406\u3057\u3066\u3001ClassPathEntry\u306e\u30ea\u30b9\u30c8\u3092\u4f5c\u308b\u51e6\u7406\u306e\u3088\u3046\u3067\u3059\u3002<br>\u95a2\u6570\u306e\u5185\u90e8\u3092\u898b\u3066\u307f\u308b\u3068\u5b9f\u969b\u306e\u51e6\u7406\u306f\u3001\u4ee5\u4e0b\u306e2\u3064\u306e\u884c\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>  \/\/ lookup java library entry points\n  load_java_library();\n  \/\/ jimage library entry points are loaded below, in lookup_vm_options\n  setup_bootstrap_search_path(THREAD);<\/code><\/pre><\/div>\n\n\n\n<p><code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/classfile\/classLoader.cpp#L924\" target=\"_blank\" rel=\"noreferrer noopener\">load_java_library<\/a><\/code> \u306f <code>libjava.so<\/code> \u306e\u8aad\u307f\u8fbc\u307f\u3092\u884c\u306a\u3046\u95a2\u6570\u3067\u3057\u305f\u3002JDK_Canonicalize\u95a2\u6570\u3092\u5229\u7528\u3059\u308b\u305f\u3081\u306b\u8aad\u307f\u8fbc\u3080\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p><code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/classfile\/classLoader.cpp#L509\" target=\"_blank\" rel=\"noreferrer noopener\">setup_bootstrap_search_path<\/a><\/code> \u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5b9a\u7fa9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>void ClassLoader::setup_bootstrap_search_path(JavaThread* current) {\n  const char* bootcp = Arguments::get_boot_class_path();\n  assert(bootcp != NULL, &quot;Boot class path must not be NULL&quot;);\n  if (PrintSharedArchiveAndExit) {\n    \/\/ Don&#39;t print bootcp - this is the bootcp of this current VM process, not necessarily\n    \/\/ the same as the boot classpath of the shared archive.\n  } else {\n    trace_class_path(&quot;bootstrap loader class path=&quot;, bootcp);\n  }\n  setup_bootstrap_search_path_impl(current, bootcp);\n}<\/code><\/pre><\/div>\n\n\n\n<p><code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/runtime\/arguments.hpp#L616\" target=\"_blank\" rel=\"noreferrer noopener\">Arguments::get_boot_class_path()<\/a><\/code> \u306fboot_classpath\u3092\u8aad\u307f\u53d6\u308b\u51e6\u7406\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u5909\u6570\u306f\u3001<code>Threads::create_vm<\/code> \u306e\u4e2d\u3067\u547c\u3070\u308c\u3066\u3044\u308b\u3001<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/runtime\/arguments.cpp#L390\" target=\"_blank\"><code>Arguments::init_system_properties()<\/code> <\/a>\u306e\u4e2d\u3067\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u3059\u3002<code>Arguments::init_system_properties()<\/code> -> <a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/os\/linux\/os_linux.cpp#L368\" target=\"_blank\" rel=\"noreferrer noopener\"><code>os::init_system_properties_values(<\/code>)<\/a> -> <code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/runtime\/os.cpp#L1289\" target=\"_blank\" rel=\"noreferrer noopener\">os::set_boot_path<\/a><\/code> \u3068\u5b9f\u884c\u3055\u308c\u3001\u6700\u7d42\u7684\u306b<code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/runtime\/arguments.hpp#L604\" target=\"_blank\" rel=\"noreferrer noopener\">Arguments::set_boot_class_path<\/a><\/code> \u306e\u4e2d\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002<code>JAVA_HOME\/lib\/modules<\/code> \u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u304b\u3001<code>JAVA_HOME\/modules\/java.base<\/code> \u306e\u3069\u3061\u3089\u304b\u306b\u306a\u308b\u3088\u3046\u3067\u3059\u3002 <\/p>\n\n\n\n<p>\u6b21\u306b\u3001<code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/classfile\/classLoader.cpp#L633\" target=\"_blank\" rel=\"noreferrer noopener\">setup_bootstrap_search_path_impl<\/a><\/code> \u306e\u51e6\u7406\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<code>setup_bootstrap_search_path_impl<\/code> \u306fboot_classpath\u3068\u3057\u3066\u6e21\u3055\u308c\u305f <code>class_path<\/code> \u3068\u3044\u3046\u6587\u5b57\u5217\u306b\u5bfe\u3057\u3066\u3001jimage\u306e\u8aad\u307f\u8fbc\u307f\u51e6\u7406\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>_jrt_entry = new ClassPathImageEntry(JImage_file, canonical_path);<\/code><\/pre><\/div>\n\n\n\n<p>Java\u306f\u3001\u6700\u8fd1\u306fmodule\u3068\u3044\u3046\u4ed5\u7d44\u307f\u304c\u5c0e\u5165\u3055\u308c\u3066\u304a\u308aJava Image\u5f62\u5f0f\u3068\u3044\u3046\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002\u305d\u306e\u5f62\u5f0f\u306b\u5bfe\u5fdc\u3059\u308bClassPath\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002exploded build \u3068\u3044\u3046\u5c55\u958b\u3057\u305f\u5f62\u5f0f\u3092\u4f7f\u3063\u305f\u65b9\u5f0f\u3082\u6b8b\u3063\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002\u3053\u306e\u5834\u5408\u306b boot classpath\u304c <code>JAVA_HOME\/modules\/java.base<\/code> \u306b\u306a\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>boot classpath\u306b\u72ec\u81ea\u3067\u8ffd\u52a0\u306e\u30d1\u30b9\u3092\u66f8\u3044\u305f\u308a\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u8ffd\u52a0\u3067classpath\u304c\u8ffd\u52a0\u3055\u308c\u305f\u308a\u3059\u308b\u51e6\u7406\u304c\u3042\u3063\u305f\u308a\u3059\u308b\u3088\u3046\u3067\u3059\u3002<code><a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/jdk-20%2B11\/src\/hotspot\/share\/classfile\/classLoader.cpp#L839\" target=\"_blank\" rel=\"noreferrer noopener\">update_class_path_entry_list<\/a><\/code> \u3067\u305d\u308c\u306f\u51e6\u7406\u3055\u308c\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u3053\u307e\u3067\u3067\u3001boot classpath\u306e\u8a2d\u5b9a\u304c\u5b8c\u4e86\u3057\u3066\u3001ClassLoader\u306e\u521d\u671f\u5316\u304c\u5b8c\u4e86\u306e\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ClassLoader::load_class \u306b\u3064\u3044\u3066<\/h2>\n\n\n\n<p>classloader\u30af\u30e9\u30b9\u306e\u8aad\u307f\u8fbc\u307f\u304c\u5b8c\u4e86\u3057\u305f\u306e\u3067\u3001\u3064\u3044\u3067\u306bClassLoader\u306b\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b <code><a href=\"load_class\" target=\"_blank\" rel=\"noreferrer noopener\">ClassLoader::load_class<\/a><\/code> \u306b\u3064\u3044\u3066\u8abf\u3079\u3066\u307f\u307e\u3059\u3002\u540d\u524d\u306e\u3068\u304a\u308a\u30af\u30e9\u30b9\u306e\u8aad\u307f\u8fbc\u307f\u51e6\u7406\u304c\u5b9f\u88c5\u3055\u308c\u3066\u3044\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>java\u3092gdb\u3067\u8ffd\u3044\u304b\u3051\u3066\u307f\u308b\u3068\u3001\u3053\u306e\u95a2\u6570\u304c\u6700\u521d\u306b\u547c\u3070\u308c\u308b\u3068\u304d\u306e\u30b9\u30bf\u30c3\u30af\u30c8\u30ec\u30fc\u30b9\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-lang=\"HTML\"><code>#0  ClassLoader::load_class (name=0x7fffc6b4e0f8, search_append_only=false, __the_thread__=0x7ffff00285c0)\n#1  0x00007ffff6ce699c in SystemDictionary::load_instance_class_impl (class_name=0x7fffc6b4e0f8,\n#2  0x00007ffff6ce6d35 in SystemDictionary::load_instance_class (name_hash=3867026853, name=0x7fffc6b4e0f8,\n#3  0x00007ffff6ce4def in SystemDictionary::resolve_instance_class_or_null (name=0x7fffc6b4e0f8,\n#4  0x00007ffff6ce39be in SystemDictionary::resolve_or_null (class_name=0x7fffc6b4e0f8, class_loader=...,\n#5  0x00007ffff6ce37f5 in SystemDictionary::resolve_or_fail (class_name=0x7fffc6b4e0f8, class_loader=...,\n#6  0x00007ffff5f2638b in SystemDictionary::resolve_or_fail (class_name=0x7fffc6b4e0f8, throw_error=true,\n#7  0x00007ffff6dc5872 in vmClasses::resolve (id=vmClassID::Object_klass_knum, __the_thread__=0x7ffff00285c0)\n#8  0x00007ffff6dc596c in vmClasses::resolve_until (limit_id=vmClassID::String_klass_knum,\n#9  0x00007ffff6dc64d7 in vmClasses::resolve_through (last_id=vmClassID::Object_klass_knum,\n#10 0x00007ffff6dc5a24 in vmClasses::resolve_all (__the_thread__=0x7ffff00285c0)\n#11 0x00007ffff6ce7b9e in SystemDictionary::initialize (__the_thread__=0x7ffff00285c0)\n#12 0x00007ffff6d63e48 in Universe::genesis (__the_thread__=0x7ffff00285c0)\n#13 0x00007ffff6d663cf in universe2_init () at \/home\/sakura\/sandbox\/jdk\/src\/hotspot\/share\/memory\/universe.cpp:969\n#14 0x00007ffff6523bbc in init_globals () at \/home\/sakura\/sandbox\/jdk\/src\/hotspot\/share\/runtime\/init.cpp:138\n#15 0x00007ffff6d456c8 in Threads::create_vm (args=0x7ffff55c0dd0, canTryAgain=0x7ffff55c0cdb)\n<\/code><\/pre><\/div>\n\n\n\n<p><code>init_globals<\/code> \u306e <code>universe2_init<\/code> \u304b\u3089\u59cb\u307e\u308b\u6d41\u308c\u3067\u5229\u7528\u3055\u308c\u3066\u3044\u305d\u3046\u3067\u3059\u3002Java\u306e\u30af\u30e9\u30b9\u306e\u8aad\u307f\u8fbc\u307f\u306a\u3069\u3092\u53d6\u308a\u307e\u3068\u3081\u3066\u3044\u308b <code>SystemDictionary<\/code> \u306e\u521d\u671f\u5316\u306e\u4e2d\u3067\u3001<code>vmClasses::resolve_all()<\/code> \u3067\u57fa\u672c\u7684\u306a\u30af\u30e9\u30b9\u306e\u8aad\u307f\u8fbc\u307f(resolve)\u3092\u884c\u306a\u3063\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-cpp\" data-lang=\"C++\"><code>void SystemDictionary::initialize(TRAPS) {\n  \/\/ Allocate arrays\n  _placeholders        = new PlaceholderTable(_placeholder_table_size);\n  _loader_constraints  = new LoaderConstraintTable(_loader_constraint_size);\n  _invoke_method_table = new SymbolPropertyTable(_invoke_method_size);\n  _pd_cache_table = new ProtectionDomainCacheTable(defaultProtectionDomainCacheSize);\n\n#if INCLUDE_CDS\n  SystemDictionaryShared::initialize();\n#endif\n\n  \/\/ Resolve basic classes\n  vmClasses::resolve_all(CHECK);\n  \/\/ Resolve classes used by archived heap objects\n  if (UseSharedSpaces) {\n    HeapShared::resolve_classes(THREAD);\n  }\n}<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u75b2\u308c\u305f\u306e\u3067\u6b21\u56de\u306b\u2026\u2026<\/h2>\n\n\n\n<p>\u5927\u5206\u75b2\u308c\u3066\u3057\u307e\u3063\u305f\u306e\u3067\u3001\u3053\u3053\u304b\u3089\u5148\u306f\u6b21\u306b\u3057\u3088\u3046\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4eca\u56de\u3067\u3001classpath\u306e\u8a2d\u5b9a\u3092\u884c\u306a\u3063\u3066\u3044\u308b\u7b87\u6240\u3084\u30af\u30e9\u30b9\u30ed\u30fc\u30c0\u304c\u5b9f\u969b\u306b\u547c\u3070\u308c\u3066\u51e6\u7406\u3057\u3066\u3044\u308b\u3068\u3053\u308d\u306e\u7279\u5b9a\u306f\u51fa\u6765\u307e\u3057\u305f\u3002\u6b21\u56de\u4ee5\u964d\u306f\u3053\u306e\u30af\u30e9\u30b9\u30ed\u30fc\u30c0\u304c\u4f55\u3092\u3057\u3066\u3044\u308b\u306e\u304b\u3092\u5c11\u3057\u8a73\u3057\u304f\u898b\u3066\u884c\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=680 https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=743 https:\/\/ligh\u2026 <span class=\"read-more\"><a href=\"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/?p=1039\">\u7d9a\u304d\u3092\u8aad\u3080 &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-1039","post","type-post","status-publish","format-standard","hentry","category-1"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4wwqG-gL","_links":{"self":[{"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=\/wp\/v2\/posts\/1039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1039"}],"version-history":[{"count":177,"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=\/wp\/v2\/posts\/1039\/revisions"}],"predecessor-version":[{"id":1216,"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=\/wp\/v2\/posts\/1039\/revisions\/1216"}],"wp:attachment":[{"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/light-of-moe.ddo.jp\/~sakura\/diary\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}