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. kafak基本操作

    创建topic bin/kafka-topics.sh --create --zookeeper 192.168.1.81:2181 --replication-factor 3 -partition ...

  2. EXTJS4.0 显示图片 动态图片

    在网上找了好久没有好的解决方法 都是用 'box' 什么的组件 改写的 autoEl 好麻烦,修改 好的属性都不能用.弄了好久没弄成 最后: 用panel  显示 html 文本 追加 ‘'<i ...

  3. 【bzoj3669】[Noi2014]魔法森林 Kruskal+LCT

    原文地址:http://www.cnblogs.com/GXZlegend/p/6797748.html 题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看 ...

  4. 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd

    题目描述 FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100) ...

  5. ZOJ 1280 Interesting Lines | 求两直线交点

    原题: 求两直线交点 思路借鉴于:http://blog.csdn.net/zxy_snow/article/details/6341282 感谢大佬 #include<cstdio> # ...

  6. vue1和vue2获取dom元素的方法

    vue1.*版本中 在标签中加上el='dom',然后在代码中this.$els.dom这样就拿到了页面元素 例如:<div class='box' v-el: myBox>你好</ ...

  7. JAVA学习资料大全

    最高端的JAVA架构师资源(来自龙果学院 价值¥1399元).JAVA互联网分布式架构(龙果学院 价值¥899元).Spring Boot(2017年最新 包括源码原理分析) + Spring Clo ...

  8. ACdream 1025 bfs

    Transform Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit St ...

  9. 向mysql中批量插入数据的性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...

  10. "todoList妙味"学习总结

    1.v-bind  主要用于属性绑定 :class="{completed: item.isChecked}",它会将{}里面的内容解析为js表达式   2.vue提供了一组方法, ...