关于JVM第一篇

本文详细解析了JVM内存模型的构成,包括栈、本地方法栈、程序计数器、方法区和堆的作用及管理方式。同时介绍了JMM内存模型,探讨其如何确保原子性、可见性和有序性。

1. 简单描述一下JVM的内存模型

首先java所设计的内存模型分为JVM内存模型和java内存模型(JMM),其中

  • JVM 内存模型主要包含栈(方法栈)本地方法栈程序计数器方法区

是线程私有,线程执行方法时都会创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息,调用方法时进行入栈,执行完毕后进行出栈。如果方法运行时栈的深度超过了虚拟机允许的最大深度就会出现StackOverFlow异常。可以使用-Xss128k参数进行每个线程的栈大小进行设置。

本地方法栈基本上和栈类似,只不过java执行java方法用的是栈,执行native方法用的是本地方法栈。

程序计数器保存着当前线程执行字节码的位置信息,每个线程工作时都有独立的计数器,执行java方法时使用计数器,执行native方法计数器为空。

方法区是辅助栈的一块永久区,存储着已经加载到虚拟机的类信息,常量,静态变量,即时编译优化后的代码等数据。1.7的永久代和1.8的元空间是方法区的一种实现。

是JVM内存管理最大的一块,对线程共享,目的是存放对象实例,几乎所有的对象都放在堆中。当堆没有可用空间时会抛出OOM异常,根据对象的存活周期不同,JVM把对象进行了分代管理。垃圾回收机制就发生在堆中。

  • JMM内存模型
    定义程序中变量的访问规则。所有的共享变量都存储在主内存中进行共享,每个线程有自己的工作内存,工作内存中保存的是主内存中变量的副本。线程对于变量的操作只能在自己的工作内存中进行,而不能直接对主内存操作。由于指令重排序,读写的顺序会被打乱,因此JMM需要提供原子性,可见性,有序性保证。

JMM如何保证原子性,可见性,有序性?
JMM保证对于除(long和double)之外的基本数据类型的读写是保证原子性的。另外关键字synchronized也可以提供原子性保证。
JMM的可见性是通过synchronized和volatile来实现的。volatile强制变量赋值会同步刷新回主内存,强制变量的读取会从主内存加载。保证不同的线程总是能看到该变量的最新值。
对于有序性的保证主要通过volatile和一系列的happens-before原则实现的。volatile可以阻止指令重排序可以保证变量读写的有序性;happens-before主要是描述规则,比如程序顺序原则,就是在一个线程内必须保证语句串行性。比如锁规则,对同一把锁的解锁一定要发生在再次加锁之前。

谢谢,欢迎继续关注我,请留下您珍贵的留言,我是二货

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值