Java杂谈1——虚拟机内存管理与对象访问
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——虚拟机内存管理与对象访问的更多相关文章
- java中JVM虚拟机内存模型详细说明
java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03| 分类: JAVA | 标签:java jvm 堆内存 虚拟机 |举报|字号 订阅 JVM的内部结构 ...
- 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩
百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...
- JVM之对象创建、对象内存布局、对象访问定位
对象创建 类加载过后可以直接确定一个对象的大小 对象栈上分配是通过逃逸分析判定.标量替换实现的,即把不存在逃逸的对象拆散,将成员变量恢复到基本类型,直接在栈上创建若干个成员变量 选择哪种分配方式由Ja ...
- Java虚拟机内存管理机制
自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...
- 深入理解java虚拟机---java虚拟机内存管理(七)
本地方法栈.java堆.方法区 本地方法栈在HotSpot版本内与java虚拟机栈是合二为一的.不单独区分本地方法栈.但是java虚拟机中是有这样一块区域的. 作用: 1.本地方法栈为虚拟机栈执行ja ...
- 深入理解Java虚拟机—内存管理机制
前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...
- (三)java虚拟机内存管理和线程独占区和线程共享区
一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...
- Java虚拟机内存管理原理基础入门
Jdk:Java程序设计语言.Java虚拟机.Java API类库. Jdk是用于支持Java程序开发的最小环境. Jre:Java API类库中的Java SE API子集.Java虚拟机. Jre ...
- 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位
参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...
随机推荐
- python pyinstaller 打包程序报错解决
python打包exe,各种入坑 一.安装PyInstaller 1.安装pywin32 pip命令安装:pip install pywin32(推荐) 2.安装Pyinstaller pip命令安装 ...
- BI商业智能培训系列——(一)概述
简介: Business Intelligence,简称 BI. 商业智能,是指用现代的技术进行数据分析,以实现商业价值,这些技术包括数据仓库技术,线上分析处理技术,数据挖掘,数据展现技术等. 以往的 ...
- crond守护进程
Linux系统任务计划/etc/crontab cron的主配置文件,可以定义PATHcron格式如下:# .----------------分钟 (0 - 59)# | .------------- ...
- 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆
题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...
- 【bzoj3670】[Noi2014]动物园 KMP-next数组
题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天, ...
- 公路建设 (highway.c/cpp/pas)
2.公路建设 (highway.c/cpp/pas) 在滨海市一共有 n 个城市,编号依次为 1 到 n,它们之间计划修建 m 条双向道路,其中 修建第 i 条道路的费用为 ci. 海霸王作为滨海市公 ...
- linux命令Netstat
1.需求 了解Netstat命令 2.简介 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multi ...
- java 复习整理(四 String类详解)
String 类详解 StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上S ...
- .com和.cn域名的区别所在,各个域名后缀含义
很多人在注册域名的时候不明白域名后缀的含义,在这里就介绍两种最为常用的域名,介绍下他们的区别以及适用的范围.需要先查询是否被注册,我们经常去的就是西部数据和万网,查询并注册未被注册的域名,一般无论是什 ...
- s19文件格式详解
1.概述 为了在不同的计算机平台之间传输程序代码和数据,摩托罗拉将程序和数据文件以一种可打印的格式(ASCII格式)编码成s格式文件.s格式文件是Freescale推荐使用的标准文件传送格式.编译完成 ...