首页 > 系统相关 >JVM内存结构&Java内存模型&Java对象模型

JVM内存结构&Java内存模型&Java对象模型

时间:2023-06-07 20:22:23浏览次数:64  
标签:Java 对象 虚拟机 线程 内存 模型

1.JVM内存结构

Java代码是运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把管理的内存划分为若干个不同的数据区域。其中有些区域是随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。而这些区域会被划分为五个区域,具体的如下:
image

方法区:方法区与是所有线程所共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。当方法区无法分配足够内存时,将会抛出OutOfMemoryError异常
堆:堆是Java虚拟机所管理的内存中最大的一块。java堆是被所有线程所共享的一块内存区域,虚拟机启动时创建。是GC(垃圾收集器)管理的主要区域。
虚拟机栈:虚拟机栈描述的是java方法执行的内存模型,方法的执行的同时会创建一个栈祯,用于存储方法中的局部变量表、操作数栈、动态链接、方法的出口等信息,每个方法从调用直到执行完成的过程,就对应着一个栈祯在虚拟机栈中入栈到出栈的过程 。
本地方法栈:本地方法栈和虚拟机栈很相似,不过本地方法栈中调用的都是本地方法。会抛出StackOverFlowError异常、OutOfMemoryError异常
程序计数器:指向当前线程所执行的字节码指令的地址,也就是当前代码执行到哪了,通常也叫做行号指示器。

2.Java内存模型

Java内存模型也就是JMM(Java Memory Model),其只是一个抽象的概念,并不是真实存在的。
由于java中多线程之间是通过共享内存进行通讯的,所以其就会出现并发的三大特性:原子性,一致性和有序性。而JMM就是围绕着这些特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是: volatile、 synchronized等关键字。
JMM将共享数据部分的内存称为主内存,而在并发编程中的多个线程每一个线程都维护了一个自己的本地内存(抽象概念),操作数据是通过将主内存中的数据复制到本地内存,在本地内存中操作,之后再同步到主内存。而JMM主要就是控制本地内存和主内存之间的数据交互。
总的来说JMM是一种规范,目的是解决多线程间共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景下的原子性、可见性、有序性
其抽象结构为:
image

3.Java对象模型

Java对象模型是java对象自身的存储模型。java对象在内存中由三部分构成:对象头,实例数据和对齐填充
HotSpot虚拟机中,设计了 OOP-KlassModel,其中OOP是指普通对象指针,而Klass用来描述对象实例的具体类型。
其中OOP-KlassModel模型为:
image
对象头:Java对象头一般占有2个机器码(在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中,1个机器码是8个字节,也就是64bit),一个记录MarkWord,一个记录元数据指针。特殊的就是当存储的对象为数组的时候,会占用三个机器码,有一个机器码记录的是数组的长度。

  • Mark Word
锁状态 25bit 4bit 1bit(是否偏向锁) 2bit(锁标志位)
无锁 对象的hashCode 分代年龄 0 01
偏向锁 前23位存的位线程ID,后2位存的位Epoch(本质位一个时间戳,表示偏向锁的有效性) 分代年龄 1 01
轻量级锁 指向栈中锁记录的指针 00
重量级锁 指向栈中锁记录的指针 10
GC标记 11
  • 元数据指针
    它主要指向类的数据也就是指向方法区中的位置,通过这个指针,我们就可以知道该实例属于哪个类,长度通常为32bit。
  • 数组长度
    只有数组对象才有,在32位或者64位JVM中,长度都是32bit。

实例数据
主要存放的是类的数据信息
对齐填充
仅仅是为了填充数据使字节达到8的倍数,并不具有什么实际意义。

4.总结

  • JVM内存结构与java虚拟机运行时数据区域有关
  • Java内存模型也就是JMM与Java并发编程有关
  • Java对象模型就是Java对象的存储结构,和Java对象在虚拟机中的存储有关

标签:Java,对象,虚拟机,线程,内存,模型
From: https://www.cnblogs.com/mcj123/p/17450756.html

相关文章

  • Java设计模式-适配器模式
    适配器模式(AdapterPattern)是一种常见的设计模式,它主要用于在不改变现有系统结构的情况下,将一个类的接口转换成客户端所期望的另一个接口。在本文中,我们将介绍适配器模式的基本概念、实现方法以及优缺点,并探讨适配器模式在Java编程语言中的具体应用。简介适配器模式是一种结构型......
  • 扩散模型
    扩散模型的用途:当下很多图片需要去码去噪,还原本身的图像性质。或者当下AI绘画很火热,许多算法通过输入文字描述,最终便可以得到一张生成图像。概述扩散模型的思路:定义一个扩散步骤的马尔可夫链,缓慢地将随机噪声添加到数据中,然后学习反转扩散过程,从噪声中构建所需的数据样本。噪......
  • JDK没有JAVAX.ANNOTATION.JAR包解决方案,无法使用@RESOURCE解决方案
    高版本JDK无法使用@Resource注解解决方案1.普通项目下载javax.annotation-api-1.3.2.jar,并在lib目录中引入即可2.Maven项目Maven项目:在pom.xml中进行配置<dependency><groupId>javax.annotation</groupId><artifactId>jsr250-api</artifactId><ver......
  • Java EE考点复习
    JavaEE一、JavaEE概述javaEE结构的软件系统分层从逻辑上分:表示层、业务层、数据持久层分布式系统开发的优点基于面向对象设计思想的多层结构超强的移植性与复用性侧重于Web应用模式的设计,支持分布式开发集成了众多的信息技术,称为一个功能强大的开发平台相对独立的......
  • 关于Java中多线程
    基本概念什么是进程-->是操作系统资源分配和调度的最小(基本)单位(操作系统分配给当前进程一个内存区域供其使用)什么是线程-->是程序运行的基本单位(等待操作系统分配时间片让CPU执行该内存区域中的代码)进程和线程的关系-->一个进程可以存在多个线程线程是由进程创建的(寄......
  • 机器学习之模型评估
    一.数据集准备二.模型准备三.交叉验证(k折交叉验证(10))四.知识点补充:混淆矩阵(准确率,召回率)五.知识点补充:阈值和ROC曲线1.数据集处理(读取,切分,shuffle洗牌操作)fetch_openml()函数可以下载openml.org公共数据库中的数据集,如:mnist_784,得到mnist(mnist数据是图像数据:(28,28,1)的......
  • java 接口
    为什么使用接口接口可以实现java中的“多继承”什么是接口接口的关键字是interface接口中的所有方法都是用抽象abstract修饰的;没有方法体;那个类要用这个接口就在那个类中写接口中的方法接口不能实例化,接口就是抽象的概念实现类中必须实现接口中的所有方法实现的关键字imple......
  • java多态
    多态的定义:父类引用指向子类对象实现多态的三个要素:1.编写具有继承关系的父类和子类publicclassDemoextendsTest2.子类重写父类方法重写的定义是子类和父类拥有相同方法名或者相同属性的方法3.使用父类的引用指向子类的对象符合这三个条件就可以使用多态多态的向上转......
  • 拟合剩余使用寿命 (RUL) 估计的指数退化模型
    指数退化模型定义为                                         ......
  • java面试(30)- redis
    1:Redis支持的数据类型a)字符串keyvalb)hashkeynamefiledc)listkeyv1v2v3v3d)setkeyv1v2v3d)zsetkeysv2:Redis支持的事务3:为什么redis快 4:redis的优缺点1、优点a)数据类型丰富b)支持数据......