JVM内存管理——总结篇


内存划分及作用

  • 程序计数器

    1. 线程私有、字节码行号指示器。
    2. 执行Java方法,计数器记录的是字节码指令地址;执行本地(Native)方法时,为空。
  • 本地方法栈

    与虚拟机栈类似,为Native方法服务

  • Java虚拟机栈

    1. 每个方法执行对应一个栈帧,存储局部变量表、操作数栈、动态连接、方法出口等信息
    2. 局部变量表:存放编译期可知的基本数据类型、对象引用、返回值地址
    3. 局部变量表以局部变量槽为单位,long和double占两个槽位,其余一个
    4. 栈帧中的内存大小在编译期间已经确定
    5. 线程请求的内存大于虚拟机允许的深度,报错stackoverflowerror;栈拓展时无法申请足够内存,报错OutOfMemoryError
  • Java堆

    线程共享、唯一目的存放对象实例

    • 方法区

      存储类型信息、常量、静态变量、代码缓存等

    • 运行时常量池

      编译期生成的字面量和符号引用

  • 直接内存

    Java堆中的DirectByteBuffer对象对这块内存直接操作,避免数据在Native和Java堆中来回复制。

常见问题

  • 普通对象的创建过程

    1. 检测类是否已被加载

      当虚拟机遇到 new 指令时,首先先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就执行类加载过程。
    2. 为对象分配内存

      类加载完成以后,虚拟机就开始为对象分配内存,此时所需内存的大小就已经确定了
    3. 为分配空间初始化零值

      保证对象没有赋初始值也可以使用
    4. 其他设置

      设置对象头信息,如所属类、hashcode、gc分代年龄
    5. 执行init方法

      按程序代码分配初始值
  • Java堆为实例分配内存的方式

    选择哪种分配方式由Java堆是否规整决定的,而Java堆内存是否规整由垃圾回收器是否带有空间压缩整理能力决定的

    Serial、ParNew === > 指针碰撞

    CMS=== >空闲列表

    • 连续空间

      使用指针碰撞方式,移动被占内存和可用空间的指针来分配。多线程发生内存冲突时,利用CAS加失败重试保证分配;或者本地线程分配缓存(TLAB)方式分配内存

    • 非连续空间

      维护一张列表,记录可用空间,分配内存更新列表

  • 对象内存布局

    1. 对象头

      第一部分“Mark Word”:运行时数据,哈希码、GC分代年龄、锁状态

      第二部分:类型指针,指向类的元数据;
    2. 实例数据
    3. 对其填充(因为对象起始地址必须是8字节的整倍数)
  • 对象的两种访问定位

    栈中的reference数据引用,引用分为“句柄访问”、“直接指针访问”两种

    • 句柄访问

      堆中划分句柄池,句柄中包含对象实例数据和类型数据各自具体地址。优点:对象被移动时,只需改变句柄中实例数据指针
    • 直接访问

      直接访问对象地址。优点:少了一次开销,访问速度更快

JVM内存管理——总结篇的更多相关文章

  1. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  2. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  3. 现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)

    JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  4. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  5. JVM内存管理之垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  6. 一文洞悉JVM内存管理机制

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图: 一.为什么要学习内存管理? Java与C++之间有一堵由内存动态分配和垃圾回收机制所围成的高墙,墙 ...

  7. JVM内存管理和垃圾回收

    无论对于Java程序员还是大数据研发人员,JVM是必须掌握的技能之一.既是面试中经常问的问题,也是在实际业务中对程序进行调优.排查类似于内存溢出.栈溢出.内存泄漏等问题的关键.笔者将按下图分多篇文章详 ...

  8. JVM内存管理(二)

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

  9. JVM内存管理及垃圾回收

    一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...

随机推荐

  1. Random Point in Triangle【随机数解决期望值问题】

    Random Point in Triangle 题目链接(点击) 题目描述 Bobo has a triangle ABC with A(x1,y1),B(x2,y2)A(x1,y1),B(x2,y ...

  2. 初识Redis的数据类型HyperLogLog

    前提 未来一段时间开发的项目或者需求会大量使用到Redis,趁着这段时间业务并不太繁忙,抽点时间预习和复习Redis的相关内容.刚好看到博客下面的UV和PV统计,想到了最近看书里面提到的HyperLo ...

  3. Arduino_DH11+0.96OLED_u8glib库 温湿度显示

    u8glib_arduino_OLED0.96一.电路连接 DHT11接线方式:GND<————>GNDDATA<————>2(数字输入/输出)VCC<————>5 ...

  4. mysql主从同步失败 Relay log read failure: Could not parse relay log event entry

    mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQ ...

  5. Ehcache基础入门

    1. 基本介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要 ...

  6. 一分钟开始持续集成之旅系列之:Java + GWT

    作者:CODING - 朱增辉 前言 Google Web Toolkit(GWT)是一个开源.免费的 Web 开发框架,通过该框架,您可以使用 Java 构建复杂.高性能的 JavaScript 应 ...

  7. android studio 中jni底层日志的打印

    1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCA ...

  8. 有return的情况下try_catch_finally的执行顺序

    java异常处理之try_catch_finally 看下面的一个列子: public class TestException { int goabl=1; public TestException( ...

  9. linux中神奇的命令alias

    在linux中大家应该都知道,有些命令和参数特别繁琐,而且还是大量输入这些命令,这个时候我们就可以使用linux中的alias命令来给这些繁琐的命令起别名,但是,alias 命令只对当前终端有效,当终 ...

  10. 一种基于LQR使输出更加稳定的算法(超级实用)

    已知: 令: 则: 以上三式成立 具体步骤: 状态量最后一行加入“上一时刻的控制量”: A,B根据上述方法变形: Q,R增加维度(控制量一般都为一个,此时R维度不变): 最关键的是——输出量已经变为“ ...