- 浏览: 468604 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
mrshen:
很棒,在其他大神的博客上理清了思路看懂之后,来lz这里用例子学 ...
RED-BLACK(红黑)树的实现TreeMap源码阅读 -
a939639017:
yanf4j check不下来 ?
Java nio 2.0 AIO -
hellostory:
又是抄来的 - -
mysql分表方案 -
davidluoye:
为什么不说下支持的数据库呢?
模糊查询的优化 -
oliveevilo:
表示没看懂
Synchronized和java.util.concurrent.locks.Lock的区别
让我们一起跟随ClassLoader里的本地方法 findBootstrapClass(), 进入jvm执行启动类加载器加载类的内部实现。
java 代码
1.private Class findBootstrapClass0(String name)
2. throws ClassNotFoundException
3. {
4. check();
5. if (!checkName(name))
6. throw new ClassNotFoundException(name);
7. return findBootstrapClass(name);
8. }
9.
10. private native Class findBootstrapClass(String name)
11. throws ClassNotFoundException;
cpp 代码
1.// 摘自 j2se\src\share\classes\java\lang\ClassLoader.c
2.// 表示该函数将被 java class 以jni方式调用
3.JNIEXPORT jclass JNICALL
4.Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader,
5.jstring classname)
6.{
7. char *clname;
8. jclass cls = 0;
9. char buf[128];
10.
11. if (classname == NULL) {
12. // 类名不能为空
13. JNU_ThrowClassNotFoundException(env, 0);
14. return 0;
15. }
16.
17. // 将java的string转成unicode字符, 如果unicode字符长度不超过128
18. // 则不分配内存,直接拿buf缓存来使用
19. // 否则就malloc一块内存存放, 如果malloc失败, 则返回NULL
20. clname = getUTF(env, classname, buf, sizeof(buf));
21. if (clname == NULL) {
22. // 类名为空, 说明 JVM 内存分配失败, 抛出邪恶的OOM.
23. JNU_ThrowOutOfMemoryError(env, NULL);
24. return NULL;
25. }
26.
27. // 将 '.' 转换成 '/'
28. VerifyFixClassname(clname);
29.
30. if (!VerifyClassname(clname, JNI_TRUE)) {
31. // 如果指定的类名不合法, 抛出异常
32. JNU_ThrowClassNotFoundException(env, clname);
33. goto done;
34. }
35.
36. // 让jvm使用启动类加载器加载类, 第四位标志0表示使用启动类加载器,
37. // throwError为JNI_FALSE时抛出 ClassNotFoundException,而JNI_TRUE抛出NoClassDefFoundError
38. cls = JVM_FindClassFromClassLoader(env, clname, JNI_FALSE, 0, JNI_FALSE);
39.
40.done:
41. if (clname != buf) {
42. // 类名的格式有问题,且没有走buf缓存,则释放掉创建的内存, 防止内存泄漏
43. free(clname);
44. }
45.
46. return cls;
47.}
cpp 代码
1.// 摘自 hotspot\src\share\vm\prims\jvm.h
2./*
3.* jvm.h头文件, 类似java接口的定义。
4.× 根据给定的classLoader来加载指定类
5.×
6.× *env JNI运行环境
7.× *name 类名(路径)
8.× init 是否需要初始化类的内部数据结构
9.× loader 类加载器标识
10.× throwError 抛出的异常类型
11.*/
12.JNIEXPORT jclass JNICALL
13.JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init,
14.jobject loader, jboolean throwError);
cpp 代码
1.// 摘自 hotspot\src\share\vm\prims\jvm.cpp
2.JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
3. jboolean init, jobject loader,jboolean throwError))
4.
5.JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
6.throwError ? "error" : "exception");
7.
8.// 确保字符串不为NULL且长度不大于 (1 << 16) -1 , 否则抛出异常
9.if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
10. if (throwError) {
11. THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
12. } else {
13. THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
14. }
15.}
16.
17.// 将类名放入一个hashmap, 标记符号用的, 并构造为 symbolHandle
18.// (注意: Handle是一种间接的, 由线程变量分配空间的类,作用是防止GC回收)
19.// CHECK_0是一个宏, 作用是判断是否有没有处理掉的异常, 如果有, 返回0
20.symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_0);
21.
22.// 将classLoader标识转换成JVM内部表示的数据结构, 并构造为 Handle
23.Handle h_loader(THREAD, JNIHandles::resolve(loader));
24.
25.jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
26.Handle(), throwError, thread);
27.
28.if (TraceClassResolution && result != NULL) {
29. trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
30.}
31.
32.return result;
33.JVM_END
cpp 代码
1.// 摘自 hotspot\src\share\vm\prims\jvm.cpp
2.jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
3.
4.// 生成类的内部数据结构, 核心步骤,非常复杂, 后期补充一下这里, 但是对核心逻辑没影响
5.klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError, CHECK_0);
6.
7.// 将类的数据结构, 构造为 KlassHandle
8.KlassHandle klass_handle(THREAD, klass);
9.
10.if (init && klass_handle->oop_is_instance()) {
11.// 初始化类内部的数据结构
12.klass_handle->initialize(CHECK_0);
13.}
14.
15.// 分配内存, 生成class对象
16.return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
17.}
发表评论
-
JDK内置工具使用(转)
2012-08-09 10:56 1220JDK内置工具使用 一、javah命令(C Header a ... -
jstack使用
2012-08-09 10:37 1570Java综合 我们使用jdk自带的jstack来分析。当lin ... -
jstat使用
2012-08-09 09:51 1175如何判断JVM是否存在内 ... -
java应用crash案例
2012-08-08 22:05 1230最近,应用总会时不时c ... -
一个java crash的故障分析过程
2012-08-08 22:01 2278一个应用在周五 ... -
Java进程Crash的故障分析方法(转)
2012-08-08 21:54 4951I、Java进程无故退出的 ... -
使用CORE DUMP
2012-08-08 20:59 1705程序出现SIGSEGV ,Segmenta ... -
( 转)JVM执行篇:使用HSDIS插件分析JVM代码执行细节
2012-08-08 20:10 965在《Java虚拟机规范》之 ... -
Java Crash问题分析
2012-08-05 18:36 1951如果是Java进程不知道 ... -
JVM性能优化
2012-04-26 10:30 1156本文主要根据这篇PDF(G ... -
Java编译器、JVM、解释器
2012-04-25 16:43 3020Java 虚拟机(JVM)是可运行 ... -
JVM执行篇:使用HSDIS插件分析JVM代码执行细节
2012-04-10 13:27 1338在《Java虚拟机规范》之 ... -
HotSpot VM里的解释器在client与server模式上的一点区别
2011-12-28 11:12 1410可能许多人都读到过资料,听说过在Sun的HotSpot VM ... -
IcedTea在开源与OpenJDK的鸿沟上架起了桥梁
2011-11-22 23:54 17152008-06-12 18:06 作者: 来源:来自论坛 [ ... -
Sun的JDK7、OpenJDK及IcedTea释疑
2011-11-22 23:44 1281http://www.infoq.com/cn/news/20 ... -
在XUbuntu 10.10上以JRL源码构建Oracle JDK 6 update 23
2011-11-22 23:00 1965http://rednaxelafx.iteye.com/bl ... -
n JDK 和 OpenJDK 的区别
2011-11-22 13:34 2261http://hi.baidu.com/openware/bl ... -
线程局部存储Thread Local Storage-TLS(总结整理)
2011-10-27 18:18 1781在线程的学习中我们知道每个线程除了共享进程的资源外还拥有各 ... -
c++阿里笔试
2011-10-26 14:43 17171、有一个虚拟存储系统 ... -
GDB调试精粹及使用实例
2011-10-12 14:41 1071一:列文件清单 1. List (gdb) list li ...
相关推荐
Java 类加载原理是Java运行时环境中的核心机制之一,它涉及到类的生命周期、类加载器的层次结构以及类的查找和加载过程。了解这一机制对于深入理解Java平台的工作原理至关重要,尤其是在开发自定义类加载器或者处理...
Java 类加载器原理 Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将类的字节码加载到内存中并转换为可执行的Java类。类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定...
本文主要解析Java类加载的原理,分为三个部分:基础的类加载原理解析、插件环境下的类加载和线程上下文类加载器。 首先,Java虚拟机(JVM)内置了三种预定义的类加载器: 1. 启动(Bootstrap)类加载器:这是最基础的...
### Java 类加载器详解 #### 一、类加载器概述 在Java中,类加载器(Class ...通过理解和掌握类加载器的工作原理及其不同类型的加载器,可以帮助开发者更好地管理Java应用程序的依赖关系,提高程序的性能和可维护性。
JAVA类加载器有三种默认使用的类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(或者叫作Application类加载器)。每种类加载器都有设定好从哪里加载类。 Bootstrap类加载器负责加载rt.jar中JDK类...
Java 类加载器有三种默认使用的类加载器:Bootstrap 类加载器、Extension 类加载器和 System 类加载器(或称作 Application 类加载器)。每种类加载器都有设定好从哪里加载类。 Bootstrap 类加载器负责加载 rt.jar ...
Java应用程序类加载器是Java平台的核心组成部分之一,它负责加载应用程序中的类到JVM(Java虚拟机)中,使得程序能够执行。理解类加载器的工作原理对于深入学习Java编程至关重要。在Java中,类加载器按照层次结构...
本文将详细解析Java类加载原理,分为三篇文章进行阐述,分别是:Java类加载原理解析、插件环境下类加载原理解析和线程上下文类加载器。 首先,我们来了解Java虚拟机(JVM)的类加载器结构。JVM预定义了三种主要的类...
Java之——类热加载 在Java编程中,类的加载是程序运行的重要环节。传统的Java应用程序在启动时,由JVM(Java虚拟机)通过类加载器将类加载到内存中,一旦加载完成,除非程序退出,否则这些类通常不会被重新加载。...
1. 启动类加载器(Bootstrap ClassLoader):负责加载 Java 的核心类库,例如 java.lang.String、java.util.ArrayList 等。 2. 扩展类加载器(Extension ClassLoader):负责加载 Java 的扩展类库,例如 javax.xml ...
Bootstrap类加载器:Bootstrap类加载器是Java虚拟机中的一个基本类加载器,负责加载Java核心类库中的类。 Extension类加载器:Extension类加载器是Java虚拟机中的一个扩展类加载器,负责加载Java扩展类库中的类。 ...
Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...
通过掌握类加载的过程以及类加载器的工作原理,可以帮助开发者更好地处理类加载过程中可能出现的问题,同时也可以为实现某些特殊需求提供支持。希望本文能够帮助读者更加深入地理解和应用Java类加载机制。
本文将详细介绍JVM中的类加载顺序及其背后的原理,帮助读者理解这一过程,并掌握如何利用类加载机制解决实际问题。 #### 二、类加载器层次结构 当JVM启动时,会形成一个由三个主要类加载器组成的层次结构:...
引导类加载器(Bootstrap ClassLoader)是 JVM 自身实现的,不是 Java.lang.ClassLoader 的子类。它负责加载 Java 核心类,包括 rt.jar、i18n.jar、sunrsasign.jar 等。在 JVM 启动时,引导类加载器会自动加载这些...
1. **Bootstrap ClassLoader(启动类加载器)**:这是最顶层的类加载器,负责加载核心库(如`rt.jar`),它是由本地代码实现的。 2. **Extension ClassLoader(扩展类加载器)**:它加载位于`JAVA_HOME/lib/ext`目录...
Bootstrap是世界上最流行的前端开发框架之一,它为开发者提供了丰富的组件和样式,使得构建响应式、移动设备优先的网站变得简单高效。在这个特定的资源中,我们关注的是"Bootstrap网页loading加载图标动画特效",这...