Java内存管理

本文主要介绍Java虚拟机运行时的内存区域是如何划分的、Java对象的创建过程、Java对象的内存布局、Java对象的访问定位

一:运行时区域划分

主要可以分为以下 几个:

  程序计数器;

  栈(虚拟机栈和本地方法栈);

  堆;

  方法区;

1.程序计数器

  记录正在执行的虚拟机字节码指令的地址.唯一一个没有规定任何OutOfMemoryError的区域。

2.栈

  栈主要用来存储局部变量表(各种局部变量(方法中的变量),基本类型和对象引用类型)、操作数栈、动态链接等信息。线程私有的。所以方法中的变量不是线程共享数据。

  虚拟机栈和本地方法栈比较相似,他们的区别是虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机使用到的native方法服务。

3.堆

  堆是Java虚拟机管理的内存最大的一块。虚拟机启动时创建,用于存放所有的对象实例以及数组。各个线程共享,所以,对象数据是共享数据。

4.方法区

  各个线程共享区域。存储已被虚拟机加载的类信息、常量、静态变量等。这些数据都是共享数据

二:对象创建

类加载->分配内存->初始化为0->设置-><init>

类加载:第七章

内存分配:指针碰撞和空闲列表

  指针碰撞:当堆中内存是绝对规整的,用此方法。此内存可以看做两部分,一边是使用过的内存,另一边是空闲的内存,中间用一个指针隔开。分配内存时,只需将指针向空闲内存那边移动一段与对象大小相等的距离即可。

  空闲列表:当堆中内存不是规整时用此方法。虚拟机必须维护一个列表,该表记录了哪些内存块是可用的,在分配的时候找到一块足够大的区域分配,并更新表上的记录即可。

设置:对象头的信息进行设置。

<init>:按照程序员的意愿进行初始化。

三:对象的内存布局

对象的内存布局可以分为三块区域:对象头、实例数据和对齐填充。

对象头:主要包含两部分信息:1,用于存储对象自身运行时数据,如哈希码、GC分代年龄、线程持有的锁、锁状态标志等;2,类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;3,如果对象是数组,对象头还要有数组长度。

实例数据:对象真正存储的有效信息,代码中定义的各种字段,包括父类的。

对齐填充:充当占位符。对象的大小必须是8字节的整数倍,对象头正好是8字节的整数倍。

四:对象的访问定位

Java程序需要通过栈上的对象引用数据来操作堆上的具体对象。有两种访问方式:使用句柄和直接指针。

使用句柄:在Java堆中划分一个区域来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和对象类型数据(类数据)的地址信息。如图:

直接指针访问:reference中存储的直接就是对象的地址,而堆对象中就必须考虑 如何访问类型数据的相关信息.

《深入理解java虚拟机》读书笔记1--java内存区域的更多相关文章

  1. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  2. 深入Java虚拟机读书笔记第五章Java虚拟机

    Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...

  3. 【Todo】深入理解Java虚拟机 读书笔记

    有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...

  4. 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎

    五 虚拟机字节码执行引擎   1 运行时栈帧结构     ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素.     ---栈帧中存储了方法的局部变 ...

  5. 深入理解Java虚拟机读书笔记8----Java内存模型与线程

    八 Java内存模型与线程   1 Java内存模型     ---主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.     ---此处的变量和J ...

  6. 深入理解Java虚拟机读书笔记7----晚期(运行期)优化

    七 晚期(运行期)优化 1 即时编译器(JIT编译器)     ---当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,包括被多次调用的方法和被多次执行的循环体.     ...

  7. 深入理解Java虚拟机读书笔记4----虚拟机类加载机制

    四 虚拟机类加载机制 1 类加载机制     ---概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型.     -- ...

  8. 深入理解Java虚拟机读书笔记3----类文件结构

    三 类文件结构 1 Java虚拟机的两种中立特性     · 平台无关性     · 语言无关性     实现平台无关性和语言无关性的基础是虚拟机和字节码存储格式(Class文件).   2 Clas ...

  9. 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象

    一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE?     Java技术体系包括:         · Java程序设计语言:         · 各种硬件平台上的 ...

  10. 深入理解java虚拟机读书笔记--java内存区域和管理

    第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...

随机推荐

  1. Android开发学习之路--Broadcast Receiver之初体验

    学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyB ...

  2. Android的ScrollView和HorizontalScrollView-android学习之旅(四十一)

    HorizontalScrollView和ScrollView简介 ScrollView和HorizontalScrollView都继承于FrameLayout组件,两个都是容器,前者为里面的组件添加 ...

  3. SIMPLE_DEV_PM_OPS宏

    SYSTEM_SLEEP_PM_OPS和dev_pm_ops的定义: [cpp] view plain copy #define SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, ...

  4. 15个易遗忘的java知识点

    1.java中的基本数据类型以及所占内存大小 (1)整形  byte 1字节  short 2字节  int 4字节  long 8字节  (2)浮点型  float 4字节  double 8字节  ...

  5. Socket层实现系列 — 信号驱动的异步等待

    主要内容:Socket的异步通知机制. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件.有数据可读事 ...

  6. python“# -*- coding: UTF-8 -*-”

    python跑一趟红 python脚本文件中,python编译器是使用ascii码来解释脚本内容.如果.py源文件中包含中文,会报错(注释也报错).所以文件开头加上"# -*- coding ...

  7. Linux Shell -- 无网不利

    这篇文章中我介绍几个非常实用的和网络相关的命令 一.ifconfig 这个命令在Windows下被"翻译为ipconfig",它用于显示网络接口,子网掩码等详细信息. 注:在每个系 ...

  8. (十五)UITableViewCell的常见属性

    UItableViewCellStyle: typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault ...

  9. mysql进阶(八)怎么对varchar类型排序问题

    MySQL中怎么对varchar类型排序问题 asc 升级 desc降序 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同 ...

  10. Android表格布局(Table Layout)

    Android表格布局(Table Layout) 先来看布局管理器之间继承关系图: 图1 可知TableLayout继承了LinearLayout,所以表格布局本质上依然是线性管理器. 表格布局采用 ...