在Java虚拟机上班是一种怎样的体验?
228 人赞同了该回答
利益相关,匿了!
JVM公司里面线程众多,派系林立,尤其是执行引擎那波人,因为是核心部门,经常diss别的部门。
428 人赞同了该回答
不请自来。
其实在JVM工作没有你们想象的那么辛苦,其他部门不清楚,就拿我所在的垃圾回收部(这名字不好听,叫GC部门吧)来说说。
我的工作是负责执行对象的finalize
方法,你们也知道,现在的程序员,很少实现类的这个方法了,所以我的工作大部分时间都可以摸鱼。
--------------------分割线--------------------
评论里有人问我对象的finalize
方法是如何被执行的,这里统一回复一下。
JVM的ClassLoader
部门在加载一个class的时候,会检查它是否有实现finalize
方法,具体细节我不太清楚,请 @AppClassLoader 同学来帮忙解答一下。
如果发现有finalize
方法,以后创建这个类的所有对象都会附带创建一个Finalizer
对象。
这个Finalizer
有两个关键点:
- 继承自Reference类,本身也是一个引用,引用的正是跟它一起创建的那个对象
- 里面有一个名叫queue的成员,指向了一个队列:
ReferenceQueue
,正是Finalizer
的一个静态成员变量。
除此之外,Finalizer
里面还有一个静态线程FinalizerThread
,这个其实就是我了。我的工作就是不断上面的队列里面取出Finalizer
对象,然后执行它引用对象的finalize
方法。
什么?你问我Finalizer
对象是什么时候进入这个队列里的?这我就不知道了,超出了我的工作范围,可以请 @ReferenceHandler 帮忙解答一下。
以上。
522 人赞同了该回答
谢邀!
JVM公司整体来说还是挺不错的,各方面条件都还不错。办公大厦有两层,一楼是native层,一堆native层的线程员工在下面办公。我在二楼的Java层,这一层都是Java线程。
我在JVM类加载部门工作,我的Leader是ExtClassLoader
,他的Leader是公司高管BootstrapClassLoader
。
我们部门的工作就是把磁盘上的.class文件加载到内存中,变成一个个可以使用的类。工作嘛还算轻松。不过有一点让我不爽的是部门的双亲委派
制度。
图源网络
每次遇到新的类需要加载,按照规定都必须请示领导来加载,领导又去请示他的领导来加载。但是高管BootstrapClassLoader
只负责加载Java的核心类,我的领导也只负责加载一些扩展类,所以大部分时间请示完了结果他们都加载不了,还得让我去加载。
一来二去的花了不少时间在流程上,瞎耽误工夫。我多次反应这个问题,能不能不请示我直接加载算了,不过每次都被驳回,说是为了安全考虑,他们必须过目。唉,领导不肯放权也是难办!
--------------------分割线--------------------
评论区戾气太重!说我不懂安全也是醉了。
回答一下 @FinalizerThread 同学的问题。
确实如他所说,我们ClassLoader会去检查类有没有实现finalize
方法,检查结果会保存在Klass结构中的AccessFlags
里。
这是一个很重要的字段,记录了类的很多属性:
有了这些信息,创建对象的时候就可以检查标记来决定是否创建Finalizer
对象了。
以上。
145 人赞同了该回答
感谢 @FinalizerThread 同学邀请。
人在JVM,刚下晚班。
时间紧迫,简单说几句。
和这位同学一样,我也是GC部门的员工,公司待遇确实不错,这方面还是很有竞争力的。
至于我的工作嘛,跟垃圾回收密切相关!
你们也知道在Java中,除了基础的强引用外,还有四种特殊的引用:
- FinalReference
- 软引用(SoftReference)
- 弱引用(WeakReference)
- 虚引用(PhantomReference)
前面FinalizerThread同学提到的Finalizer其实就是FinalReference的子类。
我的工作就是在垃圾回收时,把这些个特殊引用一个个加入到它们各自对应的队列里面去。
拿上面FinalizerThread同学提到的Finalizer对象来说,就是我来把它加到它所指向的队列中,再由FinalizerThread同学去从这个队列里面取出来处理的。
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
};
安全点的进入和退出都是我来发起的,执行的是SafepointSynchronize
的begin()函数
和end()
函数。
以上。
本文用知乎体的风格简单介绍了JVM中几个内置线程的工作,希望对大家学习JVM有一点帮助。
如果喜欢本文欢迎帮忙转发分享,也欢迎大家关注我的微信公众号,更多有趣,更多风格的文章等你来看!
往期TOP5文章
在Java虚拟机上班是一种怎样的体验?的更多相关文章
- 深入Java虚拟机
第一章:Java体系结构介绍 1.Java为什么重要? Java是为网络而设计的,而Java这种适合网络环境的能力又是由其体系结构决定的,可以保证安全健壮和平台无关的程序通过网络传播. 2 ...
- [转]JAVA虚拟机的生命周期
JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例 ...
- 深入理解java虚拟机【Java Class类文件结构】
Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码 ...
- 深入理解java虚拟机【Java内存结构】
Java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区. Java虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区. (1 ...
- java虚拟机理解探索1
以下内容源于个人对<深入java虚拟机>的理解总结 基本概念: java虚拟机可以指一种抽象规范,也可以指一种具体实现,亦可以指一个java虚拟机实例. 虚拟机生命周期: 一个java虚拟 ...
- (转)《深入理解java虚拟机》学习笔记5——Java Class类文件结构
Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码 ...
- (转)《深入理解java虚拟机》学习笔记1——Java内存结构
java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区. Java虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区. (1 ...
- 深入Java虚拟机读书笔记第五章Java虚拟机
Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...
- Java虚拟机体系结构
转自:http://www.cnblogs.com/java-my-life/archive/2012/08/01/2615221.html JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的 ...
随机推荐
- [Objective-C] 001_Hello Objective-C
"Hello Word"从来都是经典中的经典!今天我们就来个"Hello Objective-C"吧. 启动Xcode(6.3.1),从File菜单中选择New ...
- 【HIVE】(1)建表、导入数据、外部表、导出数据
导入数据 1). 本地 load data local inpath "/root/example/hive/data/dept.txt" into table dept; 2). ...
- Java实现 LeetCode 面试题 01.07. 旋转矩阵(按照xy轴转+翻转)
面试题 01.07. 旋转矩阵 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节.请你设计一种算法,将图像旋转 90 度. 不占用额外内存空间能否做到? 示例 1: 给定 mat ...
- Java实现 LeetCode 457 环形数组循环
457. 环形数组循环 给定一个含有正整数和负整数的环形数组 nums. 如果某个索引中的数 k 为正数,则向前移动 k 个索引.相反,如果是负数 (-k),则向后移动 k 个索引.因为数组是环形的, ...
- Java实现 蓝桥杯VIP 算法训练 校门外的树
问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--,L,都种 ...
- Java实现 LeetCode 268 缺失数字
268. 缺失数字 给定一个包含 0, 1, 2, -, n 中 n 个数的序列,找出 0 - n 中没有出现在序列中的那个数. 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [ ...
- Java实现 蓝桥杯VIP 算法训练 连接字符串
算法训练 连接字符串 时间限制:1.0s 内存限制:512.0MB 编程将两个字符串连接起来.例如country与side相连接成为countryside. 输入两行,每行一个字符串(只包含小写字母, ...
- Java实现中值问题
中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中间的值被称为中值. 使用Lomuto划分算法思想,此处引用<算法设计与分析基础>第 ...
- Java实现 蓝桥杯 历届试题 波动数列
问题描述 观察这个数列: 1 3 0 2 -1 1 -2 - 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b ...
- java实现第三届蓝桥杯拼音字母
拼音字母 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能 ...