JVM简介

概念:JVM==Java Virtual Machin,意为Java虚拟机。
JVM是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪, JVM是一台被定制过的现实当中不存在的计算机
.VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器

Java内存区域与内存溢出异常

JVM会在执行Java程序的过程中将他管理的内存分为若干个区域:

  • 线程私有区域:程序计数器、Java虚拟机栈、本地方法栈
  • 线程共享区域:Java堆、方法区、运行时常量池

线程私有区域详谈

程序计数器(pc)

是一块较小的内存空间,用来指示当前执行线程字节码执行的地址。若当前执行的是Native方法,则计数器值为空。

由于JVM的多线程是由CPU不断的分配CPU时间片段给不同的线程,因此一个处理器只会执行一条线程中的指令,因此切换线程后能恢复到正确的执行位置,每条线程都需要独立的程序计数器,各个线程间计数器互不影响,独立存储。

程序计数器内存区域是唯一一个在JVM规范中没有规定OOM(OutOfMemoryError)的区域。

Java虚拟机栈

Java虚拟机栈是描述Java方法执行的内存模型。每个方法都会创建一个栈帧用于存储局部变量表、操作数栈、动态链表、方法出口等信息。每一个方法从调用到执行完成,就对应一个栈帧在虚拟机中入栈和出栈的过程。

虚拟机栈的局部变量表:存在了编译器可知的8种数据类型,对象引用。局部变量表所需的内存在编译期间完成分配,当进入一个方法时,这个方法在帧中分配局部变量空间的大小是完全确定的,不会改变。

Java虚拟机栈会产生的异常:

  • 线程请求的栈(递归调用)的深度大于虚拟机能够允许的深度(1000-2000),会抛出StackOverFlowError异常
  • 虚拟机在动态扩展时无法申请到足够的内存,会抛出OOM(OutOfMemoryError)

若是因为多线程导致的内存溢出问题,在不能减少线程数的情况下,只能减少最大堆(-Xmx参数设置)和减少栈容量(-Xss参数设置)的方式换取更多的线程。

本地方法栈

本地方法栈与虚拟机栈作用完全一样,区别在于本地方法栈为虚拟机使用native方法服务,而虚拟机栈为Java方法服务。

线程共享区域详谈

Java堆

Java堆是JVM所管理的最大的内存区域。Java堆是所有线程共享的一块区域,在Java启动时创建,存放的是对象实例(所有的对象实例和数组都要在堆上分配)。

Java堆是垃圾回收器管理的主要区域(GC堆),Java堆可以处于物理不连续的内存空间中,如果在堆中没有足够的内存完成实例分配并且也无法拓展时,将会抛出OOM

方法区(MateSpace)

用于存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译i去编译后的代码等数据,在JDK8以前的HotSpot虚拟机中,方法区也被称为“永久代”,JDK8称为元空间。
此区域内存回收主要是针对常量池的回收以及对类型的卸载。
当方法区无法满足内存分配需求时,将抛出OOM

运行时常量池(方法区的一部分)

此区域是方法区的一部分,存放字面量(字符串、final常量、基本数据类型的值)与符号引用(类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符)。

Java堆溢出

Java堆OOM异常是最常见的内存溢出,当异常信息提示"Java heap space",则明确表示OOM发生在堆上。

内存泄漏:泄漏对象不能被GC
内存溢出:内存对象

Java内存模型

主内存(操作系统内存)与工作内存(线程拥有的区域)

Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该 线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存进行而不能直接 读写主内存中的变量不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主 内存来完成

内存间交互操作

lock()锁定
unlock()解锁
read()读取
load()载入
use()使用
assign()赋值
store()存储
write()写入
线程、主内存、工作内存三者的交互关系如下所示

Java内存模型的三大特性

1.原子性:Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和read,若需要大范围的原子性,需要synchronized关键字
2.可见性:指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改,。volatile、 synchronized、final三个关键字可以实现可见性。
3.有序性:在本线程内观察,所有的操作都是有序的(线程内表现为串行);如果在线程中观察另外一个线程,所有的操作都是无 序的。

Java内存模型保证有序性的条件是遵循happens-before原则
程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
锁定规则:一个unLock操作先行发生于后面对同一个锁的lock操作
volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C
线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作
线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、 Thread.isAlive()的返回值手段检测到线程已经终止执行
对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始

volatile型变量的特殊规则

关键字volatile可以说是JVM提供的轻量级的同步机制,当一个变量被定义为volatile后,它具备两种特性:
1.保证此变量对所有线程可见(同指同步),volatile变量在各个线程中是一致的,但是volatile变量的运算在并发下一样是不安全的。在不符合【1. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值 2. 变量不需要与其他的状态变量共同参与不变约束】,我们仍然需要通过加锁(synchronized或 者lock)来保证原子性
2.volatile变量禁止指令重排
1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经 对后面的操作可见;在其后面的操作肯定还没有进行;
2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句 放到其前面执行
例如单例模式中的double check可用volatile声明变量。

public class Singleton{private Singleton() {}private  volatile static Singleton instance;public  static Singleton getInstance(){if(instance==null){synchronized (Singleton.class){if(instance==null){instance=new Singleton();}}}return instance;}
}

【Java】---JVM内存模型相关推荐

  1. java jvm内存模型_Java(JVM)内存模型– Java中的内存管理

    java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...

  2. Java JVM内存模型

    简述JVM内存模型 线程私有的运行时数据区: 程序计数器.Java 虚拟机栈.本地方法栈. 线程共享的运行时数据区:Java 堆.方法区. 简述程序计数器 程序计数器表示当前线程所执行的字节码的行号指 ...

  3. Java JVM内存模型(运行时数据区域)详解

    详细介绍了JVM运行时数据区域,包括方法区.堆空间.栈空间.本地方法栈.程序计数器.常量池.直接内存.字面量.符号引用.直接引用. Java程序在运行时,需要在内存中的分配空间.为了提高运算效率,ja ...

  4. java面试-深入理解JVM(一)——JVM内存模型

    JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:  1. 程序计数器  2. Java虚拟机栈  3. 本地方法栈  4. 堆  5. ...

  5. Java基础:由JVM内存模型详解线程安全

    1.前言 最近在研究JVM内存模型和Java基础知识.主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码.这里列出一条规则,"类中的成员变量,也叫实例变量,也叫全局变量,它是非线 ...

  6. JVM内存模型、Java内存模型 和 Java对象模型

    一.JVM内存模型 1.JVM运行时数据区 二.Java内存模型(JMM) 1.JMM 三.Java对象模型 1.Java对象在JVM中的存储模型称之为Java对象模型.  四.总结  1.JVM内存 ...

  7. java内存图怎么画,jvm内存模型怎么画?简单美观的模型图制作软件

    jvm内存模型是什么呢?jvm内存模型是一类用于描述由java栈.java堆.方法区.本地方法栈和程序计数器各部件构成的Java程序.在执行过程中,由jvm管理的不同数据区域的一类图表.jvm内存模型 ...

  8. 《深入理解Java虚拟机》读后总结(一)JVM内存模型

    基于Sun HotSpot JVM 直接上图: 从图中看到,JVM内存分为两个主要区域,一个是所有线程共享的数据区,一个是线程隔离数据区(线程私有) 线程隔离数据区 程序计数器(Program Cou ...

  9. java内存分配空间大小,JVM内存模型及内存分配过程

    一.JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域). 1.Heap是运行时数据区域,所有类实例和数组的内存均从此处分配.Heap区分两大块,一块是 Youn ...

  10. 深入理解JAVA虚拟机学习笔记(一)JVM内存模型

    摘要:   上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状 ...

最新文章

  1. java 类成员访问权限_Java类成员访问权限控制知识总结
  2. python 字符串替换_Python基础教程,第四讲,字符串详解
  3. 工作107:静态路由
  4. django存入mysql数据库_django如何存数据到一个mysql数据表里面
  5. 为什么要做短视频秒播优化
  6. spark学习笔记-CentOS 6.4集群搭建(2)
  7. PHP单例模式经典讲解
  8. idea右边maven全爆红_通过Idea创建Spring Boot java项目
  9. Linux命令解释之rpm
  10. 上班工作压力太大?来玩个游戏解压下
  11. python剪辑_用python进行视频剪辑
  12. Qt Quick简单教程
  13. 读书感受 之 《如何说客户才会听,怎么听客户才肯说》
  14. 金融第三方网银在线支付通道、支付宝网银在线支付通道对接
  15. 西直门立交桥的破事儿
  16. 云南原乡|坐拥腾冲旅游绝佳位置 是旅居养生度假投资首选
  17. IEEE754标准表示浮点数(详解)
  18. HIVE基本查询操作(二)——第1关:Hive排序
  19. html做一个聊天输入框,js实现简易聊天对话框
  20. kaggle案例:广告点击率预估+LR

热门文章

  1. case when 多条件 oracle,casewhen(casewhen同时满足多条件)
  2. 如何下载Visual C++ 2010 学习版(即 Visual C++ 2010 Express)
  3. Windows: 定制多用户多Registry键脚本
  4. windows上查看MD5
  5. 中国大数据产业地图,四川61家大数据企业上榜!
  6. 系统软硬件测试工具介绍
  7. CPAL脚本自动化测试 ———— Test Report系列函数及使用
  8. android App下载与安装
  9. liunx系统文件中转站(ftp服务)项目
  10. 乐视盒子UI 官方下载地址