- 浏览: 211122 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
Prepared:
Hadoop的几个明显缺点 -
CSunDNan:
...
openjdk jvm 方法字节码执行过程 -
幻影之蚀:
...
mysql 源码分析2 源码调试环境建立 -
shukongchengje:
紧急呼唤楼主,mysql代码从哪里弄?官网wiki上看的一头雾 ...
mysql源码分析 整体架构 -
yeshaoting:
好文章.不介意的话转载了.
jvm 字节码中文含义
java/lang/Thread.java看起
public synchronized void start() {
.....
start0(); // start0为本地方法 private native void start0();
.....
}
start0的实现是jvm.cpp中的JVM_StartThread。
......
native_thread = new JavaThread(&thread_entry, sz);
if (native_thread->osthread() != NULL) {
native_thread->prepare(jthread);
}
.....
Thread::start(native_thread);
函数指针thread_entry,thread_entry调用Thread.java中的run方法
static void thread_entry(JavaThread* thread, TRAPS) {
HandleMark hm(THREAD);
Handle obj(THREAD, thread->threadObj());
JavaValue result(T_VOID);
JavaCalls::call_virtual(&result,
obj,
KlassHandle(THREAD, SystemDictionary::thread_klass()),
vmSymbolHandles::run_method_name(), //调用用户编写thread类run方法
vmSymbolHandles::void_method_signature(),
THREAD);
}
new JavaThread(...)
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : Thread() {
.........
os::ThreadType thr_type = os::java_thread;
thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
os::java_thread;
os::create_thread(this, thr_type, stack_sz);
}
os::create_thread
bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
OSThread* osthread = new OSThread(NULL, NULL);
thread->set_osthread(osthread);
HANDLE thread_handle =
(HANDLE)_beginthreadex(NULL,
(unsigned)stack_size,
(unsigned (__stdcall *)(void*)) java_start,
thread,
CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
&thread_id);
//堵塞,直到上面的Thread::start(native_thread)才开始运行
.............
}
启动函数java_start。
static unsigned __stdcall java_start(Thread* thread) {
__try {
thread->run(); //注意:传入的是javaThread,所以在这调用javaThread::run
} __except(topLevelExceptionFilter(
(_EXCEPTION_POINTERS*)_exception_info())) {
}
}
void JavaThread::run() {
.......
thread_main_inner();//在里面真正调用用户写的java类run方法
}
void JavaThread::thread_main_inner() {
this->entry_point()(this, this); //调用传入thread_entry
//退出
this->exit(false);
delete this;
}
最后
void Thread::start(Thread* thread) {
........
os::start_thread(thread); //运行创建时堵塞的线程
}
void os::start_thread(Thread* thread) {
.........
OSThread* osthread = thread->osthread();
osthread->set_state(RUNNABLE);
pd_start_thread(thread);
}
void os::pd_start_thread(Thread* thread) {
//真正恢复操作系统线程运行的代码
DWORD ret = ResumeThread(thread->osthread()->thread_handle());
}
由上面可以看到每个继承java.lang.Thread的类,调用start之后,都和一个操作系统的线程进行绑定。
public synchronized void start() {
.....
start0(); // start0为本地方法 private native void start0();
.....
}
start0的实现是jvm.cpp中的JVM_StartThread。
......
native_thread = new JavaThread(&thread_entry, sz);
if (native_thread->osthread() != NULL) {
native_thread->prepare(jthread);
}
.....
Thread::start(native_thread);
函数指针thread_entry,thread_entry调用Thread.java中的run方法
static void thread_entry(JavaThread* thread, TRAPS) {
HandleMark hm(THREAD);
Handle obj(THREAD, thread->threadObj());
JavaValue result(T_VOID);
JavaCalls::call_virtual(&result,
obj,
KlassHandle(THREAD, SystemDictionary::thread_klass()),
vmSymbolHandles::run_method_name(), //调用用户编写thread类run方法
vmSymbolHandles::void_method_signature(),
THREAD);
}
new JavaThread(...)
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : Thread() {
.........
os::ThreadType thr_type = os::java_thread;
thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
os::java_thread;
os::create_thread(this, thr_type, stack_sz);
}
os::create_thread
bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
OSThread* osthread = new OSThread(NULL, NULL);
thread->set_osthread(osthread);
HANDLE thread_handle =
(HANDLE)_beginthreadex(NULL,
(unsigned)stack_size,
(unsigned (__stdcall *)(void*)) java_start,
thread,
CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
&thread_id);
//堵塞,直到上面的Thread::start(native_thread)才开始运行
.............
}
启动函数java_start。
static unsigned __stdcall java_start(Thread* thread) {
__try {
thread->run(); //注意:传入的是javaThread,所以在这调用javaThread::run
} __except(topLevelExceptionFilter(
(_EXCEPTION_POINTERS*)_exception_info())) {
}
}
void JavaThread::run() {
.......
thread_main_inner();//在里面真正调用用户写的java类run方法
}
void JavaThread::thread_main_inner() {
this->entry_point()(this, this); //调用传入thread_entry
//退出
this->exit(false);
delete this;
}
最后
void Thread::start(Thread* thread) {
........
os::start_thread(thread); //运行创建时堵塞的线程
}
void os::start_thread(Thread* thread) {
.........
OSThread* osthread = thread->osthread();
osthread->set_state(RUNNABLE);
pd_start_thread(thread);
}
void os::pd_start_thread(Thread* thread) {
//真正恢复操作系统线程运行的代码
DWORD ret = ResumeThread(thread->osthread()->thread_handle());
}
由上面可以看到每个继承java.lang.Thread的类,调用start之后,都和一个操作系统的线程进行绑定。
发表评论
-
Java类的初始化过程详解
2010-04-11 17:09 1229java是多线程的,所以类 ... -
jvm 字节码中文含义
2010-04-08 11:31 3627栈和局部变量操作 将常 ... -
诡异的JVM Crash之EXCEPTION_STACK_OVERFLOW
2010-04-08 11:08 1747关于JVM的一个常识是:如果对象被意外地持有很容易造成内存泄漏 ... -
jvm 初始化
2010-04-07 16:01 1181void vm_init_globals() { chec ... -
jvm gc
2010-04-06 23:52 1020jvm gc -
jvm exception
2010-04-06 23:52 851jvm exception -
jvm method invoke
2010-04-06 23:51 1080jvm method invoke -
jvm interpreter
2010-04-06 23:51 1249jvm interpreter 解释器的初始化 JNI_Cr ... -
jvm运行时数据结构
2010-04-06 23:50 909jvm运行时数据结构 -
jvm class与instance运行时结构
2010-04-06 23:49 871jvm class与instance运行时结构 -
jvm dll加载分析
2010-04-06 23:48 1173jvm dll加载分析 -
java class文件格式
2010-04-06 23:43 1424struct ClassFile { u4 magic; ... -
汇编语言与计算机体系结构--使用C++和Java
2010-04-06 15:16 1688第1章数制1 1.1简介1 1.2按位记数制1 1.3各数制的 ... -
JVM内存管理及垃圾回收机制
2010-04-06 09:30 854JAVA在内存中由 Perm 和 He ... -
IBM Java Jvm GC实现内幕 (几年前的老文)
2010-04-05 14:39 839好言归正传,按照Sam Borman的说法IBM java 1 ... -
修复 Java 内存模型,第 1 部分(什么是 Java 内存模型,最初它是怎样被破坏的?)
2010-03-30 14:16 1046Java 平台把线程和多处理技术集成到了语言中,这种集成程度比 ... -
JVM内存结构
2010-03-29 15:25 816(1)类装载子系统 装载 连 ... -
Java轻量级锁原理详解(Lightweight Locking)
2010-03-29 15:21 790Java轻量级锁原理详解(Lightweight Lockin ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:15 1063类的初始化和对象初始 ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:14 745类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要 ...
相关推荐
HotSpot 是 Oracle JDK 和 OpenJDK 使用的默认 JVM 实现,它的名字来源于其“热点代码”检测技术,能够识别并优化经常执行的代码段。 在 OpenJDK 8u60 中,我们可以找到以下关键知识点: 1. **类加载器(Class ...
Java虚拟机(JVM)是Java程序运行的基础,OpenJDK是JVM的一个开源实现,而OpenJDK 8则是其在Java 8版本上的具体体现。OpenJDK 8的源码对于开发者来说,是一个深入理解Java语言、JVM工作原理以及相关库函数的重要资源...
2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。Java内存模型(JMM)规定了线程对共享变量的可见性和有序性,它通过主内存和工作内存的概念来实现多线程之间的协作...
在Ubuntu操作系统中,OpenJDK(Open Source Java Development Kit)是Oracle JDK的开源替代品,提供了Java编程语言的实现和Java虚拟机(JVM)。OpenJDK7和OpenJDK8是两个不同的版本,分别对应Java 7和Java 8。这两个...
首先,选择一个合适的系统目录来存放OpenJDK,例如 `/usr/lib/jvm` 或 `/opt`: ```bash sudo mkdir -p /usr/lib/jvm sudo mv jdk-19 /usr/lib/jvm/ ``` 然后,编辑系统的环境变量配置文件,例如 `~/.bashrc` 或 `...
OpenJDK是由Sun Microsystems启动的项目,后来被甲骨文(Oracle)接手。OpenJDK 1.6版本基于Java SE 6,包含了JVM(Java虚拟机)、类库和开发工具等核心组件。它遵循GPLv2许可证,允许自由分发和修改源代码。 2. *...
OpenJDK 包含了多个组件,例如Java虚拟机(JVM)、Java类库、编译器(javac)、Java运行时环境(JRE)以及其他工具。在"openjdk-17.0.2_windows-x64_bin.zip"压缩包内,用户可以找到以下关键组件: 1. **JRE**: ...
在研究JVM源码时,可以参考OpenJDK项目,它是JDK的开源实现,提供了完整的JVM源代码。通过阅读源码,我们可以学习到更多关于类加载、内存管理、线程调度等底层细节,并且能够针对具体问题进行定制化开发。 个人网站...
OpenJDK作为Oracle JDK的替代品,提供了Java平台标准版(Java SE)的核心功能,包括Java虚拟机(JVM)、类库以及开发者工具。 Java虚拟机是OpenJDK的核心部分,它是Java平台的基石,负责执行字节码并提供平台无关的...
5. **Class Data Sharing(类数据共享)**:这个功能允许JVM在启动时分享类的数据,减少了启动时间和内存占用,特别是对于有大量预加载类的应用。 6. **增强的JShell(JShell增强)**:Java内置的REPL(Read-Eval-...
OpenJDK是Java虚拟机(JVM)和相关工具的开源实现,它遵循GNU General Public License(GPLv2)协议。OpenJDK不仅包括JVM,还包括编译器、类库和其他必要的组件,是Java开发和运行的基础。OpenJDK 21是一个特定的...
10. **jstack**:线程堆栈跟踪工具,用于查看Java应用程序的线程状态。 OpenJDK-7与Oracle JDK在功能上基本一致,但OpenJDK是开放源代码的,对于那些希望查看源码或者对Java技术进行研究的开发者来说,OpenJDK具有...
OpenJDK 18继续致力于性能提升,包括更快的启动时间、更好的内存管理以及对多线程和并发的优化。这些改进对大规模的服务器端应用尤其重要。 7. **社区与更新** OpenJDK项目是一个活跃的开源社区,开发者可以参与...
这个压缩包包含了OpenJDK 7的实现,OpenJDK是一个开源版本的Java开发工具包,它提供了Java虚拟机(JVM)以及Java编程语言的编译器和其他基础工具。ARM64,也被称为AArch64,是ARM架构的一个64位变体,广泛应用于...
《OpenJDK中的JVM Hotspot实现源码解析》 在Java世界中,JVM(Java Virtual Machine)是运行Java程序的关键组件,它负责将字节码解释执行或即时编译为机器码,使得Java具备跨平台的能力。Hotspot是Oracle JDK和...
开发者在使用OpenJDK 8_322时,可以利用Java 8的新特性来改进代码质量,例如使用Lambda表达式简化多线程编程,使用Stream API处理集合数据,或利用新的日期/时间API来处理日期和时间。此外,OpenJDK 8的JVM也支持...
OpenJDK 17 GA适用于开发和部署Java应用程序,它提供了强大的JVM(Java虚拟机)和JDK工具,如javac编译器、javadoc文档生成工具、jshell交互式REPL(Read-Eval-Print Loop)等。开发者可以利用这些工具构建、测试和...
6. **Class Data Sharing(类数据共享)**:这是一种优化技术,允许JVM在启动时分享已经解析和初始化的类数据,从而加快启动速度。 7. **Memory Segments(内存段)**:这是JEP 416的一部分,旨在改进低级别的内存...
通过研究OpenJDK源码,开发者可以学习到诸如垃圾回收、内存管理、多线程、网络编程、并发控制等高级主题。 首先,让我们深入了解JVM。JVM是Java程序运行的平台,它负责将字节码转换为机器码执行。在OpenJDK源码中,...
2. 系统调用:OpenJDK与操作系统进行交互,如文件操作、线程管理等,都涉及C语言的系统调用。 3. 性能优化:C++的底层特性使得OpenJDK能进行性能优化,如使用模板、内联函数等来提高运行效率。 通过深入研究...