深入理解JVM(一)Java内存区域
运行时数据区

程序计数器
当前线程执行的字节码的行号指示器
每条线程都有独立的程序计数器,各线程之间计数器互不影响,独立存储。
如果执行的是java方法,计数器记录正在执行的虚拟机字节码指令的位置;
如果执行的是native方法,计数器值为空(undefined)
虚拟机栈
每个方法在执行的同时会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出入口等信息。
一个方法从调用到执行完成就对应栈帧从入栈到出栈。
两种异常:
- 线程请求栈深度大于虚拟机允许的最大深度,StackOverFlowError
- 如果虚拟机允许栈动态拓展,且在拓展时无法申请到足够内存,抛出OutOfMemoryError
堆
唯一目的,存放对象实例,也称为GC堆
是GC管理的主要区域
方法区
存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
方法区是JVM的一种规范,落地可能是不同的实现
PermGen space是 JDK7及之前, HotSpot 虚拟机 对方法区的一个落地实现。在JDK8被移除。Metaspace(元空间)是 JDK8及之后, HotSpot 虚拟机 对方法区的新的实现。元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
当方法区无法满足内存分配要求,抛出OutOfMemoryError
对象初始化过程

对象的内存布局
对象在内存中存储的布局可以分为三块区域:对象头(Header),实例数据(Instance Data),对齐填充(Padding)
对象头
长度一般为32位或者64位,分为两部分信息:一部分用于存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程的ID,偏向时间戳等,称之为Mark Word。另一部分是类型指针,是对象指向他的类元数据的指针,用于确定是哪个类的实例(非必须);如果是数组还需要有一块记录数组长度的数据
实例数据
在程序代码中定义的各种类型的字段内容,无论是继承的还是自己的。
对齐填充
非必须,内存管理系统要求对象起始地址必须是8字节的整数倍,通常用于填充实例数据。
对象的访问方式
java程序通过栈上的reference数据来操作对象。常用的有两种,使用句柄和直接指针
使用句柄
java堆中划出一块用于存储句柄(句柄池),reference存储的就是句柄地址

好处是当对象被移动时只需要修改句柄中实例数据地址
使用指针
reference存储对象地址,对象存在在堆中同时需要存储到对象类型的指针和对象实例数据
好处是减少了一次指针定位的开销,Sun HotPot是以这种方式访问的

深入理解JVM(一)Java内存区域的更多相关文章
- 理解JVM之Java内存区域
Java虚拟机运行时数据区分为以下几个部分: 方法区.虚拟机栈.本地方法栈.堆.程序计数器.如下图所示: 一.程序计数器 程序计数器可看作当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改 ...
- 深入理解JVM - 1 - Java内存区域划分
作者:梦工厂链接:https://www.jianshu.com/p/7ebbe102c1ae来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Java与C++之间有一堵 ...
- 深入理解JVM(一)--Java 内存区域
一. 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: ...
- 深入理解JVM(二)Java内存区域
2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 1 ...
- JVM之Java内存区域
JVM之Java内存区域 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 一.JAVA内存区域 谈及JAVA虚拟机运行时数据区域就不得不祭出这张经典的图了: ...
- 学习jvm(一)--java内存区域
前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
- 史上最详细JVM,Java内存区域讲解
本人免费整理了Java高级资料,一共30G,需要自己领取:传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 运行时数据区域 JVM载执行Jav ...
- JVM:Java内存区域与内存溢出异常
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域依赖用户线程的启动和 ...
- 深入理解虚拟机之Java内存区域
1 概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题.正是因为 ...
随机推荐
- Java WebService学习笔记 - Axis进阶(二)
上一篇 Java WebService学习笔记 - Axis(一) 前一篇博文中简单介绍了Axis的使用方法,这篇将介绍一些Axis的一些高级特性 Axis中Handler的使用 Handler ...
- 全)Java从单体到微服务打造房产销售平台 2018年慕课网 高清视频+源码
第1章 课程介绍本章从整体上介绍课程有什么收获,以及课程如何安排,其中包括微服务的两个不同学习阶段--单体开发阶段(基于SpringBoot)和微服务改造阶段(基于SpringCloud),知识点梳理 ...
- laravel --- composer install之后,项目没有vender目录
composer install之后,项目没有vender目录 1. 原因一:PHP版本过低 PHP版本需要7.1以上,目前使用的是7.0.23
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- 基于opencv的车牌提取项目
初学图像处理,做了一个车牌提取项目,本博客仅仅是为了记录一下学习过程,该项目只具备初级功能,还有待改善 第一部分:车牌倾斜矫正 # 导入所需模块 import cv2 import math from ...
- webpack的入门实践,看这篇就够了
webpack的入门实践 我会将所有的读者概括为初学者,即使你可能有基础,学习本节之前我希望你具有一定的JavaScript和node基础 文中的 ... ...代表省略掉部分代码,和上面的代码相同 ...
- Flutter 中渐变的高级用法
Flutter 中渐变有三种: LinearGradient:线性渐变 RadialGradient:放射状渐变 SweepGradient:扇形渐变 看下原图,下面的渐变都是在此图基础上完成. Li ...
- CSS中link和@import的使用区别
我们都知道在html中引入外部的CSS 有2种方式,link标签和@import,他们又什么区别呢? 1.从属关系区别@import是 CSS 提供的语法规则,只有导入样式表的作用:link是HTML ...
- 请解释ASP. NET中的web页面与隐藏类之间的关系
请解释ASP.NET中的web页面与其隐藏类之间的关系 其实页面与其隐藏类之间就是一个部分类的关系,你在页面上放一个一个的控件就是在这个类中定义一个一个的属性, 因为是同一个类的部分类的关系,所以隐藏 ...
- 嗨,This is G-Aurora
嗨,This is G-Aurora 分享让我们得以持续 在很长一段时间里,自己都是将学习笔记整理到自己的磁盘或者网盘中.大概那个时候还对"开源与分享"不太感冒.但后来越来越觉 ...