openjdk中周期线程为WatcherThread,在
jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
............
if (PeriodicTask::num_tasks() > 0) {
WatcherThread::start(); //启动周期线程
}
.............
}
看看WatcherThread构造函数
WatcherThread::WatcherThread() : Thread() {
if (os::create_thread(this, os::watcher_thread)) {//此步仅创建线程,并不自动运行
_watcher_thread = this;
os::set_priority(this, MaxPriority);
if (!DisableStartThread) {
os::start_thread(this); //运行刚创建的线程
}
}
}
由前文《java.lang.Thread.start》可知,在start之后将运行WatcherThread::run方法。
void WatcherThread::run() {
.........
while(!_should_terminate) {
const size_t time_to_wait = PeriodicTask::time_to_wait(); //计算下一个任务所需等待的最小时间
os::sleep(this, time_to_wait, false);
//上面的等待其实和linux操作系统的定时任务原理一样,只不过操作系统是根据更低层的时间节拍来计算。
.........
PeriodicTask::real_time_tick(time_to_wait);//在PeriodicTask中调用任务
//没有任务,退出,个人感觉没有任务等待应该更好,不知道为何这样设计
if (PeriodicTask::num_tasks() == 0) {
_should_terminate = true;
}
}
}
void PeriodicTask::real_time_tick(size_t delay_time) {
...........
for(int index = 0; index < _num_tasks; index++) {
_tasks[index]->execute_if_pending(delay_time); //执行任务
}
}
加入任务队列,是通过下面的方法
void PeriodicTask::enroll() {
if (_num_tasks == PeriodicTask::max_tasks)
fatal("Overflow in PeriodicTask table");
_tasks[_num_tasks++] = this;
}
分享到:
相关推荐
5. **并发与多线程**:"java.util.concurrent"包提供了高级并发工具,而"src/hotspot/share/prims/jvmti"目录下的代码则实现了Java虚拟机接口(JVMTI),它允许工具与JVM进行交互,如调试、监控和性能分析。...
4. **内存管理**:学习Java对象的生命周期,理解垃圾收集的算法和策略。 5. **性能调优**:通过阅读源码,了解如何利用JDK提供的工具进行性能分析和调优。 6. **安全性**:深入理解Java的安全模型,包括类加载器、...
7. **线程和同步**:Hotspot实现了Java多线程模型,包括线程创建、调度、同步原语(如锁和条件变量)等。 8. **动态适应性**:Hotspot可以监测运行时行为,根据数据调整优化策略,如适应性运行时系统(Adaptive ...
例如,`sun.misc.Launcher$AppClassLoader`继承自`URLClassLoader`,并实现了类加载的逻辑,这使得我们有机会深入了解类加载的生命周期。 在文件列表中,我们可以看到`sun`、`javax`、`com`、`launcher`等目录,...
2. **线程的生命周期** 线程有五种状态:新建、就绪、运行、阻塞和死亡。Java的`Thread`类提供了控制线程的方法,如`start()`启动线程,`join()`等待线程结束,`sleep()`使线程暂停执行等。 3. **线程同步** 在多...
分析它们的源码,有助于理解Java程序的生命周期管理。 4. **JDK工具**:如jconsole、jvisualvm等,这些工具用于监控和诊断Java应用程序。源码中包含这些工具的实现,可以让我们了解如何利用JMX(Java Management ...
1. **类加载器**:理解如何加载和验证类文件,以及类的生命周期管理。 2. **垃圾收集器**:包括新生代、老年代的内存管理,如何触发垃圾收集,以及不同垃圾收集策略(如CMS、G1、ZGC等)的实现。 3. **即时编译...
标题“jdk8u_x64_25.71-b00”指的是Oracle JDK 8更新版的一个64位版本,这里的“8u”代表JDK 8,“x64”表示该版本适用于64位操作系统,而“25.71-b00”是版本号,通常“25”代表第25个更新周期,“71”可能是内部...
- Java虚拟机栈是线程私有的,其生命周期与线程相同。每当一个线程开始执行时,虚拟机就会为该线程创建一个栈,用于存储线程的局部变量表、操作数栈、动态链接信息以及方法退出信息等。 - 局部变量表用于存放方法...
- **更新策略**:Oracle JDK有更频繁的更新周期,包括长期支持版本(LTS)和非LTS版本,而OpenJDK主要遵循Java SE规范的发布节奏。 3. **JVM优化** - **HotSpot虚拟机**:OpenJDK 8中使用的JVM,具有即时编译...
- **具体实现**:根据规范创建的实际JVM,例如HotSpot JVM或OpenJDK JVM等。 - **运行实例**:每当运行一个Java程序,就会启动一个JVM实例,执行程序直到结束。 2. **Java虚拟机的生命周期** - JVM的启动始于`...
1. **内存分析**:JProfiler可以详细追踪内存分配,检测内存泄漏,通过对象生存周期分析来确定哪些对象被长时间持有,导致内存无法释放。 2. **CPU Profiling**:实时监控和分析Java应用程序的CPU使用情况,展示...
Oracle JDK可能会有更快的更新周期和更好的性能优化,但OpenJDK的开放性使其更适合社区协作和定制化需求。 在面试中,理解这些基础知识是至关重要的。此外,深入理解垃圾回收、并发模型、设计模式、集合框架、IO流...
**JDK10与OpenJDK10源码解析** JDK10是Java开发工具包的第十个主要版本,它的发布标志着Java平台的持续进化。这个版本引入了许多新的特性和改进,旨在提升性能、易用性和开发者的生产力。本文将深入探讨JDK10的底层...
10. **JVM与最新技术的结合**:现代JVM如OpenJDK和Oracle JDK持续发展,引入了如Project Jigsaw(模块系统)、Project Panama(Native Interface改进)等新技术,了解这些新特性如何影响JVM,能让你保持技术的前沿性...
JProfiler是一款跨平台的Java性能分析器,它支持Java虚拟机(JVM)的各种版本,包括Oracle JDK、OpenJDK等。JProfiler通过JVM的代理模式连接到运行中的Java应用,提供实时的性能监控和分析,包括CPU使用率、内存分配...
- **内存溢出**:通常由于对象生命周期管理不当导致。 - **性能问题**:如GC频繁、响应时间过长等问题。 - **线程死锁**:由于线程间的同步问题引起。 ### 总结 JVM是Java开发中一个非常重要的概念,理解其内部机制...
小程序(Applet)是嵌入到HTML网页中的Java程序,它们的生命周期和运行方式与应用程序不同。 **1.2 Java语法** Java语法包括变量、数据类型、控制结构、类和对象等。例如,字符型常量和字符串常量的区别在于,字符...
在JVM中,内存被划分为不同的区域,每个区域都有其特定的功能和生命周期。线程是JVM执行代码的基本单位,每个线程都有自己独立的程序计数器、虚拟机栈和本地方法栈。程序计数器记录当前线程正在执行的指令地址;...
OpenJDK拥有更快的迭代周期,引入新特性的速度更快。 - **性能差异**:早期版本中Oracle JDK在某些场景下的性能优于OpenJDK,但随着时间的发展,两者之间的差距逐渐缩小。 #### Java与C++的异同 - **内存管理**:...