Java 进阶之字节码剖析

前言

从今天起我打算整一个 Java 系列的进阶基础文章,万丈高楼平地起,打好基础我们才能走得更好,举个例子,之前我在武哥的 Kafka 文章中看到这样的一句话「除此之外,页缓存(pageCache)还有一个巨大的优势。用过 Java 的人都知道:如果不用页缓存,而是用 JVM 进程中的缓存,对象的内存开销非常大(通常是真实数据大小的几倍甚至更多)」,如果你不了解 Java 对象的表示,看到这样的话会一脸懵逼:对象的开销到底有多巨大,反过来看,如果你掌握了 Java 中的对象布局,GC,NIO 等原理,理解这些框架的原理及其设计思路就不是什么难事

另一个让我下决心写这个系列的原因是经常有一些读者问一些学习路线的事,之前我写过一些大纲,但没有从点的层面展开,所以这次准备从点的思路来将各个知识点细细道来,然后再整理成 pdf,这样之后如果有人再问起,直接把这个 pdf 扔给他们就完事了 ^_^

每个系列都会以图文并茂的方式来讲解,做到深入浅出,举个例子,上面我们说了对象的开销很大,到底有多大呢,我会用图解的方式来带你一步步分析,看完后相信你会明白为什么 int[128][2] ,int[256] 这两个数组看起来一样,但实际上前者比后者多了 246% 的额外开销,再比如我们都知道 Eden 区或 tenured(老年代区)满了会触发 yong gc 或 old gc,不过导致 gc 停顿时间过长的原因其实有挺多的,如果你看完我总结的这些通用的思路,相信你就能根据这套理论来快速地排查问题了,这个系列干货很多,相信对提升大家的 Java 内功有不少帮助,记得得文末点赞支持一下哦 ^_^

Java 系列大纲如下:

本篇我们先来学习下字节码 ,毕竟这是 Java 能跨平台的根本原因,而且通过了解字节码也可以彻底揭开 JVM 运行程序的秘密,整体会用问答的形式来讲解

能否简单介绍一下 Java 的特性

Java 是一门 面向对象 , 静态类型的 语言,具有跨平台的特点,与 C,C++ 这些需要手动管理内存,编译型的语言不同,它是解释型的,具有跨平台和自动垃圾回收的特点,那么它的跨平台到底是怎么实现的呢?

我们知道计算机只能识别二进制代码表示的机器语言,所以不管用的什么高级语言,最终都得翻译成机器语言才能被 CPU 识别并执行,对于 C++这些编译型语言来说是直接一步到位转为相应平台的可执行文件(即机器语言指令),而对 Java 来说,则首先由编译器将源文件编译成字节码,再在运行时由虚拟机(JVM)解释成机器指令来执行,我们可以看下下图

也就是说 Java 的跨平台其实是通过先生成字节码,再由针对各个平台实现的 JVM 来解释执行实现的,JVM 屏蔽了 OS 的差异,我们知道 Java 工程都是以 Jar 包分发(一堆 class 文件的集合体)部署的,这就意味着 jar 包可以在各个平台上运行(由相应平台的 JVM 解释执行即可),这就是 Java 能实现跨平台的原因所在

这也是为什么 JVM 能运行 Scala、Groovy、Kotlin 这些语言的原因,并不是 JVM 直接来执行这些语言,而是这些语言最终都会生成符合 JVM 规范的字节码再由 JVM 执行,不知你是否注意到,使用字节码也利用了计算机科学中的分层理念,通过加入字节码这样的中间层,有效屏蔽了与上层的交互差异。

JVM 是怎么执行字节码的

在此之前我们先来看下 JVM 的整体内存结构,对其有一个宏观的认识,然后再来看 JVM 是如何执行字节码的

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值