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. 课时1:我和python的第一次亲密接触

    目录: 一.Python3的下载与安装 二.从IDIE启动Python 三.尝试点新的东西 四.为什么会这样? 五.课时01课后习题及答案 ============================== ...

  2. Linux 查看当前日期和时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  3. 爬虫:Scrapy7 - Scrapy终端(Scrapy shell)

    Scrapy 终端是一个交互终端,可以在未启动 spider 的情况下尝试及调试你的爬取代码.其本意是用来测试提取数据的代码,不过可以将其作为正常的 Python 终端,在上面测试任何 Python ...

  4. myEclipse如何将程序部署到tomcat(附录MyEclipse调试快捷键)

    部署 1.选中你要部署的项目,在工具栏找到 Deploy MyEclipse J2EE Project to Server 2.单击Add,即出现如下界面.选择相应的Server,要和你在配置tomc ...

  5. SqlServer中截取小数位数

    方法一:convert(float,字段名) as 别名 select convert(float,round(10.123232,2)) 结果:10.12 select convert(float, ...

  6. 细说php2[正则表达式学习笔记]

    <细说php>这本书应该是每个php程序员入门的必读书籍,里面讲的很多知识都很系统和详细,看了正则这部分,并练习了里面的案例,发现自己已经会了很多.... header('Content- ...

  7. iOS大神班笔记02-模仿苹果创建单例

    首先我们得要知道苹果是如何实现单例的:1.不能外界调用alloc,一调用就崩掉,其实就是抛异常(类内部第一次调用alloc就不崩溃,其他都崩溃). 2.提供一个方法给外界获取单例.  3.内部创建一次 ...

  8. 原生js获取屏幕的宽高

    function client(){ if(window.innerHeight !== undefined){ return { "width": window.innerWid ...

  9. 颜色混合opengl--glBlendFunc函数

    http://www.cnblogs.com/ylwn817/archive/2012/09/07/2675285.html 颜色混合opengl--glBlendFunc函数 原文:http://b ...

  10. UVA 10746 Crime Wave - The Sequel

    最小费用最大流 源点->警察->bank->汇点 剩下的模板就可以 #include <map> #include <set> #include <li ...