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

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虚拟机内存结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA for Mac在MacOS模式下的搜索/查询/查找快捷键(Search Shortcut)

文章目录根据内容查找文件根据名称查找类文件(源代码文件)根据名称查找任何类型文件查找字段名称、方法名、类名声明的地方查找所有的内容查找任何动作快捷键快捷键符号英文名称功能说明Double ShiftDouble ⇧Search everywhere查询任何东西。建议改成 S…

json解析适配模板_认识适配器:JSON绑定概述系列

json解析适配模板适配器通过实现JsonbAdapter接口来配置自定义对象的创建和序列化。 方法AdaptToJson()和AdaptFromJson()被执行序列化和反序列化操作的逻辑覆盖。 下一篇文章介绍了使用自定义序列化器和反序列化器自定义JSON-B的…

IntelliJ IDEA for Mac在MacOS模式下的替换快捷键(Replace Shortcut)

快捷键快捷键符号英文名称功能说明Command R⌘RReplace选择要被替换的内容,按下此组合键,然后会出现替换内容输入框,输入替换内容,按下回车一次,替换一个,继续按回车再替换一个Shift Command R⇧⌘RRepla…

震惊kafka_5个令人震惊的统计数据证明日志不足

震惊kafka事实证明,我们都犯有记录不良的罪名。 不相信我们吗? 这些统计数据可能会改变您的想法 当人们提出带有明显答案的问题时,这非常令人不快,因此,我不会坐在这里问您和您的团队是否使用日志文件来监视预生产和生…

IntelliJ IDEA for Mac在MacOS模式下的动态代码模板快捷键(Live Templates Shortcut)

快捷键快捷键符号英文名称功能说明Option Command J⌥ ⌘ JSelect Template弹出模板选择窗口,将选定的代码使用动态模板包住Option Command T⌥ ⌘ TSurround with Live Template弹出模板选择窗口,将选定的代码使用动态模板包住,和上面那个…

jdk 8 时区 转换_JDK 8 BigInteger精确缩小转换方法

jdk 8 时区 转换在博客文章“ Java中Long到Int的精确转换 ”中,我讨论了使用Math.toIntExact(Long)将Long精确地转换为int或者如果无法缩小转换范围则抛出ArithmeticException 。 JDK 8引入了该方法, JDK 8还向BigInteger类引入了…

IntelliJ IDEA快捷键(Shortcut)官方文档地址

快捷键官方文档地址:https://resources.jetbrains.com/storage/products/intellij-idea/docs/IntelliJIDEA_ReferenceCard.pdf

通过OAuth 2.0和Okta使用安全的服务器到服务器通信构建Spring Boot应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 大多数OAuth 2.0指南都围绕用户的上下文,即使用Google,Github…

IntelliJ IDEA for Mac在MacOS模式下添加到收藏夹的快捷键(Add Favorite Shortcut)

快捷键快捷键符号英文名称功能说明Option Shift F⌥⇧FAdd Favorite添加到收藏夹 添加到收藏夹后,你可以按下组合键 Command 2 打开收藏夹窗格,或者直接在视图的左边栏找到『收藏夹』如下图所示:

公有云 私有云 混合云_混合云的承诺,收益和产品

公有云 私有云 混合云云承诺为我们提供所有灵活性。 有机会在需要时访问无限资源并相应地付款。 我们不再需要花费时间安装,配置和维护服务器; 我们被承诺将有更多的时间来“仅仅编码”。 取而代之的是,我们越来越多地锁定供应商&#xff0c…

MVC基础知识

1.MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写 2.Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。  通常模型对象负责在数据库中存取数据。主体 3.View&#xf…

MacBook键盘符号

图标介绍⌘Command⇧Shift⇪Caps Lock⌥Option Alt⌃Control↩Enter⌫Delete⌦Fn Delete↑上箭头↓下箭头←左箭头→右箭头⇞Fn ↑ Page Up⇟Fn ↓ Page DownHomeFn ←EndFn →⇥Tab 右制表符⇤Shift Tab 左制表符⎋Esc Escape⏏电源开关键

spring vaadin_在Spring Boot中使用Vaadin的简介

spring vaadin介绍 Vaadin的工作方式依赖于服务器端渲染,因此可以自然地集成到诸如Spring之类的框架中。 Vaadin的Spring集成已经存在了一段时间,并提供了用于在Spring容器中配置和管理Vaadin的工具,如果您希望将Vaadin与Spring Boot结合使用…

vue中生产模式和调试模式_为什么在生产中进行调试是如此诱人?

vue中生产模式和调试模式生产调试 为什么在生产中进行调试是如此诱人? 在我的第一份工作中,我要做的任务之一是修复一个错误,该错误过去在非常复杂的生产系统中有时会发生。 那很简单! - 我想。 我将在开发环境中重现同样的情况&a…

IntelliJ IDEA for Mac在MacOS模式下的编译和运行快捷键(Compile and Run Shortcut)

快捷键快捷键符号英文名称功能说明Command F9⌘F9Make project编译ProjectCommand Shift F9⌘⇧F9Compile selected file, package or module编译选择的文件、包或模块Control Option R⌃⌥RSelect configuration and run弹出 Run 的可选择菜单Control Option D⌃⌥DSel…

android基础知识

第07节 ListView 1.当我们的程序中有大量的数据需要展示的时候,就可以借助 ListView 来实现。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。 ListView 的简单用法 1.listView数据的添…

apache derby_Apache Derby数据库用户和权限

apache derby抽象 Apache Derby很棒! 尤其是在微服务环境中,服务的数据(可能)会缩减,并且不需要强大的RDBMS。 Derby很棒,因为它非常易于使用,特别是在涉及用户和权限时,您不需要任何…

IntelliJ IDEA for Mac在MacOS模式下的版本控制/本地历史记录快捷键(VCS and Local History Shortcut)

快捷键快捷键符号英文名称功能说明Command K⌘KCommit project to VCS提交代码到版本控制器Command T⌘TUpdate project from VCS从版本控制器更新代码CommandShiftK⌘⇧KPush commits推送提交,有问题OptionCommandK⌥⌘KPush commits推送提交Control V⌃V‘VCS’…

nutshell_Nutshell中的Java 8语言功能-第1部分

nutshell你好朋友, Java 8发布已经很长时间了,现在越来越多地被使用。 在本文中,我们将讨论以下Java 8主题。 1.功能接口 2.Lambda表达式 3.默认方法 1.功能界面 什么是功能接口? 与一种并且只有一种抽象方法的接口是功能接口…

windows server 2008 R2 命令行的方式创建用户、设置密码

一、使用命令行的方式创建用户、设置密码 (1)标准格式: net user username password / add 例如:建立一个名为lijunxuan、密码为Abc_123的用户 net user lijunxuan Abc_123 /add 二、使用命令行修改旧帐户的密码 &#xff…