【从 1 开始学 JVM 系列】

JVM 对于每位 Java 语言编程者来说无疑是“重中之重”,尽管我们每天都在与它打交道,却很少来审视它、了解它,慢慢地,它成为了我们“熟悉的陌生人”

因此,我计划写一个「从 1 开始学 JVM 系列」 ,主要面向有一定 Java 基础的同学。同时,梳理总结一下自己过去积累的 JVM 体系知识和技能。

从 JVM 基础知识聊起

常见的编程语言是如何分类的?

众多周知,Java 是一门面向对象的编程语言。

对于编程语言,使用不同的标准有不同的分类,我们不妨一起来看看常见的分类。

第一种常见的分类为面向过程、面向对象、面向函数的编程语言。

  • 面向过程,如 C
  • 面向对象,如 Java、C++
  • 面向函数,如 Scala

第二种可以将编程语言分为静态类型、动态类型

  • 静态类型,如 Java
  • 动态类型,如 python、javascript

第三种可以将编程语言分为有虚拟机、无虚拟机

  • 有虚拟机,如 Java
  • 无虚拟机,如 C、C++

第四种可以将编程语言分为有 GC、无 GC

  • 有 GC,如 Java、Go

  • 无 GC,如 C、C++

    对于没有 GC 的编程语言人工管理容易出现内存泄漏和野指针,例如 C++,这就要求编程者要足够细心。

通过对前面分类的小结,我们知道,Java 是一种面向对象、静态类型、有虚拟机、有 GC 的高级语言。

此外,Java 同时支持编译执行和解释执行、有运行时、能够跨平台(Write once, run anywhere,即“一次编写,到处执行”)。

  • 即时编译执行,将一个方法中包含的所有字节码编译成机器码后再执行
  • 解释执行,即逐条将字节码翻译成机器码并执行。

Java 代码解释执行,到达一定的次数后,如果被判定为是热点代码,则会被编译成机器码执行(一般执行效率会更高)。

编程语言如何跨平台?

一般而言,有两种跨平台的方式。

第一种方式是「源代码跨平台」

这种方式通过在不同的平台上(例如分别在 Linux、Window)编译源码,生成不同的二进制文件,从而获得跨平台运行的能力。

但缺点也很明显,特定平台上编译出来的二进制无法跨平台运行

如 Linux 编译出来的二进制文件无法在 Windows 上运行。

源代码跨平台

第二种方式是「二进制跨平台」

例如 Java 语言,通过讲源代码编译成字节码,从而就能够实现跨平台运行。

二进制跨平台

为什么二进制能够跨平台?

一个非常重要的原因是虚拟机的诞生,使得在不同的平台上都能执行相同的字节码文件。

Java、C++、Rust 有哪些区别?

我们以几种常见的编程语言为例,对比一下不同类型的编程语言,看看它们之间的区别。

语言 对程序员态度 优势 劣势
C/C++ 完全相信、惯着程序员 自行管理内存,代码编写很自由 不小心会造成内存泄漏等问题,导致程序崩溃
Java/Golang 完全不相信、但惯着程序员 内存生命周期都由 JVM 运行时统一管理。绝大部分场景,非常自由的写代码,不用关心内存情况;内存使用有问题时,可以通过 JVM 信息进行分析诊断和调整 存在 STW,无法灵活管理内存
Rust 既不相信程序员,也不惯着程序员 写代码时,必须清楚用 Rust 的规则管理好变量,好让机器能明白高效地分析和管理内存 代码不利于人的理解,写代码很不自由,学习成本也很高

字节码、类加载器、虚拟机之间是什么关系?

我们通过对照一张图来说明它们之间的关系。

Java 源代码被编译成「字节码文件」(即 xxx.class 文件),然后通过「类加载器(ClassLoader)」将字节码文件加载到 JVM 内存中,然后再实例化为对象,最终被程序使用。

你的 JVM 基础“大厦”稳健吗?的更多相关文章

  1. JVM 基础知识

    JVM 基础知识(GC) 2013-12-10 00:16 3190人阅读 评论(1) 收藏 举报 分类: Java(49) 目录(?)[+] 几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看 ...

  2. java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型

    1.java中5个存放数据的地方: (1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限.在java中不能直接操作寄存器. (2).栈(Stack):栈位于通用 ...

  3. JVM基础:深入学习JVM堆与JVM栈

    转自:http://developer.51cto.com/art/201009/227812.htm JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题, ...

  4. JVM基础知识(1)-JVM内存区域与内存溢出

    JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...

  5. Jvm基础(2)-Java内存模型

    Jvm基础(2)-Java内存模型 主内存和工作内存 Java内存模型包括主内存和工作内存两个部分:主内存用来存储线程之间的共享变量:而工作内存中存储每个线程的相关变量. 如下图所示: 需要注意的是: ...

  6. 剑指Offer——知识点储备-JVM基础

    剑指Offer--知识点储备-JVM基础 1.java内存与内存溢出 1.1 JVM分为哪些区,每一个区干嘛的?(见java虚拟机38页) (1)程序计数器(线程私有) 当前线程执行字节码的信号指示器 ...

  7. JVM基础系列第15讲:JDK性能监控命令

    查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps 6540 ...

  8. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  9. JVM基础系列第13讲:JVM参数之追踪类信息

    我们都知道 JVM 在启动的时候会去加载类信息,那么我们怎么得知他加载了哪些类,又卸载了哪些类呢?我们这一节就来介绍四个 JVM 参数,使用它们我们就可以清晰地知道 JVM 的类加载信息. 为了方便演 ...

随机推荐

  1. 工业互联网之微信小程序整体解决方案总结

    随着工业互联网的快速发展,以及微信小程序的成熟,将两者结合实现对工况数据的查看和存储方案变得简单.以下方式为本人尝试过的整体解决方案,可以顺利实现无缝对接. 1.采集方式 1.ifix/intouch ...

  2. Magento 2.2 SQL注入漏洞

    影响版本 2.2.* poc地址  https://github.com/ambionics/magento-exploits python3 magento-sqli.py http://192.1 ...

  3. 点云上的深度学习及其在三维场景理解中的应用(PPT内容整理PointNet)

      这篇博客主要是整理了PointNet提出者祁芮中台介绍PointNet.PointNet++.Frustum PointNets的PPT内容,内容包括如何将点云进行深度学习,如何设计新型的网络架构 ...

  4. 用AutoHotkey的热字串功能启动常用电脑程序软件 Version 2 Build 20191214

    ; 用AutoHotkey的热字串功能启动常用电脑程序软件 Version 2 Build 20191214 ; 电脑上的快捷键太多了,记都记不住,容易冲突和搞混,所以做了个热字串启动; 用法:运行此 ...

  5. Jmeter分布式压测实战及踩坑处理(含参数化)

    项目中使用Jmeter进行大并发压测时,单机受限内存.CPU.网络IO,会出现服务器压力还没有上 去,但压测服务器由于模拟的压力太大死机的情况.JMeter的集群模式可以让我们将多台机器联合起来 一起 ...

  6. icmp介绍以及arp攻击

    目录 一.ip数据包格式 二.ICMP协议介绍 三.ARP协议介绍 四.ARP攻击原理 一.ip数据包格式 网络层的功能: 定义了基于ip协议的逻辑地址 连接不同的媒介类型 选择是数据通过网络的最佳途 ...

  7. 模拟input type=file

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 身边好几个技术一般的程序员都面上了,阿里P7门槛降低?

    经常在网上的论坛里看到讨论程序员的级别,尤其在跳槽类的信息里可以看到对标阿里P7,百度T6,腾讯3.1等字眼,似乎大厂的级别俨然可以成为业内的通用货币,类似于高考分数一样,哪一档就对应着什么样的待遇. ...

  9. Java时间类从此变得清晰明了

    Java时间类 Java时间类分为Date 日期类和Calendar 日历类,相信很多小伙伴在初学时会对这个两个类的用法.区别以及有什么联系会感到疑惑,似乎懂了,但又不能具体说清,今天再带你来清晰的再 ...

  10. WPF自定义控件三:消息提示框

    需求:实现全局消息提示框 一:创建全局Message public class Message { private static readonly Style infoStyle = (Style)A ...