认识JVM

class 文件

硬盘上的文件

class content

内存中

Class 对象

元数据,存在于方法区

对象

存在于堆区

方法区的实现

jdk1.8之前:永久代实现,存放于堆上,会触发oom,GC
jdk1.8之后:元空间实现,存储于本地内存上

Java 虚拟机内存模型

在这里插入图片描述

  • 线程私有区域
    在这里插入图片描述
  • 线程共有区域
    在这里插入图片描述

对象初始化

创建对象过程中,先经历半初始化,先赋值为默认值

对象初始化流程:
1:分配内存空间
2:初始化对象
3:完成对象与内存地址的绑定
4:对对象进行调用

DCL

  • 多线程下对象的创建会发生指令重排,B线程读取的对象可能未创建完成,导致错误
解决:
1:使用volatile禁止代码中的指令重排,volatile具有可见行,有序性,可保证指令的正常执行
2:构造线程初始化对象时,禁止其他线程对此对象的访问,在类的初始化阶段,在JVM中,
构造线程会去获取一个锁,这个锁可以同步多个线程对一个类的初始化

Java对象内存布局

  • 对象头
  • 实例数据
  • 对齐填充

在这里插入图片描述

在这里插入图片描述

对象如何定位(如何使用)

在这里插入图片描述

JVM 参数集合

  • 内存溢出文件打印
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath:/usr/local/base			

JVM线程模型

在这里插入图片描述

主内存&工作内存同步图解

在这里插入图片描述

name作用范围说明
lock加锁作用于主内存将一个变量标识为一条线程独占状态
read读取作用于主内存将一个变量从主内存传输到线程的工作内存中去
load载入作用于工作内存将read操作主内存获取的值放入到工作内存的变量副本中
use使用作用于工作内存把工作内存中的变量传递给执行引擎
assign赋值作用于工作内存将执行引擎接收到的值赋值给本地变量
store存储作用于工作内存把工作内存的值传到主内存中
write写入作用于主内存将store从工作内存中获取的值传送到主内存的变量中
unlock解锁作用于主内存把一个处于线程锁定的变量释放出来,保证其他线程可对释放后的变量进行锁定

线程的安全性

  • 原子性
提供了互斥访问,同一时刻只能有一个线程对它来进行操纵
  • 可见性
一个线程对主内存的修改可以及时的被其他线程看到
  • 有序性
一个线程观察其他线程的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值