1.理解JAVA虚拟机的内存管理

运行时的数据区

  从java虚拟机的内存分配来看,一个java程序运行时包含了如下几个数据区:

  a)     程序计数寄存器(Program Counter Register)

  b)     虚拟机栈(Java Virutal Machine Stack)

  c)     本地方法栈(Native Method Stack)

  d)     Java堆(Java Heap)

  e)     方法区(Method Area)

  f)      运行时常量池(Runtime Contant Pool)

  每一部分的具体关系如下图:

  程序计数寄存器:用于标示当前被执行的字节码,这是一个线程相关的概念。

  虚拟机栈:有点类似于C语言中的栈内存,用于存储一些过程结果,在每个方法被调用后都会在虚拟机栈中创建一个块区域,用于存放局部变量表、操作栈、动态链接、方法出口等信息。需要注意的是,临时变量表中只会保存基本数据类型或者对象句柄,具体的内存存放的位置永远位于Java堆中。另外,虚拟机栈也是线程私有的。

  本地方法栈:用于支持native方法,这就是传统意义上的C栈,可以基于本区域直接调用Native函数库实现内存分配等相关操作,具体的讨论会放到native关键字再深入理解。

  Java堆:Java堆的创建是在虚拟机启动之时,被所有的线程所共享。Java中著名的垃圾回收器(GC)所管理的主要对象(当然也可能包含方法区等)。

  方法区:线程共享区域,包含了虚拟机加载的类信息、常量、静态变量以及编译后的字节码等数据。方法区是在虚拟机启动的时刻被创建,逻辑上属于Java堆,但是按照Java虚拟机的规范,并不强制要求垃圾回收器实现对本区域的管理。

  运行时常量池:类似于传统语言中的符号表,存放除了字面量、符号引用外,还包括类于接口的相关描述信息。这个区域逻辑上是属于方法区内部的,在类与接口加载完成后被创建。另外,比传统的符号表更广泛的是,除了编译期常量外,运行时常量池也同时接受运行期的常量。

对象存储访问

Java中数据类型包括了两大类:基本类型和类类型。

所有的基本类型数据都存放到虚拟机栈中,而对于类类型,我们实际只能获取到的只是用于操作实例化对象的句柄(也可以称之为引用)。句柄本身的存储位于虚拟机栈中,而对应的实例化对象会在Java堆中被动态的创建。

void static main(String args[]){

    int i = 123; //i被存储到虚拟机栈中

    Object objA = new Object(); //这一句代码涉及到两个内存区域:虚拟机栈和java堆,objA被保存在虚拟机栈的变量表中,实例化的对象则会在java堆中被创建

    static Object objB = new Object(); //objB位于运行时常量池,在本类加载后执行前就已经存在,具体的实例化对象则是在运行时被创建的

}

  通过一个句柄,能够找到两大类信息:具体的实例化对象的内存区域(逻辑上位于Java堆中)和对象所属的类的基本信息(逻辑上位于方法区)。Java虚拟机规范中并没有明确规定在虚拟机栈中的句柄找到这两类信息的具体定位方式,但无论采用哪种形式,通过句柄获取到的目标结果是明确的。

 

Java杂谈1——虚拟机内存管理与对象访问的更多相关文章

  1. java中JVM虚拟机内存模型详细说明

    java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03|  分类: JAVA |  标签:java  jvm  堆内存  虚拟机  |举报|字号 订阅     JVM的内部结构 ...

  2. 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩

    百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...

  3. JVM之对象创建、对象内存布局、对象访问定位

    对象创建 类加载过后可以直接确定一个对象的大小 对象栈上分配是通过逃逸分析判定.标量替换实现的,即把不存在逃逸的对象拆散,将成员变量恢复到基本类型,直接在栈上创建若干个成员变量 选择哪种分配方式由Ja ...

  4. Java虚拟机内存管理机制

    自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...

  5. 深入理解java虚拟机---java虚拟机内存管理(七)

    本地方法栈.java堆.方法区 本地方法栈在HotSpot版本内与java虚拟机栈是合二为一的.不单独区分本地方法栈.但是java虚拟机中是有这样一块区域的. 作用: 1.本地方法栈为虚拟机栈执行ja ...

  6. 深入理解Java虚拟机—内存管理机制

    前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...

  7. (三)java虚拟机内存管理和线程独占区和线程共享区

    一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...

  8. Java虚拟机内存管理原理基础入门

    Jdk:Java程序设计语言.Java虚拟机.Java API类库. Jdk是用于支持Java程序开发的最小环境. Jre:Java API类库中的Java SE API子集.Java虚拟机. Jre ...

  9. 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位

    参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...

随机推荐

  1. hnust 神奇的序列

    问题 E: 神奇的序列 时间限制: 1 Sec  内存限制: 128 MB提交: 635  解决: 84[提交][状态][讨论版] 题目描述        Aurora在南宁发现了一个神奇的序列,即对 ...

  2. 课时2:用python设计第一个游戏

    目录: 一.第一个小游戏 二.缩进 三.BIF 四.课时02课后习题及答案 ********************* 一.第一个小游戏 ********************* # p2_1.py ...

  3. Windows 下开发.NET Core应用

    一.使用Visual Studio 2015开发1.1 依次安装Visual Studio 2015 Update 3.NET Core 1.0.0 - VS 2015 Tooling Preview ...

  4. 【多线程学习(2)】继承Thread类和实现Runnable接口、Callable接口的区别

    1)Runnable和Callable同是接口 * Callable的任务执行后可返回值,而Runnable的任务是不能返回值(是void);call方法可以抛出异常,run方法不可以 * 运行Cal ...

  5. 删除maven仓库中的lastUpdate文件

    使用idea时导入hibernate 5.1.0的jar包,然后发现本地仓库中找不到该版本的jar 然后手贱 alt+enter 发现提示 update maven indices 然后以为更新就会好 ...

  6. [洛谷P4149][IOI2011]Race

    题目大意:给一棵树,每条边有边权.求一条简单路径,权值和等于$K$,且边的数量最小. 题解:点分治,考虑到这是最小值,不满足可减性,于是点分中的更新答案的地方计算重复的部分要做更改,就用一个数组记录前 ...

  7. 全网把Map中的hash()分析的最透彻的文章,别无二家。

    你知道HashMap中hash方法的具体实现吗?你知道HashTable.ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8 ...

  8. angular.extend(dst,src)的简单示例

    自我认为这个方法跟angular.copy(src,dst)有点相似.在angular.extend({},src)时,就可以画等号.这个src只代表一个对象.代码如下:(注意这个src可以有多个对象 ...

  9. MAC使用IDA PRO远程调试LINUX程序

    1 背景 在学习Linux系统上的一些漏洞知识的时候,往往需要进行“实地测试”,但是在Linux系统上进行调试并不太方便,因为LINUX自带的GDB调试工具真的不太人性化,即使有GDBTUI之类的“伪 ...

  10. 蓝萝卜blu netty3升netty4

    老项目是netty3的,本来想直接改到netty5,但是netty5居然是只支持jdk1.7,很奇怪jdk1.6和jdk1.8都不行..为了兼容jdk1.6加上netty4本来和netty5就差别不大 ...