JVM——8.内存分配方式

2023-09-19 00:06:31

这篇文章我们来讲一下jvm的内存分配方式

目录

1.概述

1.1jvm运行时数据区

1.2堆空间的分代

1.3对象分配的整体流程

2.具体的内存分配方式

2.1指针碰撞法

2.2空闲列表法

2.3Java虚拟机选择策略

3.小结

1.概述

我们前面在GC那篇文章中写了JVM的内存分配策略,讲述了对象优先在Eden区进行分配等等几条策略,而这里又写JVM的内存分配方式,二者有什么区别吗?

区别就是:内存分配策略只是说我们应该怎么分配,相当于在分配应该遵循哪些准则;而本篇所写的内存分配方式则是讲对象在内存中具体怎么分配的,相当于是分配算法。相当于一个是战略一个是战术,一个是值方向,一个是教你怎么做。这就是二者的区别。

1.1jvm运行时数据区

jvm在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域:

其中方法区和堆是所有线程共享的数据区。程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区

虚拟机栈和本地方法栈中的空间会随着方法的调用和完成而不断分配和释放。应用中创建的对象则会被分配到堆中,当对象不在使用的时候会被回收。

1.2堆空间的分代

下面看一下堆空间的分代:

1.3对象分配的整体流程

2.具体的内存分配方式

当使用new关键字创建一个类的对象时,虚拟机需要为新生对象分配内存空间,而对象的大小在类加载完成后已经确定了,所以分配内存只需要在Java堆中划分出一块大小相等的内存。在Java虚拟机中有指针碰撞和空闲列表两种方式分配内存。

2.1指针碰撞法

如果Java堆中内存是规整排列的,所有被用过的内存放一边,空闲的可用内存放一边,中间放置一个指针作为它们的分界点,在需要为新生对象分配内存的时候,只要将指针向空闲内存那边挪动一段与对象大小相等的距离即可分配。

2.2空闲列表法

如果Java堆中内存不是规整排列的,用过的内存和可用内存是相互交错的,这种情况下将不能使用指针碰撞方式分配内存,Java虚拟机需要维护一个列表用于记录哪些内存是可用的,在为新生对象分配内存的时候,在列表中寻找一块足够大的内存分配,并更新列表上的记录。

2.3Java虚拟机选择策略

Java虚拟机采用哪种方式为新生对象分配内存,取决于所使用的垃圾收集器,当垃圾收集器具有整理过程时,虚拟机将采用指针碰撞的方式;当垃圾收集器的回收过程没有整理过程时,则采用空闲列表方式。

3.小结

通过这篇文章,我们能够更加清楚的知道对象在堆中是如何分配的了,那两种具体的分配方式要掌握。

更多推荐

http-server的安装、前端使用http-server启本地服务

http-server简介http-server是一个简单的零配置的命令行http服务器,它足够强大便于生产和使用,用于本地测试和开发。有时候我们打开一个文档使用file协议打开的时候,不能发送ajax请求,只能使用http协议才能请求资源,具体的区别大家可以去参考[这篇文档](www.cnblogs.com/lish

Vue中的侦听器 Watch

侦听器Watch:::warning注意阅读本章内容之前必须先了解什么是计算属性Computed。相比计算属性,计算属性更适合用来做一些数据加工、过滤等处理。而侦听器更适合用来监听一个数据是否发生变化(包含data、props、computed),如果发生变化则触发特定的函数操作。定义Watch侦听器函数时,请不要使用

堆的实现(C版)

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。1.堆的概念及结构堆的性质:堆中某个节点的

深度学习——线性神经网络一

深度学习——线性神经网络一文章目录前言一、线性回归1.1.线性回归的基本元素1.1.1.线性模型1.1.2.损失函数1.1.3.解析解1.1.4.随机梯度下降1.1.5.用模型进行预测1.2.向量化加速1.3.正态分布与平方损失1.4.从线性回归到深度网络二、线性回归的从零开始实现2.1.生成数据集2.2.读取数据集2

快速学会搭建微信小程序的基础架构

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)目录基础架构构建界面引入uni-ui组件库组件自动引入配置TS类型状态管理持久化数据交互请求工具请求和上传文件拦截器封装Promise请求函数请求成功提取数据和设置类型获取数据失败基础架构前言:这两天在学习小兔鲜儿微信小程序项目,

10分钟设置免费海外远程桌面

前言本教程将向您介绍如何使用AmazonLightsail服务的免费套餐轻松搭建属于您的远程桌面。依托于Amazon全球可用区,您可以在世界各地搭建符合您配置需求的远程桌面。本教程需要先拥有亚马逊云科技海外账户。现在注册亚马逊云科技账户可以享受12个月免费套餐,包括EC2等多种热门产品。亚马逊云科技开发者社区为开发者们

什么是硬编码

2023年9月21日,周四下午昨天在某个地方看到了“硬编码”,当时不明白是什么意思,于是今天就研究了一下目录硬编码定义缺点举例说明什么是硬编码1.直接在代码中写入文件路径:2.在代码中直接指定常量值:3.将固定的字符串直接嵌入到代码中:正确的做法1.使用配置文件:2.使用环境变量:3.使用命令行参数:4.使用配置管理工

五、核支持向量机算法(NuSVC,Nu-Support Vector Classification)(有监督学习)

和支持向量分类(Nu-SupportVectorClassification),与SVC类似,但使用一个参数来控制支持向量的数量,其实现基于libsvm一、算法思路本质都是SVM中的一种优化,原理都类似,详细算法思路可以参考博文:三、支持向量机算法(SVC,SupportVectorClassification)(有监

Shell脚本之awk的用法

Shell脚本之awk的用法所有参数参数常见用法所有参数参数基本格式:awk‘pattern{action}’file-fprogram:使用程序文件program中的AWK脚本来处理输入数据。-Ffs:设置输入字段分隔符为fs。默认情况下,AWK使用空格或制表符作为字段分隔符。-vvar=val:在处理输入数据之前,

MySQL数据库入门到精通2--基础篇(函数,约束,多表查询,事务)

3.函数函数是指一段可以直接被另一段程序调用的程序或代码。MySQL中的函数主要分为以下四类:字符串函数、数值函数、日期函数、流程函数。3.1字符串函数MySQL中内置了很多字符串函数,常用的几个如下:演示如下:A.concat:字符串拼接selectconcat('Hello','MySQL');B.lower:全部

Java根据模版导出(ftl方式)

实际项目中经常遇到需要根据模版导出数据,普通一点的导出模版都挺好实现的,如果涉及到勾选框、表格循环的方式就比较麻烦一点,这篇文章主要记录一下我在项目中是如何导出word(其中包括根据值勾选、表格循环、图片)一、先准备一份word模版如图:此模版主要是表格内容是多个,性别这先勾选一个,主要是方便后面知道勾选是什么样式,因

热文推荐