JVM内存管理——总结篇
JVM内存管理——总结篇
内存划分及作用
程序计数器
- 线程私有、字节码行号指示器。
- 执行Java方法,计数器记录的是字节码指令地址;执行本地(Native)方法时,为空。
本地方法栈
与虚拟机栈类似,为Native方法服务Java虚拟机栈
- 每个方法执行对应一个栈帧,存储局部变量表、操作数栈、动态连接、方法出口等信息
- 局部变量表:存放编译期可知的基本数据类型、对象引用、返回值地址
- 局部变量表以局部变量槽为单位,long和double占两个槽位,其余一个
- 栈帧中的内存大小在编译期间已经确定
- 线程请求的内存大于虚拟机允许的深度,报错stackoverflowerror;栈拓展时无法申请足够内存,报错OutOfMemoryError
Java堆
线程共享、唯一目的存放对象实例
方法区
存储类型信息、常量、静态变量、代码缓存等运行时常量池
编译期生成的字面量和符号引用
直接内存
Java堆中的DirectByteBuffer对象对这块内存直接操作,避免数据在Native和Java堆中来回复制。
常见问题
普通对象的创建过程
- 检测类是否已被加载
当虚拟机遇到 new 指令时,首先先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就执行类加载过程。 - 为对象分配内存
类加载完成以后,虚拟机就开始为对象分配内存,此时所需内存的大小就已经确定了 - 为分配空间初始化零值
保证对象没有赋初始值也可以使用 - 其他设置
设置对象头信息,如所属类、hashcode、gc分代年龄 - 执行init方法
按程序代码分配初始值
- 检测类是否已被加载
Java堆为实例分配内存的方式
选择哪种分配方式由Java堆是否规整决定的,而Java堆内存是否规整由垃圾回收器是否带有空间压缩整理能力决定的
Serial、ParNew === > 指针碰撞
CMS=== >空闲列表连续空间
使用指针碰撞方式,移动被占内存和可用空间的指针来分配。多线程发生内存冲突时,利用CAS加失败重试保证分配;或者本地线程分配缓存(TLAB)方式分配内存非连续空间
维护一张列表,记录可用空间,分配内存更新列表
对象内存布局
- 对象头
第一部分“Mark Word”:运行时数据,哈希码、GC分代年龄、锁状态
第二部分:类型指针,指向类的元数据; - 实例数据
- 对其填充(因为对象起始地址必须是8字节的整倍数)
- 对象头
对象的两种访问定位
栈中的reference数据引用,引用分为“句柄访问”、“直接指针访问”两种
- 句柄访问
堆中划分句柄池,句柄中包含对象实例数据和类型数据各自具体地址。优点:对象被移动时,只需改变句柄中实例数据指针 - 直接访问
直接访问对象地址。优点:少了一次开销,访问速度更快
- 句柄访问
JVM内存管理——总结篇的更多相关文章
- JVM内存管理------垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- 现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)
JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- JVM内存管理及垃圾回收【转】
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理之垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
- 一文洞悉JVM内存管理机制
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图: 一.为什么要学习内存管理? Java与C++之间有一堵由内存动态分配和垃圾回收机制所围成的高墙,墙 ...
- JVM内存管理和垃圾回收
无论对于Java程序员还是大数据研发人员,JVM是必须掌握的技能之一.既是面试中经常问的问题,也是在实际业务中对程序进行调优.排查类似于内存溢出.栈溢出.内存泄漏等问题的关键.笔者将按下图分多篇文章详 ...
- JVM内存管理(二)
JVM内存管理 JVM在执行java程序的过程中,会把内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖 ...
- JVM内存管理及垃圾回收
一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...
随机推荐
- python IDE pycharm的安装与使用
Python开发最牛逼的IDE——pycharm (其实其它的工具,例如eclipse也可以写,只不过比较麻烦,需要安装很多的插件,所以说pycharm是最牛逼的) pycharm,下载专业版的,不要 ...
- ASP.NET Core Blazor WebAssembly实现一个简单的TODO List
基于blazor实现的一个简单的TODO List 最近看到一些大佬都开始关注blazor,我也想学习一下.做了一个小的demo,todolist,仅是一个小示例,参考此vue项目的实现http:// ...
- intput子系统
1.按键驱动程序的第一个版本:day07/04 //内核模块的基本要求 init.h module.h LICENSE struct cdev btn_cdev; b ...
- [博主推荐]如何利用注册 的 bug 来疯狂注册,不停开小号"做"事情,支持 手机号&邮箱
[博主推荐]如何利用注册 的 bug 来疯狂注册,不停开小号"做"事情,支持 手机号&邮箱 非常简单 1.手机号注册: 用手机号注册 网站基本都支持 可以用推荐的网址: ...
- 安装 zabbix
目标在centos8下安装部署zabbix 4.4 zabbix介绍zabbix由2部分构成,zabbix server与可选组件zabbix agent.zabbix server可以通过SNMP, ...
- pip应用实例
homepage 目录 1. 安装 1.1. 指定版本 1.2. 用户权限 1.3. 读取requirments.txt 1.4. 不使用缓存文件 1.5. 指定extras_require 2. 镜 ...
- TensorFlow从0到1之矩阵基本操作及其实现(7)
矩阵运算,例如执行乘法.加法和减法,是任何神经网络中信号传播的重要操作.通常在计算中需要随机矩阵.零矩阵.一矩阵或者单位矩阵. 本节将告诉你如何获得不同类型的矩阵,以及如何对它们进行不同的矩阵处理操作 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- android异步任务asyncTask详细分析
android中的耗时操作需要放在子线程中去执行 asynctask是对Handler和和线程池的封装,直接使用比THread效率更加的高效因为封装了线程池,比我们每次直接new Thread效率更高 ...
- MySql索引要注意的8个事情
设计好MySql索引可以让你的数据库查询效率大为提高.设计MySql索引的时候,有一些问题需要值得我们注意的: 1,创建MySql索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简 ...