Java中内存模型解析

 2019-12-10 16:20  阅读(1214)
文章分类:Java Core

这篇小结主要的内容:

  1. 堆存取和栈存取
  2. a++和++a的本质区别
  3. JDK.JRE,JVM的含义以及意义
  4. MetaSpace原数据带的存储

Java的内存模型基本如下图所示:
20191210001745\_1.png

首先JDK,JRE,JVM的关系如图显示:
JDK 是Java开发工具包 (Java Development Kit ) 的缩写。它是一种用于构建在 Java 平台上发布的应用程序、applet 和组件的开发环境。其中包括了Java编译器、JVM、大量的Java工具以及Java基础API里面是Java类库和Java的语言规范,同时Java语言的任何改进都应当加到其中,作为后续版本发布.
JRE是Java Runtime Environment缩写,指Java运行环境。运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
JVM(Java Virtual Machine)就是虚拟机的意思,是Java可以跨平台运行的基础。

首先Program Counter Register 是程序计数器的意思,JVM允许多线程的运行程序,这也是我们没法控制的内容,不多做研究。

栈区
从图中可以看出栈不可以简单称为Stack,它分为VM Stack,以及本地方法栈:Native Method Stack(与物理内存直接交互)。首先说VM Stack,虚拟内存栈,里面存引用(reference)和基本数据类型的值。在栈中有一块栈帧区,存储着很快的栈帧(如图),例如调用一个方法的成员变量,它的局部变量,返回类型与一些其他内容包括调用顺序等都存在栈帧。所以栈区的内容不用GC(垃圾回收),因为他调用完会自动 的弹栈,即用即消失。

堆区主要存放的是成员变量,属性存放在堆区。堆区又分为三个区域,新生代(edanSpace –>Young GC),幸存带(Survice Space)和老年代(old Gen)。也就是他把不同的对象存放在不同的位置,例如将刚生成的对象放到新生代,不能让edanSpace过满,因为这个区域过满会频繁触发GC,导致性能降低。一轮GC过后的对象会存入幸存带,多轮过后就会存入老年代,在这个区域GC很少会光顾。每个带的GC机制都有所不同。

方法区

即图中的Method区域 ,也就是存放方法的区域,里面包含static静态方法区。

PermGEN
永生带,一般关于类的基本信息之类的内容会放入永生带,但是在jdk7以后被删除,后由原数据带替换。

MetaSpace
原数据带,驻留在物理内存当中的原数据空间,脱离JVM。字符串常量池
放在原数据带(jdk7以后) 。

a++和++a

在初学Java的时候我们为了方便记忆对他俩的记忆都是停留在++a先自加后赋值,a++先赋值后自加,其实这样是不正确的(当然方便记忆也可以这样理解),其实这里的区别在上面说过的栈帧区,其实在实现的是后a++和++a都是先自加后赋值,他俩产生不同结果的原因在于压栈的顺序,a++是先压栈后自加,++a是先自加后压栈。

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java中内存模型解析

相关推荐