当前位置: 首页 > news >正文

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

匿名用户

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()函数。

以上。

RECOMMEND

推荐阅读

01

《Java编程思想》

点击链接了解详情并购买

推荐理由:畅销二十余年,经典不衰, 程序员案头必备宝典。带你真正领略编程之美。本书赢得了全球程序员的广泛赞誉,即使是非常晦涩的概念,在Bruce Eckel具有亲和力的文字和小而直接的编程示例面前也会化解于无形。

02

《Java核心技术(原书第11版)》

 

点击链接了解详情并购买

推荐理由:《Java核心技术》第11版,获Jolt大奖图书,针对Java SE 9、10、11全面更新,补充了Java新版本的新特性,用更清晰明了的示例加以解释。卷I:主要介绍Java语言的基础知识的专业级详解;卷II:主要介绍软件开发需要了解的高级主题。


03

《Effective Java中文版(原书第3版)》

点击链接了解详情并购买

推荐理由:你是否正在寻找一本能够更加深入地了解Java编程语言的书,以便编写出更清晰、更正确、更健壮且更易于重用的代码?本书再适合不过了!这是一本分享经验并指引你少走弯路的经典著作,针对如何编写高效、设计优良的程序提出了最实用、最权威的指导方针,通过90条经验法则,探索新的设计模式和语言习惯用法,帮你更加有效地使用Java编程语言及其基本类库。正版纸书采用双色印刷,阅读体验更佳。

04

《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

点击链接了解详情并购买

推荐理由:大厂面试通关宝典全新升级!第三版大幅更新50%以上内容,周志明从Java技术体系、自动内存管理、虚拟机执行子系统、程序编译与代码优化、高效并发5个维度全面剖析虚拟机。以实战为导向,通过大量实际案例,分享解决各种Java技术难题的方案和技巧。几乎涵盖大厂面试全部知识点。值得所有Java技术人员一读再读。

05

《深入理解JVM字节码》

 

点击链接了解详情并购买

推荐理由:这是一本揭示JVM字节码“黑科技”的著作,它从原理和应用两个维度深入剖析了JVM字节码。书中内容涉及JVM字节码的大部分应用场景,如Java性能优化、软件防护与破解、APM等,通过大量实战案例讲解了它在这些场景中的实操技巧。

 

06

《Java并发编程实战》

 

点击链接了解详情并购买

推荐理由:Java并发编程里程碑著作!10年畅销100000册。书中采用循序渐进的讲解方式,从并发编程的基本理论入手,逐步介绍了在设计Java并发程序时各种重要的设计原则、设计模式以及思维模式,同时辅以丰富的示例代码作为对照和补充,使得开发人员能够更快地领悟Java并发编程的要领,快速地构建大规模的并发应用程序。

07

《Java高并发编程详解:深入理解并发核心库》

点击链接了解详情并购买

推荐理由:《Java高并发编程详解:多线程与架构设计》的姊妹篇!从底层原理总结和归纳各个技术细节,结合真实的案例深入分析微基准测试、性能度量、Java高并发类库的原理及应用。详细介绍Java微基准测试工具集JMH与平台级性能指标数据度量工具Metrics的使用方法,帮助读者快速开发出高效、健壮的并发应用程序。

 

 

08

《Java多线程编程核心技术(第2版)》

 

点击链接了解详情并购买

推荐理由:案例式讲解,逐一分析和验证每个技术点,解决高并发环境下的业务瓶颈。全部以Demo式案例来讲解技术点的实现,使读者看到代码及运行结果后就可以知道项目要解决的是什么问题,让读者用最短的时间学习知识点,明白知识点如何应用,以及在使用时要避免什么,使读者能够快速学习知识并解决问题。

 

09

《新一代垃圾回收器ZGC设计与实现》

 

点击链接了解详情并购买

推荐理由:详细解剖Java11版本全新的垃圾收集器ZGC的运行原理以及调优方法,讲解细腻,图示丰富,可帮助Java工程师深入理解垃圾回收技术。

更多精彩回顾

书讯 |10月书讯(下)| 双节同庆,读书正当时

书讯 |10月书讯(上)| 双节同庆,读书正当时

上新 | 5G时代音视频开发王器:WebRTC
书单 | 开学季——想打好数学基础?这些经典教材你最需要!

干货 | 用户画像从0到100的构建思路

收藏 | 逐行分析鸿蒙系统的 JavaScript 开发框架

视频 | 大佬出镜推荐不可不读系列——Java建设者号主cxuan

点击阅读全文查看更多好书

相关文章:

  • 一文教会你数据库性能调优,附某大型医院真实案例
  • 「1.8W字」2020不可多得的 TS 学习指南
  • 【技术加油栈】这个十一不能错过的技术干货文章锦集!!!
  • 阿里中台变“厚”,企业中台路在何方?
  • 《凸优化教程》第2版全新升级
  • VUE.js入门与商城开发实战
  • 【第25期】国资委发文!10本书讲透数字化时代新机遇
  • (万字长文)Spring的核心知识尽揽其中
  • 百度官方出品 | 全面解读PaddlePaddle,零基础快速入门深度学习
  • 一文把Redis主从复制、哨兵、Cluster三种模式摸透
  • 数据分析必读干货:简单而实用的3大分析方法
  • TIOBE 10 月编程语言排行榜出炉:C语言居首,Python将超Java?
  • 宁振波:工业软件的焦点在仿真
  • DB-Engines 10月数据库排名:“三大王”无人能敌,PostgreSQL紧随其后
  • 司机失业?百度宣布:自动驾驶出租车在京开放,免费坐!
  • 【RocksDB】TransactionDB源码分析
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • canvas绘制圆角头像
  • CAP理论的例子讲解
  • CSS实用技巧干货
  • Docker容器管理
  • ES学习笔记(12)--Symbol
  • Java 多线程编程之:notify 和 wait 用法
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Js基础——数据类型之Null和Undefined
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Mac转Windows的拯救指南
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Web设计流程优化:网页效果图设计新思路
  • 不上全站https的网站你们就等着被恶心死吧
  • 初探 Vue 生命周期和钩子函数
  • 第2章 网络文档
  • 回流、重绘及其优化
  • 一起参Ember.js讨论、问答社区。
  • 自定义函数
  • 交换综合实验一
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #考研#计算机文化知识1(局域网及网络互联)
  • (3)llvm ir转换过程
  • (C语言)共用体union的用法举例
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十三)Maven插件解析运行机制
  • (转)fock函数详解
  • *** 2003
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET MVC第三章、三种传值方式
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net7 环境安装配置