iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何深入了解JVM内存结构
  • 687
分享到

如何深入了解JVM内存结构

2023-06-17 13:06:54 687人浏览 薄情痞子
摘要

如何深入了解JVM内存结构,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。你对JVM内存结构是否熟悉,这里向大家描述一下,主要包括类装载子系统,方法区,PC寄存器

如何深入了解JVM内存结构,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

你对JVM内存结构是否熟悉,这里向大家描述一下,主要包括类装载子系统,方法区,PC寄存器,堆和栈等内容,其中方法区被所有线程共享,垃圾收集也会清理方法区中的无用类型对象。

JVM内存结构

1)JVM内存结构之类装载子系统

装载连接初始化

(2)JVM内存结构之方法区。

被所有线程共享。垃圾收集也会清理方法区中的无用类型对象。

a.类型信息。 

  类加载器加载类时,从类文件中提取出来。

类的完整有效名

父类的完整有效名(interfaceandjava.lang.Object除外,因为无父类)

类型的修饰符

类型直接接口列表

b.常量池。

存储了一个类型所使用的常量所有类型、域和方法的符号引用。

c.域信息。

jvm必须在方法区中保存类型的所有域的相关信息以及域的声明顺序,

域的相关信息包括:

域名

域类型

域修饰符(publicprivateprotectedstaticfinalvolatiletransient…)

d.方法信息。

方法名

方法返回类型

方法参数

方法的修饰符

方法的字节码(abstractandnative除外)(被PC寄存器指向)

操作数栈和方法栈帧的局部变量区的大小

异常表

e.类的静态变量(所有对象共享一分拷贝)

f.类的被声明为final的类变量(所有对象共享一分拷贝)

g.加载一个类的类加载器的引用

h.Class类的引用

i.方法表。

j.一个例子:

ClassLava{  privateintspeed=5;  voidflow();  }   ClassVolcano{  publicstaticvoidmain(String[]args){  Lavalava=newLava();  lava.flow();  }  }

下面我们描述一下main()方法的***条指令的字节码是如何被执行的。不同的jvm实现的差别很大,这里只是其中之一。

为了运行这个程序,你以某种方式把“Volcano"传给了jvm。有了这个名字,jvm找到了这个类文件(Volcano.class)并读入,它从类文件提取了类型信息并放在了方法区中,通过解析存在方法区中的字节码,jvm激活了main()方法,在执行时,jvm保持了一个指向当前类(Volcano)常量池的指针。

注意jvm在还没有加载Lava类的时候就已经开始执行了。正像大多数的jvm一样,不会等所有类都加载了以后才开始执行,它只会在需要的时候才加载。

main()的***条指令告知jvm为列在常量池***项的类分配足够的内存。

jvm使用指向Volcano常量池的指针找到***项,发现是一个对Lava类的符号引用,然后它就检查方法区看lava是否已经被加载了。

这个符号引用仅仅是类lava的完整有效名”lava“。这里我们看到为了jvm能尽快从一个名称找到一个类,一个良好的数据结构是多么重要。这里jvm的实现者可以采用各种方法,如hash表,查找树等等。同样的算法可以用于Class类的forName()的实现。

当jvm发现还没有加载过一个称为"Lava"的类,它就开始查找并加载类文件"Lava.class"。它从类文件中抽取类型信息并放在了方法区中。

jvm于是以一个直接指向方法区lava类的指针替换了常量池***项的符号引用。以后就可以用这个指针快速的找到lava类了。而这个替换过程称为常量池解析(constantpoolresolution)。在这里我们替换的是一个native指针。

jvm终于开始为新的lava对象分配空间了。这次,jvm仍然需要方法区中的信息。它使用指向lava数据的指针(刚才指向volcano常量池***项的指针)找到一个lava对象究竟需要多少空间。

一旦jvm知道了一个Lava对象所要的空间,它就在堆上分配这个空间并把这个实例的变量speed初始化为缺省值0。假如lava的父对象也有实例变量,则也会初始化。

当把新生成的lava对象的引用压到栈中,***条指令也结束了。下面的指令利用这个引用激活java代码把speed变量设为初始值,5。另外一条指令会用这个引用激活Lava对象的flow()方法。

(3)JVM内存结构之堆。

存放运行时所有对象和数组

(4)JVM内存结构之栈。

每次启动一个新的线程,就会被分配一个栈。

(5)JVM内存结构之PC寄存器(程序计数器)

总是指向该线程下一步要执行的指令。指令的位置放在方法区的方法字节码中。内容是相对于指令的偏移量。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何深入了解JVM内存结构

本文链接: https://www.lsjlt.com/news/289553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何深入了解JVM内存结构
    如何深入了解JVM内存结构,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。你对JVM内存结构是否熟悉,这里向大家描述一下,主要包括类装载子系统,方法区,PC寄存器...
    99+
    2023-06-17
  • 深入理解Java虚拟机 JVM 内存结构
    目录前言JVM是什么JVM内存结构概览运行时数据区程序计数器Java虚拟机栈本地方法栈方法区运行时常量池Java堆直接内存前言 JVM是Java中比较难理解和掌握的一部分,也是面试中...
    99+
    2024-04-02
  • JVM入门之JVM内存结构内容详解
    一、java代码编译执行过程 源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 类加载:通过ClassLoader及其子类来完成...
    99+
    2024-04-02
  • JVM入门之内存结构(堆、方法区)
    目录1、堆1.1 定义1.2 堆的作用1.3 特点1.4 堆内存溢出1.5 堆内存诊断2、方法区2.1 结构(1.6 对比 1.8)2.2 内存溢出2.3 常量池2.4 运行时常量池...
    99+
    2024-04-02
  • 深入理解JVM自动内存管理
    目录一、前言1.1 计算机==>操作系统==>JVM1.1.1 虚拟与实体(对上图的结构层次分析)1.1.2 Java程序执行(对上图的箭头流程分析)二、JVM内存空间与...
    99+
    2024-04-02
  • 怎么组成JVM内存结构
    今天就跟大家聊聊有关怎么组成JVM内存结构,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。你对JVM内存结构是否了解,这里和大家分享一下,JVM内存结构主要包括两个子系统和两个组件,这...
    99+
    2023-06-17
  • 解读Jvm的内存结构与GC及jvm参数调优
    目录一、JVM 内存结构1、类加载子系统2、方法区(method)3、堆(heap)4、栈(stack)5、本地方法栈6、pc寄存器(了解即可)7、执行引擎8、垃圾收集器二、堆&nd...
    99+
    2023-05-19
    Jvm内存结构 jvm参数调优 Jvm的内存结构与GC
  • 如何浅析JVM内存结构和6大区域
    如何浅析JVM内存结构和6大区域,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。其实对于我们一般理解的计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据...
    99+
    2023-06-17
  • JVM内存的结构是怎样的
    这篇文章主要介绍“JVM内存的结构是怎样的”,在日常操作中,相信很多人在JVM内存的结构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存的结构是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • 深入了解Go语言结构体
    Go语言作为一种快速、简洁、并发的编程语言,结构体(struct)是其重要的数据结构之一。结构体允许我们将不同类型的数据组合在一起,形成一个更为复杂的自定义数据类型。本文将深入探讨Go...
    99+
    2024-03-10
    go语言 结构体 深入
  • JVM中内存结构是怎么样的
    这篇文章主要介绍了JVM中内存结构是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。图为Java虚拟机运行时的数据区: 1.方法区 也称"永久代” 、“非堆...
    99+
    2023-06-02
  • 深入了解Rust 结构体的使用
    目录楔子定义并实例化结构体简化版的实例化方式基于已有结构体实例创建元组结构体没有字段的空结构体结构体数据的所有权使用结构体的示例程序楔子 结构体是一种自定义的数据类型,它允许我们将多...
    99+
    2022-11-13
    Rust 结构体使用 Rust 结构体
  • JVM内存结构的三大块是什么
    这篇文章主要介绍“JVM内存结构的三大块是什么”,在日常操作中,相信很多人在JVM内存结构的三大块是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存结构的三大块是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-02
  • 深入了解volatile和Java内存模型
    目录前言为什么我们需要volatile?保证数据的可见性禁止指令重排序Java内存模型(JMM)JMM下的内存逻辑结构内存交互的操作重排序Volatile实现原理禁止重排序实现原理可...
    99+
    2022-11-13
    Java内存模型 Java volatile Java 内存模型 volatile
  • 深入了解Java中循环结构的使用
    目录1.Java 循环结构概述2. while 循环2.1 while 循环结构简介2.2 while 循环语法格式2.3 while 循环代码实例3. do…whil...
    99+
    2022-11-13
    Java 循环结构 Java 循环
  • jvm内存不足如何解决
    当JVM内存不足时,可以考虑以下解决方案:1. 增加JVM的堆内存大小:通过调整JVM的启动参数,增加堆内存的大小。可以通过修改-X...
    99+
    2023-08-11
    jvm
  • 深入理解go slice结构
    文章 slice介绍 append的机制 slice tricks go data slice array的语法: [4]int{1,2,3,4}, [...]int{1,2,...
    99+
    2024-04-02
  • 一文带你深入了解Java的数据结构
    目录枚举接口(Enumeration)位集合(BitSet)向量(Vector)栈(Stack)字典(Dictionary)哈希表(Hashtable)属性(Properties)J...
    99+
    2023-05-18
    Java数据结构 接口 Java数据结构 类 Java数据结构
  • Java深入了解数据结构之哈希表篇
    目录1,概念2,冲突-避免3,冲突-避免-哈希函数设计4,冲突-避免-负载因子调节5,冲突-解决-闭散列①线性探测②二次探测6,冲突-解决-开散列/哈希桶7,完整代码1,概念 顺序结...
    99+
    2024-04-02
  • 深入了解Java数据结构和算法之堆
    目录1、堆的定义2、遍历和查找3、移除4、插入5、完整的Java堆代码总结1、堆的定义 ①、它是完全二叉树,除了树的最后一层节点不需要是满的,其它的每一层从左到右都是满的。注意下面两...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作