jvm虚拟机内存结构

Java虚拟机(JVM)架构和Java字节码101的初学者速成班

Java应用程序无处不在,它们在我们的手机,平板电脑和计算机上。 在许多编程语言中,这意味着多次编译代码以使其在不同的OS上运行。 对于我们作为开发人员来说,关于Java的最酷的事情可能是Java的设计与平台无关(俗话说“写一次,在任何地方运行”),因此我们只需要编写和编译一次代码。

这怎么可能? 让我们深入研究Java虚拟机(JVM)进行查找。

JVM架构

这听起来可能令人惊讶,但是JVM本身对Java编程语言一无所知。 相反,它知道如何执行自己的称为Java字节码的指令集,该指令集以二进制类文件进行组织。 Java代码由javac命令编译为Java字节码,然后由JVM在运行时将其翻译成机器指令。

线程数

Java被设计为并发的,这意味着可以通过在同一进程中运行多个线程来同时执行不同的计算。 当新的JVM进程启动时,将在JVM中创建一个新线程(称为main thread )。 从该主线程开始,代码开始运行,并且可以生成其他线程。 实际的应用程序可以具有成千上万个运行线程,这些线程可以满足不同的目的。 有些服务于用户请求,另一些则执行异步后端任务,等等。

堆栈和框架

每个Java线程都会与框架堆栈一起创建,该框架堆栈用于保存方法框架并控制方法的调用和返回。 方法框架用于存储数据及其所属方法的部分计算。 方法返回时,其框架将被丢弃。 然后,将其返回值传递回调用程序框架,现在可以使用它来完成自己的计算。

JVM流程结构

用于执行方法的JVM游乐场是方法框架。 框架包括两个主要部分:

  1. 局部变量数组 –存储方法的参数和局部变量的位置
  2. 操作数堆栈 –执行方法的计算的位置

框架结构

几乎每个字节码命令都会操纵这两个命令中的至少一个。 让我们看看如何。

这个怎么运作

让我们来看一个简单的示例,以了解不同元素如何一起运行以运行我们的程序。 假设我们有一个简单的程序来计算2 + 3的值并打印结果:

class SimpleExample {public static void main(String[] args) {int result = add(2,3);System.out.println(result);}public static int add(int a, int b) {return a+b;}
}

要编译此类,我们运行javac SimpleExample.java ,生成编译文件SimpleExample.class 。 我们已经知道这是一个包含字节码的二进制文件。 那么我们如何检查类字节码呢? 使用javap

javap是JDK附带的命令行工具,可以反汇编类文件。 调用javap -c -p会打印出该类的反汇编字节码(-c),包括私有(-p)成员和方法:

Compiled from "SimpleExample.java"
class SimpleExample {SimpleExample();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_21: iconst_32: invokestatic  #2                  // Method add:(II)I5: istore_16: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;9: iload_110: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V13: returnpublic static int add(int, int);Code:0: iload_01: iload_12: iadd3: ireturn
}

现在,JVM在运行时会发生什么? java SimpleExample启动一个新的JVM进程,并创建了主线程。 为main方法创建一个新框架,并将其推入线程堆栈。

public static void main(java.lang.String[]);Code:0: iconst_21: iconst_32: invokestatic  #2                  // Method add:(II)I5: istore_16: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;9: iload_110: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V13: return

主要方法有两个变量: argsresult 。 两者都驻留在局部变量表中。 main的前两个字节码命令iconst_2iconst_3将常量值2和3分别加载到操作数堆栈中。 下一个命令invokestatic调用静态方法add。 由于此方法需要两个整数作为参数,因此invokestatic从操作数堆栈中弹出两个元素,并将它们传递给JVM为add添加的新帧。 此时主操作数堆栈为空。

public static int add(int, int);Code:0: iload_01: iload_12: iadd3: ireturn

添加框架中,这些参数存储在局部变量数组中。 前两个字节码命令iload_0iload_1将第0个和第1个局部变量加载到堆栈中。 接下来, iadd从操作数堆栈中弹出前两个元素,对其求和,然后将结果推回堆栈中。 最后, ireturn弹出顶部元素,并将其作为方法的返回值传递给调用框架,并丢弃该框架。

public static void main(java.lang.String[]);Code:0: iconst_21: iconst_32: invokestatic  #2                  // Method add:(II)I5: istore_16: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;9: iload_110: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V13: return

main的堆栈现在保存add的返回值。 istore_1将其弹出并将其设置为索引1处的变量的值,即resultgetstatic将类型为java / io / PrintStream的静态字段java / lang / System.out压入堆栈。 iload_1将索引1处的变量(现在等于5的结果值)压入堆栈。 因此,此时堆栈拥有2个值:“ out”字段和值5。现在invokevirtual将要调用PrintStream.println方法。 它从堆栈中弹出两个元素:第一个元素是对将要调用println方法的对象的引用。 第二个元素是要传递给println方法的整数参数,该参数需要一个参数。 这是main方法打印add结果的地方。 最后, 返回命令完成该方法。 主机被丢弃,JVM进程结束。

就是这个。 总而言之,不太复杂。

“一次编写,随处运行”

那么,什么使Java平台独立呢? 全部都在字节码中。

如我们所见,任何Java程序都可以编译为标准Java字节码。 然后,JVM在运行时将其转换为特定的机器指令。 我们不再需要确保我们的代码与机器兼容。 相反,我们的应用程序可以在装有JVM的任何设备上运行,并且JVM将为我们完成此操作。 JVM维护人员的工作是提供不同版本的JVM,以支持不同的机器和操作系统。

这种体系结构使任何Java程序都可以在安装了JVM的任何设备上运行。 这样魔术就发生了。

最后的想法

Java开发人员可以在不了解JVM如何工作的情况下编写出色的应用程序。 但是,深入研究JVM体系结构,学习其结构并了解其如何解释代码将有助于您成为更好的开发人员。 它还将帮助您不时解决非常复杂的问题

PS。 如果您想更深入地了解JVM以及所有这些与Java异常的关系,那就别无所求! ( 这里可以。 )

翻译自: https://www.javacodegeeks.com/2018/05/jvm-architecture-101-get-to-know-your-virtual-machine.html

jvm虚拟机内存结构

jvm虚拟机内存结构_JVM体系结构101:了解您的虚拟机相关推荐

  1. jvm内存结构_JVM系列之内存结构

    JVM的内存结构大概分为: 堆(Heap):线程共享.所有的对象实例以及数组都要在堆上分配.回收器主要管理的对象. 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden ...

  2. JVM(一)JVM虚拟机内存结构 和 JAVA内存模型(JMM)

    本文转自:浅析java内存模型--JMM(Java Memory Model) - 路易小七 - 博客园,尊重作者,转载请注明出处~ JVM虚拟机内存结构 和 JAVA内存模型 是两个不同的概念 JV ...

  3. Carson带你学JVM:图文解析Java虚拟机内存结构

    前言 了解Java中的对象.变量等存放的内存区域十分重要 本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢 Carson带你学JVM系列文章,具体如下: Carson带你学J ...

  4. 玩点深入的:Java 虚拟机内存结构及编码实战

    本文来源:不会coding 了解JVM内存结构的目的 在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C.C++开发那样手动释放对象的内存空间,不容易出现内存泄漏和内存溢出的问题. ...

  5. JVM之内存结构图文详解

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bu ...

  6. JVM之内存结构详解

    对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.今天开始,<JVM详解>系列开启,带大家深入了解JVM相 ...

  7. 一文解析JVM的内存结构,身为程序员还不弄懂JVM怎么行

    欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦.微信公众号:慕容千语的架构笔记.欢迎关注一起进步. 前言 Jvm的内存结构是由<jav ...

  8. java 堆内存结构_JVM内存结构、Java内存模型和Java对象模型

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存 ...

  9. JVM的内存结构,Eden和Survivor比例;JVM中一次完整的GC流程,对象如何晋升到老年代,说说你知道的几种主要的JVM参数;CMS 常见参数解析;.你知道哪几种垃圾收集器,各自的优缺点

    47.JVM的内存结构,Eden和Survivor比例 49.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数 50.-XX:+CMSScavengeBefo ...

最新文章

  1. MarkDown编辑器基础使用教程
  2. Snapshot Volume 操作 - 每天5分钟玩转 OpenStack(58)
  3. python函数代码的复用_Python__函数和代码复用
  4. Python之Requests
  5. 监测linux一些重要文件md5值脚本
  6. 支付宝要给全国人民发100亿,7月1日起!
  7. CSS实现兼容性的渐变背景(gradient)效果(转)
  8. Android自定义操作栏示例教程
  9. Illustrator 教程,如何在 Illustrator 中重新着色图稿?
  10. Java调用MQ队列
  11. 一、万用表使用方法图解
  12. SE3可能是苹果最失败的手机,销量不达预期致上市半月降价促销
  13. 计算机出现故障后,电脑内存出现故障怎么办 电脑内存常见故障解决方法【详解】...
  14. 400企业智能服务器,全球领先的企业级服务器、存储、融合系统及解决方案-H3C与HPE...
  15. TiPLM---产品全生命周期管理系统
  16. 金融科技上市公司业绩爆发,三大业务趋势显现
  17. 德乐生 java_【Senior Java Developer怎么样】德乐生软件2021年Senior Java Developer前景怎么样-看准网...
  18. JAVA仓库管理系统(附源码+调试)
  19. Rocket之nameServer
  20. Wireshark抓包分析TCP的三次握手

热门文章

  1. CF662C Binary Table(FWT_XOR卷积)
  2. CF407 E. k-d-sequence
  3. 2018/7/10-纪中某C组题【jzoj3792,jzoj3793,jzoj3794】
  4. ssl2331OJ1373-鱼塘钓鱼 之1【纯贪心】
  5. NWERC 2018——B.Brexit Negotiations
  6. 【启发式合并】【dfs】树数树(nowcoder 20107-C)
  7. Sentinel(十六)之AHAS Sentinel 控制台
  8. vue-beauty UI库
  9. Jsoup代码解读之五-parser(中)
  10. Oracle入门(八)之权限