- 浏览: 204289 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Prepared:
Hadoop的几个明显缺点 -
CSunDNan:
...
openjdk jvm 方法字节码执行过程 -
幻影之蚀:
...
mysql 源码分析2 源码调试环境建立 -
shukongchengje:
紧急呼唤楼主,mysql代码从哪里弄?官网wiki上看的一头雾 ...
mysql源码分析 整体架构 -
yeshaoting:
好文章.不介意的话转载了.
jvm 字节码中文含义
让我们一起跟随ClassLoader里的本地方法 findBootstrapClass(), 进入jvm执行启动类加载器加载类的内部实现。
private Class findBootstrapClass0(String name)
throws ClassNotFoundException
{
check();
if (!checkName(name))
throw new ClassNotFoundException(name);
return findBootstrapClass(name);
}
private native Class findBootstrapClass(String name)
throws ClassNotFoundException;// 摘自 j2sesrcshareclassesjavalangClassLoader.c
// 表示该函数将被 java class 以jni方式调用
JNIEXPORT jclass JNICALL
Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader,
jstring classname)
{
char *clname;
jclass cls = 0;
char buf[128];
if (classname == NULL) {
// 类名不能为空
JNU_ThrowClassNotFoundException(env, 0);
return 0;
}
// 将java的string转成unicode字符, 如果unicode字符长度不超过128
// 则不分配内存,直接拿buf缓存来使用
// 否则就malloc一块内存存放, 如果malloc失败, 则返回NULL
clname = getUTF(env, classname, buf, sizeof(buf));
if (clname == NULL) {
// 类名为空, 说明 JVM 内存分配失败, 抛出邪恶的OOM.
JNU_ThrowOutOfMemoryError(env, NULL);
return NULL;
}
// 将 '.' 转换成 '/'
VerifyFixClassname(clname);
if (!VerifyClassname(clname, JNI_TRUE)) {
// 如果指定的类名不合法, 抛出异常
JNU_ThrowClassNotFoundException(env, clname);
goto done;
}
// 让jvm使用启动类加载器加载类, 第四位标志0表示使用启动类加载器,
// throwError为JNI_FALSE时抛出 ClassNotFoundException,而JNI_TRUE抛出NoClassDefFoundError
cls = JVM_FindClassFromClassLoader(env, clname, JNI_FALSE, 0, JNI_FALSE);
done:
if (clname != buf) {
// 类名的格式有问题,且没有走buf缓存,则释放掉创建的内存, 防止内存泄漏
free(clname);
}
return cls;
}// 摘自 hotspotsrcsharevmprimsjvm.h
/*
* jvm.h头文件, 类似java接口的定义。
× 根据给定的classLoader来加载指定类
×
× *env JNI运行环境
× *name 类名(路径)
× init 是否需要初始化类的内部数据结构
× loader 类加载器标识
× throwError 抛出的异常类型
*/
JNIEXPORT jclass JNICALL
JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init,
jobject loader, jboolean throwError);// 摘自 hotspotsrcsharevmprimsjvm.cpp
JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
jboolean init, jobject loader,jboolean throwError))
JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
throwError ? "error" : "exception");
// 确保字符串不为NULL且长度不大于 (1 << 16) -1 , 否则抛出异常
if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
if (throwError) {
THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
} else {
THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
}
}
// 将类名放入一个hashmap, 标记符号用的, 并构造为 symbolHandle
// (注意: Handle是一种间接的, 由线程变量分配空间的类,作用是防止GC回收)
// CHECK_0是一个宏, 作用是判断是否有没有处理掉的异常, 如果有, 返回0
symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_0);
// 将classLoader标识转换成JVM内部表示的数据结构, 并构造为 Handle
Handle h_loader(THREAD, JNIHandles::resolve(loader));
jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
Handle(), throwError, thread);
if (TraceClassResolution && result != NULL) {
trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
}
return result;
JVM_END// 摘自 hotspotsrcsharevmprimsjvm.cpp
jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
// 生成类的内部数据结构, 核心步骤,非常复杂, 后期补充一下这里, 但是对核心逻辑没影响
klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError, CHECK_0);
// 将类的数据结构, 构造为 KlassHandle
KlassHandle klass_handle(THREAD, klass);
if (init && klass_handle->oop_is_instance()) {
// 初始化类内部的数据结构
klass_handle->initialize(CHECK_0);
}
// 分配内存, 生成class对象
return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
}
private Class findBootstrapClass0(String name)
throws ClassNotFoundException
{
check();
if (!checkName(name))
throw new ClassNotFoundException(name);
return findBootstrapClass(name);
}
private native Class findBootstrapClass(String name)
throws ClassNotFoundException;// 摘自 j2sesrcshareclassesjavalangClassLoader.c
// 表示该函数将被 java class 以jni方式调用
JNIEXPORT jclass JNICALL
Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader,
jstring classname)
{
char *clname;
jclass cls = 0;
char buf[128];
if (classname == NULL) {
// 类名不能为空
JNU_ThrowClassNotFoundException(env, 0);
return 0;
}
// 将java的string转成unicode字符, 如果unicode字符长度不超过128
// 则不分配内存,直接拿buf缓存来使用
// 否则就malloc一块内存存放, 如果malloc失败, 则返回NULL
clname = getUTF(env, classname, buf, sizeof(buf));
if (clname == NULL) {
// 类名为空, 说明 JVM 内存分配失败, 抛出邪恶的OOM.
JNU_ThrowOutOfMemoryError(env, NULL);
return NULL;
}
// 将 '.' 转换成 '/'
VerifyFixClassname(clname);
if (!VerifyClassname(clname, JNI_TRUE)) {
// 如果指定的类名不合法, 抛出异常
JNU_ThrowClassNotFoundException(env, clname);
goto done;
}
// 让jvm使用启动类加载器加载类, 第四位标志0表示使用启动类加载器,
// throwError为JNI_FALSE时抛出 ClassNotFoundException,而JNI_TRUE抛出NoClassDefFoundError
cls = JVM_FindClassFromClassLoader(env, clname, JNI_FALSE, 0, JNI_FALSE);
done:
if (clname != buf) {
// 类名的格式有问题,且没有走buf缓存,则释放掉创建的内存, 防止内存泄漏
free(clname);
}
return cls;
}// 摘自 hotspotsrcsharevmprimsjvm.h
/*
* jvm.h头文件, 类似java接口的定义。
× 根据给定的classLoader来加载指定类
×
× *env JNI运行环境
× *name 类名(路径)
× init 是否需要初始化类的内部数据结构
× loader 类加载器标识
× throwError 抛出的异常类型
*/
JNIEXPORT jclass JNICALL
JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init,
jobject loader, jboolean throwError);// 摘自 hotspotsrcsharevmprimsjvm.cpp
JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
jboolean init, jobject loader,jboolean throwError))
JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
throwError ? "error" : "exception");
// 确保字符串不为NULL且长度不大于 (1 << 16) -1 , 否则抛出异常
if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
if (throwError) {
THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
} else {
THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
}
}
// 将类名放入一个hashmap, 标记符号用的, 并构造为 symbolHandle
// (注意: Handle是一种间接的, 由线程变量分配空间的类,作用是防止GC回收)
// CHECK_0是一个宏, 作用是判断是否有没有处理掉的异常, 如果有, 返回0
symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_0);
// 将classLoader标识转换成JVM内部表示的数据结构, 并构造为 Handle
Handle h_loader(THREAD, JNIHandles::resolve(loader));
jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
Handle(), throwError, thread);
if (TraceClassResolution && result != NULL) {
trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
}
return result;
JVM_END// 摘自 hotspotsrcsharevmprimsjvm.cpp
jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
// 生成类的内部数据结构, 核心步骤,非常复杂, 后期补充一下这里, 但是对核心逻辑没影响
klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError, CHECK_0);
// 将类的数据结构, 构造为 KlassHandle
KlassHandle klass_handle(THREAD, klass);
if (init && klass_handle->oop_is_instance()) {
// 初始化类内部的数据结构
klass_handle->initialize(CHECK_0);
}
// 分配内存, 生成class对象
return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
}
发表评论
-
Java类的初始化过程详解
2010-04-11 17:09 1182java是多线程的,所以类 ... -
jvm 字节码中文含义
2010-04-08 11:31 3564栈和局部变量操作 将常 ... -
诡异的JVM Crash之EXCEPTION_STACK_OVERFLOW
2010-04-08 11:08 1680关于JVM的一个常识是:如果对象被意外地持有很容易造成内存泄漏 ... -
jvm 初始化
2010-04-07 16:01 1131void vm_init_globals() { chec ... -
jvm gc
2010-04-06 23:52 969jvm gc -
jvm exception
2010-04-06 23:52 811jvm exception -
jvm method invoke
2010-04-06 23:51 1037jvm method invoke -
jvm interpreter
2010-04-06 23:51 1200jvm interpreter 解释器的初始化 JNI_Cr ... -
jvm运行时数据结构
2010-04-06 23:50 873jvm运行时数据结构 -
jvm class与instance运行时结构
2010-04-06 23:49 833jvm class与instance运行时结构 -
jvm dll加载分析
2010-04-06 23:48 1131jvm dll加载分析 -
java class文件格式
2010-04-06 23:43 1392struct ClassFile { u4 magic; ... -
汇编语言与计算机体系结构--使用C++和Java
2010-04-06 15:16 1628第1章数制1 1.1简介1 1.2按位记数制1 1.3各数制的 ... -
JVM内存管理及垃圾回收机制
2010-04-06 09:30 813JAVA在内存中由 Perm 和 He ... -
IBM Java Jvm GC实现内幕 (几年前的老文)
2010-04-05 14:39 775好言归正传,按照Sam Borman的说法IBM java 1 ... -
修复 Java 内存模型,第 1 部分(什么是 Java 内存模型,最初它是怎样被破坏的?)
2010-03-30 14:16 1007Java 平台把线程和多处理技术集成到了语言中,这种集成程度比 ... -
JVM内存结构
2010-03-29 15:25 767(1)类装载子系统 装载 连 ... -
Java轻量级锁原理详解(Lightweight Locking)
2010-03-29 15:21 750Java轻量级锁原理详解(Lightweight Lockin ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:15 1030类的初始化和对象初始 ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:14 703类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要 ...
相关推荐
Bootstrap 网格系统(Grid System)的工作原理 21 媒体查询 21 网格选项 22 响应式的列重置 23 偏移列 25 嵌套列 26 列排序 28 Bootstrap 排版 31 标题 31 引导主体副本 33 强调 34 缩写 35 地址(Address) 36 引用...
2.加载成功,根据$table.bootstrapTable({options})显示表格样式。 感觉还是挺漂亮的哈,OK,下面贴代码解释功能。 开始之前,当然要引用js啦 <link href="~/Content/bootstrap.min.css" rel="stylesheet" /&...
技术上来讲,EvaBootstrap的实现原理就是在TB有侵入性的代码上加入了一些CSS Class命名空间,所以使用时会与TB有细微的差别: 文本排版 对于需要文本排版的元素,需要增加一个class .typo: 在Twitter Bootstrap中...
类加载器和Bootstrap类加载器的类型? 使用瞬态关键字 HashMap是在哪个数据结构上? Java 8消除了permGen内存块,为什么? 与stream()可选是否可以应用? 春天 @Bean可以在类级别使用吗? Spring自动接线的...
博主在工作中再次碰见问题,发现很多网上解决bsSuggest组件实现二级联动都是修改源码才能解决问题,但因为Bootstrap的更新,源码也更新很快,网上都已经是老的解决办法,今天博主就给大家写一篇很蠢但是很实用的解决...
这是它的工作原理: 所有 /admin/* URL 将首先尝试加载名为“be_%SECTION_NAME%”的控制器文件,如果找不到该名称的控制器,则它将回退到正常路由。 所有其他 URL 将首先尝试加载名为“fe_%SECTION_NAME%”的控制器...
在网页中,经常见到进度条效果,如:平分系统、加载状态等,进度条组件使用了css3的transition和animation属性来完成一些特效,这些特效在IE9及IE9以下版本、Firefox的老版本中并不支持,Opera 12 不支持 animation ...
5.5.4 使用Bootstrap 104 5.6 用户注册和登录 107 5.6.1 访问数据库 107 5.6.2 会话支持 110 5.6.3 注册和登入 111 5.6.4 页面权限控制 120 5.7 发表微博 123 5.7.1 微博模型 123 5.7.2 发表微博 ...
5.5.4 使用Bootstrap 104 5.6 用户注册和登录 107 5.6.1 访问数据库 107 5.6.2 会话支持 110 5.6.3 注册和登入 111 5.6.4 页面权限控制 120 5.7 发表微博 123 5.7.1 微博模型 123 5.7.2 ...
为了查看某些组件的工作原理,我不得不深入研究模块文件本身。 我在公共index.html中创建了一个加载动画,以便访问者在等待时有一个加载指示器,它创建了一个不错CSS淡入淡出动画以使index.html消失并在应用程序的...
等待控件在网上搜有好多种,但是都很复杂,不一定用的顺手,再说我的项目是bootstrap的原因,又不敢轻易使用第三方控件,怕不兼容,于是自己动手写了个等待控件,其技术点包括动态加载CSS,javascript的命名空间,...
使用您想要的所有流行语: 企业级高度可扩展UI不可知功能已加载有关完整的文档,演练和示例-快速启动/设置使用内置的原理图: ng add @pebula/ngrid @pebula/ngrid包含辅助软件包/插件(例如: @pebula/ngrid/...
2):在ci如何加载css,js,image等等公共文件,在对应的模块中helper中可以扩展url,我的扩展如下(我是使用bootstrap进行搭建后台):admin/helpers/MY_url_helper.php 3):在layout定义layout视图文件,具体看...
本文使用下列技术:.NETFramework,C#本页内容CLR启动程序(Bootstrap)创建的域系统域(SystemDomain)共享域(SharedDomain)默认域(DefaultDomain)加载器堆(LoaderHeaps)类型原理对象实例方法表基实例大小方法...
Spring+SpringMVC+Mybatis框架集成公共模块,包括公共配置、MybatisGenerator扩展插件、通用BaseService、工具类等。 > zheng-admin 基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`...
Java面试题40.jQuery中页面加载完毕事件 Java面试题41.jQuery中Ajax和原生js实现Ajax的关系 Java面试题42.简单说一下html5 Java面试题43.简单说一下css3 Java面试题44.bootstrap的是什么 Java面试题45.什么是框架 ...
│ Java面试题40.jQuery中页面加载完毕事件.mp4 │ Java面试题41.jQuery中Ajax和原生js实现Ajax的关系.mp4 │ Java面试题42.简单说一下html5.mp4 │ Java面试题43.简单说一下css3.mp4 │ Java面试题44.bootstrap的是...
Doks删除未使用CSS,预取链接并延迟加载图像。 SEO就绪。 对结构化数据,打开的图形和Twitter卡使用明智的默认设置。 或根据自己的喜好轻松更改SEO设置。 开发工具。 充满信心地编码。 检查样式,脚本和标记是否...
JQuery事件之页面框架和加载后自动执行 JQuery扩展以及自动执行函数的应用 JQuery阻止事件发生 JQuery扩展 作业 第18周 内容概要 JS正则详解 JS正则详解之验证 组件BootStrap、EasyUI、JQueryUI 插件轮播 Django_...
08 类的装饰器的基本原理 09 类的装饰器增强版 10 类的装饰器的应用 11 自定制property 12 自定制property流程分析 13 自定制property实现延迟计算功能 14 property补充 15 元类介绍 16 自定义元类 17 函数复习 18 ...