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. REMIX与LOCALHOST相连

    REMIX与LOCALHOST相连 让Remix与本地文件系统进行交互,点击connect同时找到localhost下的Remix文件管理器的共享目录.在开始之前,参考网址: https://remi ...

  2. 201621123033 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 父类 子类 继承 覆盖 抽象 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选: ...

  3. 【Python】- pytharm 中import时无法识别自己写的程序

    右键点击自己的工作空间,找下面的Mark Directory as(将目录标记为) 选择Source Root,就可以解决上面的问题了,如图

  4. Codeforces Round #384 (Div. 2) 734E(二分答案+状态压缩DP)

    题目大意 给定一个序列an,序列中只有1~8的8个整数,让你选出一个子序列,满足下列两个要求 1.不同整数出现的次数相差小于等于1 2.子序列中整数分布是连续的,即子序列的整数必须是1,1,1.... ...

  5. [poj] 2286 The Rotation Game || ID-DFS

    原题 有1234四个数字,每个数字八个.有八种方向的移动,使得操作后中间八个方块的数字相同,求最小操作步数. 对于这种求最小步数的看起来就是dfs的题,就ID-DFS就好了. //不知道为什么都是ID ...

  6. 洛谷 P2375 [NOI2014]动物园 解题报告

    P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...

  7. Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2)

    Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2)     最近在做控制算法实现的时候,对于其中参杂的各种差分.卷积很头疼,就在网上搜集了些资料,汇总于此,以做备 ...

  8. Java中同一个类中不同的synchronized方法是否可以并发执行?

    答案是: 不可以,因为都是获取到对象本身的锁. 多个线程访问同一个类的synchronized方法时, 都是串行执行的 ! 就算有多个cpu也不例外 ! synchronized方法使用了类java的 ...

  9. [ CodeVS冲杯之路 ] P1294

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1294/ 随手一打就是这么漂亮的全排列,想当年我初一还是初二的时候,调了1个多小时才写出来(蒟蒻一枚) 直接DFS每次枚 ...

  10. zero(NOIP模拟赛 Round 4)

    题目描述 假设x=N!,那么x的末尾有多少个零呢? 输入 一行,一个整数N. 输出 输出只有一个整数,表示x末尾零的个数. 这道题目,我们看一看数据范围, 10^1000肯定是高精啦! 然后我们再想一 ...