运行时数据区

  • 程序计数器

    当前线程执行的字节码的行号指示器

    每条线程都有独立的程序计数器,各线程之间计数器互不影响,独立存储。

    如果执行的是java方法,计数器记录正在执行的虚拟机字节码指令的位置;

    如果执行的是native方法,计数器值为空(undefined)

  • 虚拟机栈

    每个方法在执行的同时会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出入口等信息。

    一个方法从调用到执行完成就对应栈帧从入栈到出栈。

    两种异常:

    1. 线程请求栈深度大于虚拟机允许的最大深度,StackOverFlowError
    2. 如果虚拟机允许栈动态拓展,且在拓展时无法申请到足够内存,抛出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内存区域的更多相关文章

  1. 理解JVM之Java内存区域

    Java虚拟机运行时数据区分为以下几个部分: 方法区.虚拟机栈.本地方法栈.堆.程序计数器.如下图所示: 一.程序计数器 程序计数器可看作当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改 ...

  2. 深入理解JVM - 1 - Java内存区域划分

    作者:梦工厂链接:https://www.jianshu.com/p/7ebbe102c1ae来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Java与C++之间有一堵 ...

  3. 深入理解JVM(一)--Java 内存区域

    一.  运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域:               ...

  4. 深入理解JVM(二)Java内存区域

    2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 1 ...

  5. JVM之Java内存区域

    JVM之Java内存区域 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 一.JAVA内存区域 谈及JAVA虚拟机运行时数据区域就不得不祭出这张经典的图了: ...

  6. 学习jvm(一)--java内存区域

    前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...

  7. 深入理解JVM(6)——Java内存模型和线程

    Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...

  8. 史上最详细JVM,Java内存区域讲解

    本人免费整理了Java高级资料,一共30G,需要自己领取:传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 运行时数据区域 JVM载执行Jav ...

  9. JVM:Java内存区域与内存溢出异常

    Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域依赖用户线程的启动和 ...

  10. 深入理解虚拟机之Java内存区域

    1 概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题.正是因为 ...

随机推荐

  1. twaver html5 如何设置节点不可拖动

    解决思路: 1.创建一个不可移动的图层  :  layer 2.设置不可拖动的节点node 的图层为 layer 见代码: var box = new twaver.ElementBox(); var ...

  2. SMB扫描-Server Message Block 协议、nmap

    版本 操作系统 SMB1 Windows 200.xp.2003 SMB2 Windows Vista SP1.2008 SMB2.1 Windows 7/2008 R2 SMB3 Windows 8 ...

  3. python的一些基础知识

    一.函数介绍 二.模块与包 三.面向对象介绍 四.网络编程基础应用了解 五.基于MySQL对数据库的理解及基础操作 六.粗浅学习的前端知识整理

  4. maven跳过测试打包

    1.在执行run as时候加上参数: clean install compile -Dmaven.test.skip=true   2.在pom文件中添加如下: <plugins> < ...

  5. day17—max, map, reduce, filter, zip 函数的使用

    一.max 函数 l=[3,2,100,999,213,1111,31121,333] print(max(l)) # dic={'k1':10,'k2':100,'k3':30} print(max ...

  6. .NET Core控制台利用【Options】读取Json配置文件

    创建一个 .NET Core控制台程序 添加依赖 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.FileE ...

  7. 集群搭建完成简要测试集群(性能)带宽与IOPS

    集群搭建好之后网络,raid卡策略,磁盘都会影响集群的性能.为了避免因上述问题使得集群的性能受到影响,我们依次进行测试,最后得到基本的集群性能. 网络 首先是网络,ceph集群一大堆让人摸不着头脑的问 ...

  8. Write a program to copy its input to its output, replacing each tab by \t, each backspace by \b, and each backslash by \\. This makes tabs and backspa

    #include <stdio.h> #define DBS '\\' void main() { int c; while((c=getchar())!=EOF) { if(c=='\t ...

  9. 利用FlubuCore用C#来写持续集成和持续部署脚本

    前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战. ...

  10. Vue 项目推荐,Github 过万 Star

    电鸭社区-远程工作-自由职业-兼职外包-自由从这开始 嗨,我是 Martin,也叫老王.不少小伙伴,说自己是转行.自学,没有项目,今天推荐一个 Vue 实战项目 还记得 Martin 仿写过在线 Ma ...