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. ReentrantReadWriteLock源码分析及理解

    本文结构 读写锁简介:介绍读写锁.读写锁的特性以及类定义信息 公平策略及Sync同步器:介绍读写锁提供的公平策略以及同步器源码分析 读锁:介绍读锁的一些常用操作和读锁的加锁.解锁的源码分析 写锁:介绍 ...

  2. 搞清楚C语言指针

    Part 0:为什么要写这篇文章 C语言中的指针是C语言的精髓,也是C语言的重难点之一. 然而,很少有教程能把指针讲的初学者能听懂,还不会引起歧义. 本文章会尝试做到这一点,如有错误,请指出. Par ...

  3. 第一章01-正常情况下Activity的生命周期

    一.Android下能见到的界面 Window Dialog Toast Activity 二.Activity的生命周期分析 典型情况下的生命周期 ​是指在有用户参与的情况下,Activity所经过 ...

  4. 别在重复造轮子了,几个值得应用到项目中的 Java 开源库送给你

    我是风筝,公众号「古时的风筝」.文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面.公众号回复『666』获取高清大图. 风筝我作为一个野路子开发者,直到 ...

  5. 传递函数-微分方程-差分方程-Matlab阶跃响应曲线

    Transfer function: 1 ------- 5 s + 1 写成微分方程: 5y'(t)+y(t)=u(t) 向前差分: 5y(k+1)+(T-5)y(k)=Tu(k) T:Sample ...

  6. Linux 和 Vim 常用命令整理

    Sftp常用命令: lcd f:本地切换到 F盘 lpwd本地 当前目录 lls本地 文件列表 put 本地 上传文件到服务器(put输入后,回车会有弹窗,选择上传文件) get下载文件到本地 Lin ...

  7. @bzoj - 3711@ [PA2014]Druzyny

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 体育课上,n个小朋友排成一行(从1到n编号),老师想把他们分成若 ...

  8. Java—— 一点关于String的转换

    在Java学习中,恐怕我们遇到的最多的就是有关String与其他类型的转换了,我们来看一张图: 我们看到对于8种基本数据类型,除去byte和short类型没有外,其他的都有,值得注意的是可以把char ...

  9. SQL Beautifier & SQL2014自带的格式化工具

    格式化工具(希望有几款集成在IDE中的格式化工具)为什么要说明这些,不是为说明这个工具而发,看到那几千行或集成在一起的存储过程觉得乱七八的不爽,后面将会强力训练下自己. --下面这款SQL Beaut ...

  10. [每日一题2020.06.15]P1226 【模板】快速幂取余运算

    我是题目 快速幂就是快速求 \(a^b\)的一种算法 快速幂 思想 : 比如我要求 \(6^9\) 首先将幂转化为二进制形式 : \[6^9 = 6^{1001} \tag{1} \] 可以得到 : ...