JVM内存模型

Posted huhaha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM内存模型相关的知识,希望对你有一定的参考价值。

  最近开始肝第三次<深入理解Java虚拟机-JVM高级特性与最佳实践>, 每次都是看了就忘, 所以这次准备写点东西记录下来. 个人感觉这本书写的是真的不错, 不同的阶段看有不同的体验, 每次都有很多收获. 话不多说, 直接进入正题. 

  什么是JVM

  Java Vitual Machine, 是一个运行Java代码的平台(划掉), 准确的说应该是运行.class文件的平台,  可一帮助我们屏蔽到不同机器之间的差异, 做到Write Once, Run Anywhere. 通过Jvm, 我们可以看到Sun公司的野心, Jvm不仅要做到平台无关, 还要做到语言无关, 只要你能把你的代码翻译成.class文件, 都能够运行起来.  如新生的Groovy, JRuby, Jython等, Jvm已经逐渐从"Java虚拟机"转变为多语言虚拟机. 关于Jvm之间的区别这里就不扯了. 

  HotSpot VM

  目前使用最广泛的是Sun公司的HotSpot虚拟机, 提供了准确式内存管理(可以清楚的知道一块内存中存放的到底是值还是引用)和热点代码探测技术(通过执行技术器找出最具有编译价值的代码, 然后通过JIT(Just In Time)编译器编译, 触发OSR(栈上替换)). 

  JVM内存区域

  Jvm会在执行Java程序时将它管理的内存划分为几个区域, 如下图(网上盗的图, 自己画的太丑):

  技术分享图片

 

 

  程序计数器: 线程私有, 每条线程都一个独立的程序计数器. 记录了当前线程执行到的字节码文件的位置, 如果线程正在执行Java 方法, 这个计数器记录的是虚拟机字节码指令的地址, 如果执行的是Native方法, 则这个计数器的值为空. 

  Java虚拟机栈: 描述的是Java方法执行的内存模型, 每一个方法对应一个栈帧, 栈帧中存放的有局部变量, 操作数栈, 方法出口等信息, 线程私有

  本地方法栈: 为Java执行本地方法服务, 与虚拟机栈的区别时存储的是执行Native方法时的信息.

  Java堆: Java虚拟机管理的最大的一块内存区域, 几乎所有的对象都分配在这里(因为JIT编译器的发展与逃逸分析技术的成熟,  栈上分配, 标量替换 等优化手段导致部分对象会直接栈上分配或不分配, 每次看到这些优化技术, 我都感觉自己的软件工程是白学了).

  方法区: 存储虚拟机加载的类信息, 常量, 静态常量, 即时编译器编译后的代码, 

  运行时常量池: class文件中的常量池存储了编译期生成的各种字面量和符号引用, 这部分内容会在类加载之后进入方法区的运行时常量池中存放. 运行期间也可以将新的常量放入常量池. 

  直接内存: 并不是虚拟机运行时数据区的一部分, 但这部分内存也被平凡使用, 并且会导致OOM. 

 

  

  

以上是关于JVM内存模型的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存模型Java内存模型 和 Java对象模型

JVM:JVM内存模型

JVM内存模型详解

细说JVM内存模型

JVM优化系列-------[3丶JVM的内存模型]

两种内存模型——JVM vs 计算机