来源 | 编程技术宇宙

责编| Carol

封图 | CSDN 下载自视觉中国

本文用知乎体的风格简单介绍了JVM中几个内置线程的工作,希望对大家学习JVM有一点帮助。

匿名用户

JVM老鸟

228 人赞同了该回答

利益相关,匿了!

JVM公司里面线程众多,派系林立,尤其是执行引擎那波人,因为是核心部门,经常diss别的部门。

FinalizerThread

JVM核心员工,GC部门高级工程师。

428 人赞同了该回答

不请自来。

其实在JVM工作没有你们想象的那么辛苦,其他部门不清楚,就拿我所在的垃圾回收部(这名字不好听,叫GC部门吧)来说说。

我的工作是负责执行对象的finalize方法,你们也知道,现在的程序员,很少实现类的这个方法了,所以我的工作大部分时间都可以摸鱼。

评论里有人问我对象的finalize方法是如何被执行的,这里统一回复一下。

JVM的ClassLoader部门在加载一个class的时候,会检查它是否有实现finalize方法,具体细节我不太清楚,请 @AppClassLoader 同学来帮忙解答一下。

如果发现有finalize方法,以后创建这个类的所有对象都会附带创建一个Finalizer对象。

这个Finalizer有两个关键点:

  • 继承自Reference类,本身也是一个引用,引用的正是跟它一起创建的那个对象

  • 里面有一个名叫queue的成员,指向了一个队列:ReferenceQueue,正是Finalizer的一个静态成员变量。

除此之外,Finalizer里面还有一个静态线程FinalizerThread,这个其实就是我了。我的工作就是不断上面的队列里面取出Finalizer对象,然后执行它引用对象的finalize方法。

什么?你问我Finalizer对象是什么时候进入这个队列里的?这我就不知道了,超出了我的工作范围,可以请 @ReferenceHandler 帮忙解答一下。

以上。

AppClassLoader

JVM核心员工,类加载部门工程师。

522 人赞同了该回答

谢邀!

JVM公司整体来说还是挺不错的,各方面条件都还不错。办公大厦有两层,一楼是native层,一堆native层的线程员工在下面办公。我在二楼的Java层,这一层都是Java线程。

我在JVM类加载部门工作,我的Leader是ExtClassLoader,他的Leader是公司高管BootstrapClassLoader

我们部门的工作就是把磁盘上的.class文件加载到内存中,变成一个个可以使用的类。工作嘛还算轻松。不过有一点让我不爽的是部门的双亲委派制度。

每次遇到新的类需要加载,按照规定都必须请示领导来加载,领导又去请示他的领导来加载。但是高管BootstrapClassLoader只负责加载Java的核心类,我的领导也只负责加载一些扩展类,所以大部分时间请示完了结果他们都加载不了,还得让我去加载。

一来二去的花了不少时间在流程上,瞎耽误工夫。我多次反应这个问题,能不能不请示我直接加载算了,不过每次都被驳回,说是为了安全考虑,他们必须过目。唉,领导不肯放权也是难办!

------------分割线------------

评论区戾气太重!说我不懂安全也是醉了。

回答一下 @FinalizerThread 同学的问题。

确实如他所说,我们ClassLoader会去检查类有没有实现finalize方法,检查结果会保存在Klass结构中的AccessFlags里。

这是一个很重要的字段,记录了类的很多属性:

有了这些信息,创建对象的时候就可以检查标记来决定是否创建Finalizer对象了。

以上。

ReferenceHandler

JVM核心员工,GC部门高级工程师。

145 人赞同了该回答

感谢 @FinalizerThread 同学邀请。

人在JVM,刚下晚班。

时间紧迫,简单说几句。

和这位同学一样,我也是GC部门的员工,公司待遇确实不错,这方面还是很有竞争力的。

至于我的工作嘛,跟垃圾回收密切相关!

你们也知道在Java中,除了基础的强引用外,还有四种特殊的引用:

  • FinalReference

  • 软引用(SoftReference)

  • 弱引用(WeakReference)

  • 虚引用(PhantomReference)

前面FinalizerThread同学提到的Finalizer其实就是FinalReference的子类。

我的工作就是在垃圾回收时,把这些个特殊引用一个个加入到它们各自对应的队列里面去。

拿上面FinalizerThread同学提到的Finalizer对象来说,就是我来把它加到它所指向的队列中,再由FinalizerThread同学去从这个队列里面取出来处理的。

VMThread

JVM核心员工,后勤部主管。

898 人赞同了该回答

这个问题我来简单回答一下。

看了前面几位的回答,真的是旱的旱死,涝的涝死。我一天天忙得气都喘不过来,你们居然还有时间摸鱼!

我算是JVM公司里每天到的最早的几个了,跟随Threads::create_vm就起来了。

和楼上两位一样的是我也有一个工作队列,叫_vm_thread,其类型是VMOperationQueue

和楼上两位不一样的是他们工作在二楼Java层,而我工作在一楼native层。

工作节奏这个东西真的是不同部门差得很远,我所在的部门就我一个人,是一个单例线程,我要干的就是不断从工作队列里面取出操作来执行。

这个队列里面装的都是一个个封装成VM_Operation的东西,这是它们的基类,具体来说,有几十种操作,列举一部分,你们随意感受一下:

#define VM_OPS_DO(template)                       \template(None)                                  \template(ThreadStop)                            \template(ThreadDump)                            \template(PrintThreads)                          \template(FindDeadlocks)                         \template(ClearICs)                              \template(ForceSafepoint)                        \template(ForceAsyncSafepoint)                   \template(Deoptimize)                            \template(DeoptimizeFrame)                       \template(DeoptimizeAll)                         \template(ZombieAll)                             \template(Verify)                                \template(PrintJNI)                              \template(HeapDumper)                            \template(DeoptimizeTheWorld)                    \template(CollectForMetadataAllocation)          \template(GC_HeapInspection)                     \template(GenCollectFull)                        \template(GenCollectFullConcurrent)              \template(GenCollectForAllocation)               \template(ParallelGCFailedAllocation)            \template(ParallelGCSystemGC)                    \······

其他就不说了,就拿你们最熟悉的垃圾回收来说,没有了我,JVM的堆区内存恐怕早就垃圾堆成山了。

时间关系,先写到这里。

---------------分割线---------------

一觉醒来居然有这么多赞,谢谢大家!

再补充几句。

VM_Operation中还设置了一个模式,用来表示执行这个操作是否需要进入安全点,(比如垃圾回收就需要),是否需要加锁执行。

  enum Mode {_safepoint,       // blocking, safepoint_no_safepoint,    // blocking, no safepoint_concurrent,      // non-blocking, no safepoint_async_safepoint  // non-blocking, safepoint};

安全点的进入和退出都是我来发起的,执行的是SafepointSynchronizebegin()函数end()函数。

以上。

推荐阅读
  • 不知道路由器工作原理?没关系,来这看看!看不懂你捶我 | 原力计划

  • 秋名山老司机从上车到翻车的悲痛经历,带你深刻了解什么是 Spark on Hive!| 原力计划

  • 出道50年+!乘风破浪的编程语言们,能二次翻红吗?

  • Service Mesh 如何重定义云原生计算?阿里服务网格技术大揭秘

  • 国士无双:卖掉美国房子,回国创办姚班,他只为培养一流的程序员!

  • 万字长文带你入门 GCN

  • 赠书 | 基于区块链法定货币的支付体系,应该怎么做?

真香,朕在看了!

在Java虚拟机上班是一种怎样的体验?相关推荐

  1. 在 Java 虚拟机上班是一种怎样的体验?

    来源 | 编程技术宇宙 责编| Carol 封图 | CSDN 下载自视觉中国 本文用知乎体的风格简单介绍了JVM中几个内置线程的工作,希望对大家学习JVM有一点帮助. 匿名用户 JVM老鸟 228 ...

  2. Java虚拟机层面的几种锁

    1.  偏向锁 当一个锁被线程获取后,这个线程便进入偏向模式,当线程再次请求这个锁时,无需再进行相关的同步操作,从而节省了时间.如果在此之前,其他线程进行了锁请求,则原线程退出偏向模式.当对象处于偏向 ...

  3. 在国企的 Java 程序员是一种什么样的体验?让我来告诉你吧!

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:00 更新文章,每天进步一点点... 每当谈 ...

  4. java 虚拟机规范_Java虚拟机规范----Java虚拟机结构

    Java体系和一些基本概念 Java平台的结构图: JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE: Jav ...

  5. 深入Java虚拟机读书笔记第五章Java虚拟机

    Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...

  6. JVM规范系列第2章:Java虚拟机结构

    本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...

  7. JAVA虚拟机体系结构

    JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台 ...

  8. java虚拟机及加载class文件的原理机制

    2019独角兽企业重金招聘Python工程师标准>>> (点击获取更多资料的下载) java 虚拟机 ‎2007‎年‎4‎月‎23‎日,‏‎14:18:00 | chenweicai ...

  9. Java虚拟机是什么

    http://boy00fly.iteye.com/blog/1095263 要理解java虚拟机,你首先必须意识到,当你说"Java虚拟机"时,可能指的是如下三个不同的东西: 1 ...

最新文章

  1. 面试干货——年底干货大放送,你准备好了吗?
  2. BZOJ 3436 小K的农场 差分约束
  3. 111. Leetcode 300. 最长递增子序列 (动态规划-子序列问题)
  4. 抽象工厂产品等级结构与产品族
  5. 超全整理|Python 操作 Excel 库 xlwings 常用操作详解!
  6. FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法...
  7. python3学习笔记 雨痕_Python 3 学习笔记:数字和布尔
  8. 大学c语言项目,项目大学C语言程序设计期末复习重点.doc
  9. 兼容浏览器的insertAdjacentHTML
  10. 小程序开发之图片转Base64(C#、.Net)
  11. 字典的启发——深入浅出数据库索引
  12. 利用GDB、KGDB调试应用程序及内核驱动模块
  13. windows权限了解
  14. Word 2019 插入参考文献
  15. 【Proteus仿真】自动量程(范围<10V)切换数字电压表
  16. 小技巧(12):关于PC端简单的视频剪辑处理中,bandicam(录制)、pr(配音)、pr(导出)、剪映(字幕识别)、pr(最终版导出)的全过程及基础设置
  17. 【毕业设计】基于单片机的心率血氧健康监测手表 - 物联网 嵌入式
  18. 好玩的数据结构与算法——八皇后游戏(回溯)
  19. android模拟程序被杀死,Android模拟后台进程被杀
  20. Discus论坛System Error界面修改标语

热门文章

  1. python怎么查看网页编码格式_怎么用python爬取网页文字?
  2. bcp out 带列名导出_从零开始学习 MySQL 系列索引、视图、导入和导出
  3. mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率
  4. java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. suse linux11 改ip,suse11如何修改hostname[Linux基础]
  6. 清华大学数学教授吐槽不会做孙子的小学奥数:这学的不是数学,是戏法
  7. 田刚院士:鼓励发展新型特色研究型大学
  8. 这不应该是19岁女孩的结局,这不应该是围观者该有的表达!
  9. 机器人电焊电流电压怎么调_【华光】HG1000型电焊机现场校准仪
  10. js解决客户端与服务器时间不一致的问题