Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
醒狮指南
JavaGuide
提交
a1b2931e
J
JavaGuide
项目概览
醒狮指南
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a1b2931e
编写于
3月 13, 2020
作者:
S
shuang.kou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update 类加载过程.md
上级
9fb487d9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
8 addition
and
3 deletion
+8
-3
docs/java/jvm/类加载过程.md
docs/java/jvm/类加载过程.md
+8
-3
未找到文件。
docs/java/jvm/类加载过程.md
浏览文件 @
a1b2931e
...
...
@@ -76,13 +76,18 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚
对于
`<clinit>()`
方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为
`<clinit>()`
方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。
对于初始化阶段,虚拟机严格规范了有且只有5种情况下,必须对类进行初始化:
对于初始化阶段,虚拟机严格规范了有且只有5种情况下,必须对类进行初始化
(只有主动去使用类才会初始化类)
:
1.
当遇到 new 、 getstatic、putstatic或invokestatic 这4条直接码指令时,比如 new 一个类,读取一个静态字段(未被 final 修饰)、或调用一个类的静态方法时。
2.
使用
`java.lang.reflect`
包的方法对类进行反射调用时 ,如果类没初始化,需要触发其初始化。
-
当jvm执行new指令时会初始化类。即当程序创建一个类的实例对象。
-
当jvm执行getstatic指令时会初始化类。即程序访问类的静态变量(不是静态常量,常量会被加载到运行时常量池)。
-
当jvm执行putstatic指令时会初始化类。即程序给类的静态变量赋值。
-
当jvm执行invokestatic指令时会初始化类。即程序调用类的静态方法。
2.
使用
`java.lang.reflect`
包的方法对类进行反射调用时如Class.forname("..."),newInstance()等等。 ,如果类没初始化,需要触发其初始化。
3.
初始化一个类,如果其父类还未初始化,则先触发该父类的初始化。
4.
当虚拟机启动时,用户需要定义一个要执行的主类 (包含 main 方法的那个类),虚拟机会先初始化这个类。
5.
当使用 JDK1.7 的动态动态语言时,如果一个 MethodHandle 实例的最后解析结构为 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个句柄没有初始化,则需要先触发器初始化。
5.
MethodHandle和VarHandle可以看作是轻量级的反射调用机制,而要想使用这2个调用,
就必须先使用findStaticVarHandle来初始化要调用的类。
## 卸载
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录