iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java运行时数据区域和类结构的详细讲解
  • 914
分享到

java运行时数据区域和类结构的详细讲解

2023-06-20 18:06:15 914人浏览 薄情痞子
摘要

这篇文章主要介绍“java运行时数据区域和类结构的详细讲解”,在日常操作中,相信很多人在java运行时数据区域和类结构的详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java运行时数据区域和类结构的详

这篇文章主要介绍“java运行时数据区域和类结构的详细讲解”,在日常操作中,相信很多人在java运行时数据区域和类结构的详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java运行时数据区域和类结构的详细讲解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Java运行时数据区域

java运行时数据区可以分为:方法区、虚拟机栈、本地方法栈、堆和程序计数器

线程私有:虚拟机栈、本地方法栈、程序计数器

线程共享:方法区、堆

程序计数器

一块较小的内存空间,当前线程所执行字节码的行号指示器,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

每条线程都拥有一个独立的程序计数器。

Java虚拟机栈

线程私有的,它的生命周期与线程相同。

每个方法被执行时,java虚拟机都会创建一个栈帧,用于存储 局部变量表、操作数栈、动态链接、方法出口等信息

动态链接:符号在运行中转化为直接引用的过程,就是动态连接(预支对应的静态连接,是指类加载阶段将静态的符号引用转成)。

本地方法栈

作用于java虚拟机栈类似,不过作用的是本地的native 方法。

java堆

线程共享的一块内存区域,用来存放对象实例。“几乎”所有的对象都分配在堆中。

由于及时编译,特别是逃逸分析技术日益请打,对象也不一定分配在堆中(可能栈上分配标量替换)。

java堆中可以划分出多个线程私有的分配缓冲区(TLAB)来提高对象分配效率,这个TLAB只保证该线程才能在此分配,但是所有线程都是可以进行访问的。

方法区

线程共享,存放虚拟机加载的类型信息常量静态变量即时编辑器编译后的代码缓存等数据。

方法区的运行时常量池:存放 类加载器中加载Class文件中的常量池表。

java对象内存分配

字节码new 指令 -> 检查常量池 ->类加载器(加载、连接(检查、准备、解析)、初始化)

检查后,就要为新生对象进行内存分配了。分配策略:

java运行时数据区域和类结构的详细讲解

逃逸分析

分析对象的作用域是否在本方法中,如果只有在本方法中,那么他可以栈上分配,逃逸分析jdk7以后是默认开启的。

new 的对象不一定在堆中,他可能在栈上分配和标量替换

栈上分配JVM调优方式之一,方法的对象如果不逃逸在外,那么它可以分配在栈上,他的生命周期与方法调用一致,减小GC的压力。

标量替换:如果对象不存在逃逸,JVM可能不会创建该对象,而是将该对象变量分解成若干个成员变量所替换,这样就可以在栈帧或寄存器上分配(不用连续的空间),jdk7默认开启。标量替换优先于栈上分配。

TLAB:线程本地分配缓存区(也是堆中)

Eden中分配内存时,如果多个线程都同时分配内存,会造成指针碰撞情况,为了提高对象分配效率,使用TLAB。

线程初始化时,会申请一点指定大小的内存,只提供当前线程进行内存分配,这样每个线程都单独拥有一个空间。

TLAB是虚拟机在堆内存的eden划分出来的一块专用空间。

TLAB没有没有足够空间来满足操作时,需要向当前线程重新申请新的TLAB

java运行时数据区域和类结构的详细讲解

java类文件结构

class 字节码的文件结构,严格按照顺序记性解析

类型名称备注
u4magic魔数,识别Class文件格式,值为:0XCAFEBABE
u2minor_version副版本号
u2major_version主版本号,45-?,JDK13为57,JDK8为52
u2constant_pool_count常量池计算器
cp_infoconstant_pool常量池,class资源库
u2access_flags访问标志,public、final等9个标志。有16个标志位,每一位标识一种访问标志。
u2this_flags索引,常量池中的索引值
u2super_class父类索引,常量池中的索引值
u2interfaces_count接口计数器
u2interfaces接口索引集合,常量池中的索引值
u2fields_count字段个数
field_infofields字段集合, 字段标志(public、static等)、字段名常量索引、描述常量索引(类型)
u2methods_count方法计数器
method_infomethods方法集合,和字段集合差不多,方法标志、方法名索引、方法描述索引(返回类型、方法参数列表)
u2attributes_count附加属性计数器
attribute_infoattributes附加属性集合

常量池

常量池分为:字面量符号引用

字面量:文本字符串、final常量值等

符号引用:

  • 类、接口全限定名

  • 字段、方法的名称和描述符

  • 方法句柄和类型

  • 动态调用点和动态常量

常量池项目类型:

java运行时数据区域和类结构的详细讲解

属性表

Class 文件、字段表、方法表都可以携带自己的属性表集合,描述某些场景专有的信息

java运行时数据区域和类结构的详细讲解

属性(部分)有:

java运行时数据区域和类结构的详细讲解

比如Code属性,

java运行时数据区域和类结构的详细讲解

类加载机制

类加载过程:

加载 -> 链接 (验证、准备、解析) -> 初始化

加载:用类加载器加载字节码

验证:验证字节码的合法性(满足约束条件)

准备:被加载类的静态字段分配内存

解析:符号引用解析成实际引用。

初始化:初始化常量、静态类

类加载器:

启动类加载器:加载最基础的最重要的类,如JRE的lib下的jar包中的类

扩展类加载器:他的弗雷是启动类加载器,主要加载相对次要但又通用的类,如JRE的lib/ext下的jar的类

应用类加载器:他的父类是扩展类加载器,负责加载应用程序路径下的类。(指虚拟机参数 -cp/-classpath、系统变量 java.class.path或环境变量 CLASSPATH 所指定的路径)

同一字节流经过不同类加载器加载,也会得到两个不同的类。

双亲委派模式:让父加载器尽量加载

双亲委派模式的破坏:

1)如果上层类加载器加载的类 加载 下层的类加载器加载的类

java引入了上下文类加载器,可以打通弗雷加载器去请求子类加载器加载的行为。如JNDI调用服务代码的时候。

2)OSGI热部署,使用网状的类加载模式。

到此,关于“java运行时数据区域和类结构的详细讲解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: java运行时数据区域和类结构的详细讲解

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

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

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

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

下载Word文档
猜你喜欢
  • java运行时数据区域和类结构的详细讲解
    这篇文章主要介绍“java运行时数据区域和类结构的详细讲解”,在日常操作中,相信很多人在java运行时数据区域和类结构的详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java运行时数据区域和类结构的详...
    99+
    2023-06-20
  • java运行时数据区域和类结构详解
    Java运行时数据区域 java运行时数据区可以分为:方法区、虚拟机栈、本地方法栈、堆和程序计数器 线程私有:虚拟机栈、本地方法栈、程序计数器 线程共享:方法区、堆 程序计数器 一块...
    99+
    2024-04-02
  • Java数据结构顺序表的详细讲解
    目录写在前面1.线性表2.顺序表的实现2.1增加数据2.1.1尾部增加数据2.1.2任意位置增加数据2.2查找数据2.3删除数据2.4修改数据3.ArrayList3.1ArrayL...
    99+
    2024-04-02
  • Java超详细讲解数据结构的应用
    目录一.bfs二.双端队列三.算法题1.kotori和迷宫2.小红找红点3.小红玩数组 一.bfs bfs(广度优先搜索),类似二叉树的层序遍历,利用队列完成。一般用于求最短路。 图...
    99+
    2024-04-02
  • Java运行时数据区域(内存划分)的深入讲解
    1. 程序计数器(线程私有) 程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器(切换线程后,能恢复到正确的执行位置). 2. Java虚拟机栈(线程私...
    99+
    2024-04-02
  • 数据结构:栈和队列(详细讲解)
    🎇🎇🎇作者: @小鱼不会骑车 🎆🎆🎆专栏: 《数据结构》 🎓🎓...
    99+
    2023-09-14
    数据结构 java 算法
  • JAVA JVM运行时数据区详解
    目录一、前言二、运行时数据区整体概架构三、程序计数器四、虚拟机栈1、栈的特点2、栈帧的内部结构3、局部变量表4、操作数栈5、动态链接6、方法返回地址五、本地方法栈六、堆1、设置堆大小...
    99+
    2024-04-02
  • Java 超详细讲解数据结构中的堆的应用
    目录一、堆的创建1、向下调整(以小堆为例)  2、创建堆3、创建堆的时间复杂度 二、堆的插入和删除1、堆的插入2、堆的删除 三、堆的应用1、堆排序2、t...
    99+
    2024-04-02
  • Java内存划分:运行时数据区域
    目录1. 程序计数器(线程私有)2. Java虚拟机栈(线程私有)(1) 概念(2) 下面我们来分析一段代码3. 本地方法栈(线程私有)4. Java堆(线程共享)5. 方法区(线程...
    99+
    2024-04-02
  • C++ 数据结构超详细讲解顺序表
    目录前言一、顺序表是什么概念及结构二、顺序表的实现顺序表的缺点几道练手题总结(●’◡’●) 前言 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种...
    99+
    2024-04-02
  • C++ 数据结构超详细讲解单链表
    目录前言一、链表是什么链表的分类二、链表的实现总结(❁´◡`❁) 单链表 前言 上篇顺序表结尾了解了顺序表的诸多缺点,链表的特性很好的解决了这些问题,本期我们来认识单链表...
    99+
    2024-04-02
  • 如何理解Java虚拟机运行时数据区域
    这期内容当中小编将会给大家带来有关如何理解Java虚拟机运行时数据区域,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、程序计数器(Program Counter Register)当前线程所执行的字节码...
    99+
    2023-06-05
  • Java虚拟机运行时数据区域划分
    Java虚拟机数据运行时区域方法区(Method Area)存储加载的类信息,常量,静态变量,编译器编译后的代码等数据。虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做Non-Heap。Class文件中除了有类的版本,字段...
    99+
    2023-06-03
  • C++数据封装以及定义结构的详细讲解
    目录定义结构访问结构成员结构作为函数参数指向结构的指针typedef 关键字C++ 数据封装数据封装的实例设计策略C++ 类 & 对象C++ 类定义定义 C++ 对象访问数据...
    99+
    2023-05-20
    C++数据封装及定义结构 C++数据封装 C++定义结构
  • C语言超详细讲解数据结构中的线性表
    目录前言一、分文件编写1、分文件编写概念2、代码展示二、动态分布内存malloc1、初识malloc2、使用方法三、创建链表并进行增删操作1、初始化链表2、在链表中增加数据3、删除链...
    99+
    2024-04-02
  • 面试时必问的JVM运行时数据区详解
    目录前言正文1、运行时数据区(Run-Time Data Areas)1)程序计数器(Program Counter Register)2)Java虚拟机栈(Java Virtual...
    99+
    2024-04-02
  • java数据类型和运算符的深入讲解
    一.整型变量 1.基本格式 int 变量名 = 初始值; 代码示例: public class CSDN { public static void main(String[]...
    99+
    2024-04-02
  • Java超详细精讲数据结构之bfs与双端队列
    目录一.bfs二.双端队列三.算法题1.kotori和迷宫2.小红找红点3.小红玩数组一.bfs bfs(广度优先搜索),类似二叉树的层序遍历,利用队列完成。一般用于求最短路。 图的...
    99+
    2024-04-02
  • C语言数据结构超详细讲解单向链表
    目录1.链表概况1.1 链表的概念及结构1.2 链表的分类2. 单向链表的实现2.1 SList.h(头文件的汇总,函数的声明)2.2 SList.c(函数的具体实现逻辑)2.2.1...
    99+
    2024-04-02
  • Java运行时的数据区有哪些
    本篇文章给大家分享的是有关Java运行时的数据区有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JVM体系结构和运行时数据区概述要理解JVM的运行时数据区, 必须先要理解J...
    99+
    2023-05-31
    java ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作