1.Java运行时数据区

  1. 方法区,堆线程共享。虚拟机栈,本地方法栈和程序计数器线程私有。

2.程序计数器(PC计数器)

  • 占用较小的一块内存空间,当执行Java方法时记录正在执行的虚拟机字节码指令地址,如果执行Native方法则计时器值为空。

3.Java虚拟机栈

3.1 栈帧

  • 每个方法都会在虚拟机栈中创建一个对应的栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
  • 一个方法的调用到结束就对应这一个栈帧从虚拟机栈入栈到出栈。

4.栈内存和堆内存

  • 一般我们说的栈内存和堆内存的栈就指虚拟机栈内存或者就指局部变量表,堆就是堆内存。最关心的也就是这两块。

5.本地方法栈

  • 本地方法栈和虚拟机栈作用相似,虚拟机栈为虚拟机执行java方法(字节码)服务,本地方法栈为jvm使用Native方法服务。
  1. 本地方法 关键字 native ,这些方法一般用来调用本地方法库中的方法这些方法操作底层大多用C 实现。
  2. 有的虚拟机将本地方法栈和虚拟机栈合在一起,如HotSpot。

6.java堆

  • 最大的一块内存,存放对象实例的地方。
  1. Java堆是垃圾收集器管理的主要区域,也称GC堆。
  2. Java堆物理上可不连续,逻辑上连续。
  3. 堆中没有完成实例分配,并且对也无法在扩展时抛出 OutOfMemoryError异常

7.方法区

  • 存已经被虚拟机加载的类信息(Class对象)、常量、静态变量、即时编译器JIT编译过后的代码数据。
  • jdk 1.7、1.8 对方法区做出了修改,1.8 取消了方法区。
  1. 方法区被Java虚拟机规范描述为堆的一个逻辑部分,但它不是堆,有一个别名叫非堆Non-Heap
  2. jdk1.6 及之前方法区位于永久代(PermGen),永久代和堆相互隔离。
  3. 方法区可以不需要连续的内存空间,也可以固定大小,也可以扩展,也可以不实现垃圾收集,如果实现则主要针对常量池的回收和类型的卸载。

7.4 运行时常量池

  • 在方法区,用来存放编译期生成的各种符号引用和字面量。
  • 编译期将各种符号引用和字面量放置在class文件的常量池中,解析后在运行时常量池,字符串在方法区的字符串常量池中(1.7之前),方法运行时复制到局部变量表中。1.7开始字符串常量池被移入堆中。
  • 符号引用: String ss = "asdsfg"  ss这个符号就是符号引用。解析阶段解析为直接引用
  • 字面量: 值本身 如 asdfg
  • 常量池中有各种虚拟机正常运行需要的字符串,所以有些即使不创建也还会存在于字符串常量池中如"java"。

8.直接内存

  • 并非虚拟机运行时的内存,也不再jvm规范中定义。
  • 在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

9.对象的创建

  • 普通Java对象创建,不包括数组和Class对象。
  1. 类加载 连接  类加载检查
  2. 检查通过后为对象分配内存,对象内存大小在类加载时就已经确定了。
  3. 将分配的内存初始化为0值,这一步保证了实例字段即使不赋初值也可使用。
  4. 对对象进行设置,如对象哈希码,是哪个类的实例,GC分代年龄。
  5. <init> 方法执行,对象执行初始化。

10.对象内存分布

  • 对象在内存中分为3块区域,对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。
  1. 实例数据:包括从父类继承下来的字段,并且将宽度相同的字段分配到一起。
  2. 对齐填充:HotSpot VM 的内存自动管理系统要求对象起始地址必须是8字节的整数倍,就是说对象大小必须是8字节整数倍,而对象头正好是8字节的倍数,所以实例数据不够8字节整数倍时会补齐填充。

10.1 对象头

  • 对象头分为2部分,第一部分存储对象自身运行时数据,第二部分存储类型指针。
  • 对象头作用 查看博客
  1. 自身运行时数据(Mark Word):如哈希码、GC分代年龄、锁转态标志、线程持有的锁,偏向线程ID、偏向时间戳。Mark Word是非固定的数据结构,以便存储更多信息,根据对象状态不同各个信息所占位数会变化,但总体肯定是8字节倍数。
  2. 类型指针:指向元数据(Class类数据)的指针
  3. 如果对象是数组那么对象头还有一块用于记录数组长度的区域,因为普通Java对象通过元数据可以确定大小,而数组的元数据无法确定数组大小。

11.对象定位

  • 主流的访问对象的方式有两种,通过句柄访问和直接访问,HotSpot 采用直接访问。
  1. 通过句柄访问就是在堆中有一个句柄池存放对象实例数据与类型数据各自的具体地址,栈中的引用保存句柄的地址,好处是引用保存的地址不会变比较稳定,对象改变也只改变句柄池中的地址。
  2. 直接访问就是引用直接指向对象,好处就是速度快。

12.OOM

Java 5大内存区域和对象的创建过程的更多相关文章

  1. 深入java----java内存区域及对象的创建

    看完深入理解jvm之后自己再用图的方式进行一遍梳理,用以加深理解. 第一部分,首先对整体java运行时内存区域有一个整体框架式的了解. 运行时内存区域的划分如上图所示,那么接下里看看一个对象的创建又怎 ...

  2. Java内存区域和对象的创建

    文章绝大部分内存摘抄自<深入理解Java虚拟机>,结合了小部分个人理解如果有什么错误,还望指出,如果涉及到侵权,联系博主,立马删除,再次感谢<深入理解Java虚拟机>的作者-周 ...

  3. 从Java虚拟机的内存区域、垃圾收集器及内存分配原则谈Java的内存回收机制

    一.引言: 在Java中我们只需要轻轻地new一下,就可以为实例化一个类,并分配对应的内存空间,而后似乎我们也可以不用去管它,Java自带垃圾回收器,到了对象死亡的时候垃圾回收器就会将死亡对象的内存回 ...

  4. JVM发展史和Java运行时内存区域

    目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...

  5. 1 - JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))

    java虚拟机的内存区域分配   在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时的这段空间的分 ...

  6. 理解JVM之JAVA运行时内存区域

    java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...

  7. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  8. 2 Java对象的创建过程

    JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢? 程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢? 一 对象创建的步骤 1 遇到new指令时,检查这个指令的参数是 ...

  9. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

随机推荐

  1. PokeCats开发者日志(三)

      现在是PokeCats游戏开发的第四天的晚上,明天要过周末了,所以提前写一下开发者日志吧! day4   day4主要是优化界面和增加游戏可玩性.   (1)感觉只有三只喵喵的话,玩家只需要无脑点 ...

  2. Activiti工作流(三)——流程变量

    流程变量可以是流程中一系列参数,比如办理人(Assignee),消息(message)等.这些流程变量使得activiti能够应用于更为复杂的业务中,使得流程变得更加灵活可控. 场景(一) 图一:没有 ...

  3. 【SSH】——Hibernate实现简单的自动建表

    [与ORM] Object Relational Mapping,对象关系映射,将对象和关系联系了起来.面向对象是从耦合.聚合.封装等的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论 ...

  4. ES索引

    Elasticsearch索引别名.Filtered索引别名.Template 在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景. 为了方便数据淘汰,并使得数据管理更加灵活, ...

  5. C#怎么调用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Exep ...

  6. 【题解】[WC2006]水管局长

    感觉这题好强啊……本来以为能过,结果毫无疑问的被ge了一顿……在这里记录一下做的过程,也免得以后又忘记啦. 首先,我们应看出在这张图上,要让经过的水管最长的最短,就是要维护一棵动态的最小生成树.只是删 ...

  7. 【BZOJ 4007】[JLOI2015]战争调度 DP+搜索+状压

    又是一道思路清新的小清晰. 观察题目,如果我们确定了平民或者贵族的任意一方,我们便可以贪心的求出另一方,至此20分:我们发现层数十分小,那么我们就也是状压层数,用lca转移,线性dp,至此50分(好像 ...

  8. HDU 1203 01背包

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. 复杂的json分析

    在复杂的JSON数据的格式中,往往会对JSON数据进行嵌套,这样取值会比之前的取值稍微复杂一点,但是只要思路清晰,其实取法还是一样的.就跟if else语句一样,如果if中套if,if中再套if,写的 ...

  10. bzoj Gty的超级妹子树 块状树

    Gty的超级妹子树 Time Limit: 7 Sec  Memory Limit: 32 MBSubmit: 500  Solved: 122[Submit][Status][Discuss] De ...