Java 虚拟机-Java内存区域
简要介绍Java的内存区域:
- 运行时数据区域
- HotSpot虚拟机对象
一、概览

二、运行时数据区域
2.1 程序计数器
Program Counter Register,代表当前线程所执行的字节码的行号指示器,操作系统中的PC,这两个是一个概念。执行时就是通过改变这个计数器来选取下一条需要执行的字节码指令。Java支持多线程,所以每个线程有自己独享的PC,类似于操作系统线程表中的一个属性。
2.2 Java虚拟机栈
和PC一样,是线程私有的,和线程的生命周期一样。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的时候都会创建一个栈桢(Stack frame),用与存储局部变量,操作数、动态链接、方法出口等信息。局部变量放在栈中的局部变量表中,该表中存放了编译器可知的基本数据类型(int。float,string。。)和对象的引用(reference)。
2.3 本地方法栈
Native Method Stack与Java虚拟机栈的作用非常相似,不过用于为虚拟机调用到的Native方法服务。
2.4 Java堆
Java堆被所有线程所共享,是Java程序的内存,在虚拟机启动时创建,该内存区域的目的就是存放对象实例。Java堆是垃圾回收器(GC)管理的主要区域。
2.5 方法区
Method Area各个线程共享的区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,
方法区内有一块特殊的区域叫运行时常量池(Runtime Constant Pool),用于存放编译时生成的各种字面量和符号引用(字符串)
2.6 直接内存
直接内存不是虚拟机运行时的一部分,但是会影响到Java堆的大小
三、HOTSPOT中虚拟机对象
3.1 对象的创建
Java是一门面向对象语言,对象的创建是通过new关键字来完成的。主要步骤:
- 先去方法区检查类是否被加载
- 没有加载则先加载类到方法区
- 为对象分配内存(类被加载后所需要的空间是已知的)
- 分配内存并发控制(仿制同一块内存被分配给多个对象)
- 将所分配的内存空间初始化为0
- 将对象的基本信息(属于那个类,对象哈希码,GC代领等)放在对象头中(Object Header)
- 至此新对象已经产生
- 调用Init方法,对对象的属性按照程序员的想法进行赋值
3.2 对象内存布局
对象在内存中主要分三块:
- 对象头(Header):第一部分存储对象自身的数据,如哈希码,GC代龄等,另外一部分是类型指针,虚拟机通过这个指针来确定这个对象是那个类的实例
- 实例数据(Instance Data):对象真正存储的有效信息,程序代码中定义的各种字段的内容,父类中定义的也会被继承下来。
- 对齐填充(Padding):没有特殊意义,占位符,对象的大小必须是8字节的整数倍。
3.3 对象的访问定位
建立对象是为了使用对象,java程序需要通过存储在栈上的reference数据来操作对上的具体对象,reference类型是一个指向对象的引用,并没有定义这个歌引用该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机的实现方式而定,目前主流有两种:
1. 使用句柄访问对象

使用句柄的好处是句柄稳定,当对象被移动(GC后)时只改变句柄中的实例数据指针,而Reference本事不需要修改。
2. 使用指针访问对象

使用直接指针的最大好处就是速度更快,节省了一次指针定位的时间开销。
Java 虚拟机-Java内存区域的更多相关文章
- 从Java虚拟机的内存区域、垃圾收集器及内存分配原则谈Java的内存回收机制
一.引言: 在Java中我们只需要轻轻地new一下,就可以为实例化一个类,并分配对应的内存空间,而后似乎我们也可以不用去管它,Java自带垃圾回收器,到了对象死亡的时候垃圾回收器就会将死亡对象的内存回 ...
- 1 - JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))
java虚拟机的内存区域分配 在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时的这段空间的分 ...
- Java虚拟机之内存区域
原创文章,转载请标明出处! 目录 一.背景 二.运行时内存区域概述 1.官方描述 2.中文翻译 3.内存区域简述 4.运行时数据区简图 5.运行时数据区详图 三.JVM线程 JVM数据区域与线程关系 ...
- Java虚拟机各内存区域的位置及功能的介绍
Java虚拟机运行时数据区: 相关区域介绍: 程序计数器: 功能:当前线程所执行字节码的行号指示器.若是Java方法记录指令地址,若为Native方法,则不记录 隔离性:线程隔离 Error:无 Ja ...
- 深入理解Java虚拟机02--Java内存区域与内存溢出异常
一.概述 我们在进行 Java 开发的时候,很少关心 Java 的内存分配等等,因为这些活都让 JVM 给我们做了.不仅自动给我们分配内存,还有自动的回收无需再占用的内存空间,以腾出内存供其他人使用. ...
- Java虚拟机------JVM内存区域
JVM内存区域运行时数据区域分为两种: JVM内存区域 运行时数据区域分为两种: 线程隔离的数据区: 程序计数器 Java虚拟机栈 本地方法栈 所有线程程共享的数据区: Java堆 方法区 JVM 内 ...
- 深入Java虚拟机之内存区域与内存溢出
一.内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方 ...
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- 深入理解java虚拟机【内存溢出实例】
通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...
- Java虚拟机:内存模型详解
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...
随机推荐
- python tkinter组件学习
http://blog.csdn.net/pfm685757/article/details/50162567
- CSR1010 sdk蓝牙
转:http://blog.csdn.net/lorain_lynies/article/details/52038640CSR1010 I/O开发须知:关于I/O操作的函数库被定义在头文件<p ...
- 20145230《java程序设计》第三次试验报告
20145208 实验三 Java面向对象程序设计 实验内容 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...
- 使用 Apache Spark 让 MySQL 查询速度提升 10 倍以上
转: https://coyee.com/article/11012-how-apache-spark-makes-your-slow-mysql-queries-10x-faster-or-more ...
- (转) Nova是如何统计OpenStack资源
引言 运维的同事常常遇到这么四个问题: Nova 如何统计 OpenStack 计算资源? 为什么 free_ram_mb, free_disk_gb 有时会是负数? 即使 free_ram_mb, ...
- tensorflow1.0中的改善
TensorFlow 1.0 重大功能及改善 XLA(实验版):初始版本的XLA,针对TensorFlow图(graph)的专用编译器,面向CPU和GPU. TensorFlow Debugger(t ...
- nginx + tomcat多实例
一.tomcat 配置多实例(修改两个端口:server端口,tomcat端口) 搭建之前,先确保已安装java和tomcat jdk安装:http://note.youdao.com/notes ...
- Word 2010 怎么在每一章中使用不同的页眉
1.要做到每一章的页眉不同首先要进行 分节 word2010中 页面布局 -> 分隔符 ->下一页 上述操作即可实现分节 2.实现分节后,在每一节开头的那一页,编辑页眉 ...
- jspm
1.简介 JavaScript 模块的写法有几种,比如 AMD,CommonJS .. 还有标准化的 ES6 的写法 .. jspm 支持加载所有的用这些方法写的 JavaScript 模块 在你的应 ...
- android Application Project目录结构
src:存放java源文件 gen: 资源配置文件 Android4.0: 4.0 类库 Android Private Lib: 支持库 Android Dependencies: android ...