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 ...
 
随机推荐
- Redis学习笔记(十七) 集群(上)
			
Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作. 一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含 ...
 - mysql8.0 Mac下的安装
			
一.下载及安装 首先去官网下载mac对应版本的Mysql,尾缀为.dmg的程序包 下载地址:https://dev.mysql.com/downloads/mysql/ 二.启动 在 Setting ...
 - v-on 缩写
			
<!-- 完整语法 --> <a v-on:click="doSomething"></a> <!-- 缩写 --> <a @ ...
 - Seafile的配置
			
如果部署在apache或nginx后面,就是访问默认80或443.反向代理会帮你转到8000和8082上. 我使用443,我在路由器上设定了转发,比如 对外网12323这个端口会转到内网地址443上 ...
 - 3dTiles 数据规范详解[1] 介绍
			
版权:转载请带原地址.https://www.cnblogs.com/onsummer/p/12799366.html @秋意正寒 Web中的三维 html5和webgl技术使得浏览器三维变成了可能. ...
 - 2019-02-15  CSS样式学习——(内容来自mooc北京林业大学web前端开发授课ppt)
			
CSS样式的添加方法 行内样式 e.x. 内嵌样式 e.x. 注意内嵌样式写在head标签内: 单独文件(外部式样式表文件) 也是在head标签内插入超链接,sublime+emmet可以用link: ...
 - TensorFlow从0到1之TensorFlow Keras及其用法(25)
			
Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,你可以编译和拟合模型.之后,它可以用于预测.变量声明.占位 ...
 - Numpy中的广播机制,数组的广播机制(Broadcasting)
			
这篇文章把numpy中的广播机制讲的十分透彻: https://jakevdp.github.io/PythonDataScienceHandbook/02.05-computation-on-arr ...
 - rest_framework  django 简单使用(数据库创建数据, 覆盖数据, 其他的大同小异)
			
事先说几个坑:数据库定义字段时候,不要定义name 要定义 username 首先, 定义model(简单定义) from django.db import models from django.co ...
 - android面试详解
			
前台就是和用户交互的进程 可见进程例如一个activity被一个透明的对话框覆盖,该activity就是可见进程 服务:service进程 后台一个activity按了home按键就是从前台退回到后台 ...