![](https://img-blog.csdnimg.cn/20210207145605400.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java 虚拟机
文章平均质量分 93
深入拆解Java虚拟机。关注微信公众号:码农架构。专注于系统架构、高可用、高性能、高并发类技术分享
码农架构
专注于系统架构、高可用、高性能、高并发类技术分享
展开
-
对象在内存中的内存布局是什么样的?
一个Java对象的存储结构。在Hotspot虚拟机中,对象在内存中的存储布局分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)Java 对象实例Hotspt 采用了 OOP-Klass 模型。 它是描述 java 对象实例的模型,可分为两部分:OOP (Ordinary Object Pointer)指的是普通对象指针,它包含 MarkWord 和Klass 指针。MarkWord 用于存储当前对象运行时的一些状态数据;Klass 指针则原创 2021-07-26 13:30:54 · 405 阅读 · 0 评论 -
深入理解Java虚拟机是怎么实现synchronized的?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。当声明 synchronized 代码块时,编译而成的字节码将包含 monitorenter 和 monitorexit 指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是 synchronized 关键字括号里的引用),作为.原创 2021-02-23 09:55:36 · 233 阅读 · 2 评论 -
聊一聊Java垃圾回收与卡表技术
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享在读博士的时候,我曾经写过一个统计 Java 对象生命周期的动态分析,并且用它来跑了一些基准测试。其中一些程序的结果,恰好验证了许多研究人员的假设,即大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。(pmd 中 Java 对象生命周期的直方图,红色的表示被逃逸分析优化掉的对象)之所以要提到这个假设,是因为它造就了 Java 虚拟机的分代回收思想。简单来说,就.原创 2021-02-21 12:47:23 · 1301 阅读 · 4 评论 -
开发这么多年!垃圾回收你真的了解吗?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享你应该听说过这么一句话:免费的其实是最贵的。Java 虚拟机的自动内存管理,将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。不过既然是自动机制,肯定没法做到像手动回收那般精准高效 [1] ,而且还会带来不少与垃圾回收实现相关的问题。接下来的两篇,我们会深入探索 Java 虚拟机中的垃圾回收器。今天这一篇,我们来回顾一下垃圾回收的基础知识。引用计数法与可达性分析垃圾回收,顾名思义,便是将已.原创 2021-02-18 16:00:13 · 355 阅读 · 3 评论 -
Java 虚拟机:Java对象的内存布局
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享在 Java 程序中,我们拥有多种新建对象的方式。除了最为常见的 new 语句之外,我们还可以通过反射机制、Object.clone 方法、反序列化以及 Unsafe.allocateInstance 方法来新建对象。其中,Object.clone 方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。Unsafe.allocateInstance 方法则没有初始化实例字段,而 new 语句和反射机制.原创 2021-02-18 15:45:52 · 356 阅读 · 2 评论 -
Java 虚拟机:JVM是怎么实现invokedynamic的?(下)
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享上回讲到,为了让所有的动物都能参加赛马,Java 7 引入了 invokedynamic 机制,允许调用任意类的“赛跑”方法。不过,我们并没有讲解 invokedynamic,而是深入地探讨了它所依赖的方法句柄。今天,我便来正式地介绍 invokedynamic 指令,讲讲它是如何生成调用点,并且允许应用程序自己决定链接至哪一个方法中的。invokedynamic 指令invokedynamic 是 Ja.原创 2021-02-14 16:25:24 · 427 阅读 · 1 评论 -
Java 虚拟机:JVM是怎么实现invokedynamic的?(上)
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享前不久,“虚拟机”赛马俱乐部来了个年轻人,标榜自己是动态语言,是先进分子。这一天,先进分子牵着一头鹿进来,说要参加赛马。咱部里的老学究 Java 就不同意了呀,鹿又不是马,哪能参加赛马。当然了,这种墨守成规的调用方式,自然是先进分子所不齿的。现在年轻人里流行的是鸭子类型(duck typing)[1],只要是跑起来像只马的,它就是一只马,也就能够参加赛马比赛。class Horse { public.原创 2021-02-14 16:13:32 · 556 阅读 · 5 评论 -
Java 虚拟机:JVM是如何实现反射的?
反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。举例来说,我们可以通过 Class 对象枚举该类中的所有方法,我们还可以通过 Method.setAccessible(位于 java.lang.reflect 包,该方法继承自 AccessibleObject)绕过 Java 语言的访问权限,在私有方法所在类之外的地方调用该方法。反射在 Java 中的应用十分广泛。开发人员日常接触到的 Java 集成开发环境(IDE)便运用了这一功能:每当转载 2021-02-07 16:43:30 · 1144 阅读 · 1 评论 -
Java 虚拟机:JVM是如何处理异常的?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。抛出异常可分为显式和隐式两种。显式抛异常的主体是应用程序,它指的是在程序中使用“throw”关键字,手动将异常实例抛出。隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常。举例来说,Java 虚拟机在执行读取数组操作时,发现输入的索引值是负数,故.原创 2021-02-07 16:27:25 · 350 阅读 · 1 评论 -
Java 虚拟机:JVM是如何执行方法调用的?(下)
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享我在读博士的时候,最怕的事情就是被问有没有新的 Idea。有一次我被老板问急了,就随口说了一个。这个 Idea 究竟是什么呢,我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以我就说,是否能够在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文章中强烈谴责一下?当时呢,我老板教的是一门高级程序设计的课,其中有好几节课刚好在讲设计模式的各种好处。所以,我说完.转载 2021-02-07 16:17:44 · 240 阅读 · 1 评论 -
Java 虚拟机-JVM是如何执行方法调用的?(上)
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享前不久在写代码的时候,我不小心踩到一个可变长参数的坑。你或许已经猜到了,它正是可变长参数方法的重载造成的。(注:官方文档建议避免重载可变长参数方法,见 [1] 的最后一段。)我把踩坑的过程放在了文稿里,你可以点击查看。void invoke(Object obj, Object... args) { ... }void invoke(String s, Object obj, Object... args.转载 2021-02-07 16:04:23 · 200 阅读 · 0 评论 -
Java虚拟机是如何加载Java类的?
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享听我的意大利同事说,他们那边有个习俗,就是父亲要帮儿子盖栋房子。这事要放在以前还挺简单,亲朋好友搭把手,盖个小砖房就可以住人了。现在呢,整个过程要耗费好久的时间。首先你要请建筑师出个方案,然后去市政部门报备、验证,通过后才可以开始盖房子。盖好房子还要装修,之后才能住人。盖房子这个事,和 Java 虚拟机中的类加载还是挺像的。从 class 文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三大步骤。其中.转载 2021-02-07 15:40:44 · 231 阅读 · 1 评论 -
Java 虚拟机-Java的基本类型
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享如果你了解面向对象语言的发展史,那你可能听说过 Smalltalk 这门语言。它的影响力之大,以至于之后诞生的面向对象语言,或多或少都借鉴了它的设计和实现。在 Smalltalk 中,所有的值都是对象。因此,许多人认为它是一门纯粹的面向对象语言。Java 则不同,它引进了八个基本类型,来支持数值计算。Java 这么做的原因主要是工程上的考虑,因为使用基本类型能够在执行效率以及内存使用两方面提升软件性能。今.转载 2021-02-07 15:36:53 · 269 阅读 · 1 评论 -
为什么我们要学习Java虚拟机
文章收录地址:Java-Bang专注于系统架构、高可用、高性能、高并发类技术分享前不久我参加了一个国外程序员的讲座,讲座的副标题很有趣,叫做:“我如何学会停止恐惧,并且爱上 Java 虚拟机”。这句话来自一部黑色幽默电影《奇爱博士》,电影描述了冷战时期剑拔弩张的氛围。程序员之间的语言之争又未尝不是如此。写系统语言的鄙视托管语言低下的执行效率;写托管语言的则取笑系统语言需要手动管理内存;写动态语言的不屑于静态语言那冗余的类型系统;写静态语言的则嘲讽动态语言里面各种光怪陆离的运行时错误。.转载 2021-02-07 14:46:37 · 306 阅读 · 0 评论