Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现内存堆?

如何实现内存堆?

提问于 2018-03-13 19:42:40
回答 2关注 0查看 253

问题如下:

程序员在程序开始时分配大量连续内存,在必要时处理它。这与每次需要内存时简单地进入操作系统形成对比。这样做会更快,因为它可以避免不断向操作系统请求连续内存块的成本。

JVM这样做可以维护它自己的内存部分,然后从中分配对象。

问题是如何实际执行这个步骤?

回答 2

等待你的阿公

回答已采纳

发布于 2018-03-14 04:21:20

大多数C和C++编译器已经提供了堆内存管理器作为标准库的一部分,因此您根本不需要做任何事情来避免每次请求都访问操作系统。

如果你想要提高性能,你可以简单地连接和断开周围的大量可以改进的分配器。

如果你想编写自己的堆管理器作为学习练习,下面是它需要做的基本工作:

  • 从操作系统请求一个大内存块
  • 保持自由块的链接列表
  • 当分配请求传入时:
    • 搜索列表中的块,该块足够大,足以满足所请求的大小,另外还有一些存储在旁边的记账变量。
    • 将块中足够大的块分割成当前的请求,将其余部分放回空闲列表中。
    • 如果没有足够大的块,请返回到操作系统,并要求另一个大块
  • 当取消分配请求传入时
    • 读取标题以找出大小
    • 将新释放的块添加到空闲列表中
    • 或者,查看下面的内存是否也列在空闲列表中,并将两个相邻的块合并成一个更大的块(称为合并堆)。

红月

发布于 2018-03-14 05:29:59

在程序开始时,你已经分配了足够大的内存块,以满足其需求。然后,你必须重新加载new和/或malloc、DELETE和/或free,以便从/或向此缓冲区返回内存。

在实现这种解决方案时,需要编写自己的分配器(从块源),并且可能最终使用多个分配器,这通常是首先分配内存池的原因。

默认内存分配器是一个很好的全局分配程序,但并不是所有分配需求的最佳选择。例如,如果知道将为特定大小分配大量对象,则可以定义一个分配程序,它分配固定大小的缓冲区,并预先分配多个对象以获得一定的效率。

和开发者交流更多问题细节吧,去 写回答
相关文章
Java 堆内内存与堆外内存
一般情况下,Java 中分配的非空对象都是由 Java 虚拟机的垃圾收集器管理的,也称为堆内内存(on-heap memory)。虚拟机会定期对垃圾内存进行回收,在某些特定的时间点,它会进行一次彻底的回收(full gc)。彻底回收时,垃圾收集器会对所有分配的堆内内存进行完整的扫描,这意味着一个重要的事实——这样一次垃圾收集对 Java 应用造成的影响,跟堆的大小是成正比的。过大的堆会影响 Java 应用的性能。
smartsi
2019/08/07
4.5K0
什么是堆内内存和堆外内存?
JVM 可以使用的内存分外 2 种:堆内存和堆外内存,这篇文章主要介绍堆外内存的使用示例
架构狂人
2023/08/16
5610
什么是堆内内存和堆外内存?
堆内存和栈内存
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
用户2909867
2018/08/22
1.3K0
如何监控和诊断JVM堆内和堆外内存使用?
可以使用综合性的图形化工具,如JConsole、 VisualVM(注意,从Oracle JDK 9开始, VisualVM已经不再包含在JDK安装包中)等。这些工具具体使用起来相对比较直观,直接连接到Java进程,然后就可以在图形化界面里掌握内存使用情况。 以JConsole为例,其内存页面可以显示常见的堆内存和各种堆外部分使用状态。
葆宁
2019/04/18
2.1K0
如何监控和诊断JVM堆内和堆外内存使用?
如何监控和诊断堆外内存使用
JVM 还有个 Thread Local Allocation Buffer (TLAB)的概念。JVM 为每个线程分配一个私有的缓存区域,多个线程分配内存时,为避免操作同一个地址,会需要使用加锁机制,进而影响分配速度。TLAB 分配仍然在堆上,是分配在Eden 区域内的。
王小明_HIT
2020/09/24
2.3K0
如何监控和诊断堆外内存使用
如何查看JVM运行的堆内存情况
《不可不知的7个JDK命令》介绍了些jdk自带的问题排查工具,机器出现CPU飙升的情况,此时就可以借助工具,排查应用端是否存在一些潜在问题。
bisal
2020/07/24
5K0
如何查看JVM运行的堆内存情况
【JAVA】如何监控和诊断JVM堆内和堆外内存使用?
在上一篇博文:【JAVA】JVM 内存区域的划分 中介绍了 JVM 内存区域的划分,总结了相关的一些概念,本博文将结合 JVM 参数、工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分。
sidiot
2023/08/31
2.2K0
【JAVA】如何监控和诊断JVM堆内和堆外内存使用?
C 堆内存管理
在Win32 程序中每个进程都占有4GB的虚拟地址空间,这4G的地址空间内部又被分为代码段,全局变量段堆段和栈段,栈内存由函数使用,用来存储函数内部的局部变量,而堆是由程序员自己申请与释放的,系统在管理堆内存的时候采用的双向链表的方式,接下来将通过调试代码来分析堆内存的管理。
Masimaro
2018/10/11
7680
C 堆内存管理
Java 堆内存简介
Java 堆 是虚拟机管理的最大的一块内存。是被所有线程所共享的一块内存区域,在虚拟机启动时创建。
潇洒
2023/10/20
1570
java堆内存详解
参考文献: http://www.importnew.com/14630.html Java 堆内存 http://blog.csdn.net/ylyg050518/article/details/52244994 Java虚拟机(二)——Java堆内存划分
用户7798898
2020/09/27
5730
java堆内存详解
Java堆内存设置
Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。
码客说
2020/05/09
3.3K0
使用堆外内存
有时候对内存进行大对象的读写,会引起 JVM 长时间的停顿,有时候则是希望最大程度地提高 JVM 的效率,我们需要自己来管理内存(看起来很像是 Java 像 C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的 EhCache(给它包装了个酷一点的名字,叫 BigMemory),以及现在项目中的 Memcached。在 nio 以前,是没有光明正大的做法的,有一个 work around 的办法是直接访问 Unsafe 类。如果你使用 Eclipse,默认是不允许访问 sun.misc 下面的类的,你需要稍微修改一下,给 Type Access Rules 里面添加一条所有类都可以访问的规则:
四火
2022/07/15
7240
使用堆外内存
Windows 堆内存管理
Windows 堆内存是性能仅次于虚拟内存的内存管理机制。它不像虚拟内存,每次分配至少是一个页面(4K),它可以灵活的只分配 1 个字节来使用,不浪费内存的空间。但你分配的内存必须由自己维护释放。下面演示了堆内存的使用方法。
我与梦想有个约会
2023/10/21
3130
Windows 堆内存管理
栈内存与堆内存的区别
要想学会一个东西很简单,要想明白它再加透彻,我们就需要透过现象看本质了,今天来总结下什么是栈内存与对内存,在了解这个问题之前,我们先来对js的数据类型做个划分:
Snine
2022/02/11
1.3K0
栈内存与堆内存的区别
Java 内存模型之堆内存(Heap)
1、什么是 Perm Gen? Perm Gen : Permanent Generation  Perm Gen 区是一个特殊的JVM内存区,因为它用来存储用来描述 Class 的  元数据(Class 可以不属于Java语言的一部分,也可以属于),诸如:描述类及其方法。  在大的应用中该区一会儿就满了,并抛出错误:java.lang.OutOfMemoryError: PermGen  然而无论你怎么设置 -Xmx 也不管用。  因为设置其大小的参数不是 -Xmx,而是 -XX:PermGen, -XX:MaxPermGen (不同Java版本略有变化)  2、Heap VS. Stack VS. Perm Heap(堆内存):  使用Java语言创建的所有的引用对象类型,都在此存储。并由 GC (Garbage Collection)对其进行管理,  诸如:释放不再被程序引用的对象所占据的内存。  Stack(栈内存):  与 Heap 相对的是,Stack 存放基础数据类型。诸如:int, char 等。  由程序的执行顺序控制变量的进出栈顺序,而不是由 GC 控制栈内存的管理。  Perm(持久内存):  用于存储类的元数据。诸如:类的定义,方法的定义等。  Perm 的生命周期与 JVM 绑定,而 Heap 的生命周期与程序绑定。  二、堆内存(Heap) 与 Garbage Collection 理解 GC (Garbage Collection),需要理解 Heap 。  JVM 的 Heap 堆内存在物理上被划分为两部分:Young Gen, Old Gen  1、 JVM 内存管理之:Young Gen 所有新创建的 Object 首先被放在 Young Generation 内存区。  如果 Young Generation 内存区满了,则执行 Garbage Collection 。这种 GC 称为 Minor GC。  Young Generation 区又分为三部分: Eden Memory,Survivor0 Memory (S0),Survivor1 Memory(S1).  Young Generation 内存区要点:  1、绝大多数新建的 Object 被放在 Eden Memory  2、如果 Eden Memory 内存满了,则进行 GC 操作。     同时把未被 GC 的 Object 移动到 S0 或 S1 中。     此时 Minor GC 也会检查和移动 S0 和 S1 中的对象。     最后使 S0,S1 其中一个置为空。  3、多次 GC 后仍然未被 GC 的 Object 将被移动到 Old Gen 内存区中。     通常 Object 会被 GC 设定一个轮询的阀值。  2、 JVM 内存管理之:Old Gen Old Gen 内存区存放了经过多次 Minor GC 后仍然不能被 GC 的 Object。  与 Young Gen 相同,当 Old Gen 区满了之后将执行 GC 操作,该操作称为:Major GC。  耗用的时间也相对较长。  stop-the-world 事件  Young Gen 和 Old Gen 都可以主动触发 stop-the-world 事件,挂起所有任务,执行 GC 操作。  被挂起的任务只有在 GC 执行完毕后,才会恢复执行。  多数情况下, GC 性能调优(GC tuning)就是指降低 stop-the-world 时 GC 执行的时间。  三、Perm Gen  JVM 在 Permanent Generation 或 Perm Gen 内存区中存放应用程序的元数据  (application metadata),用来描述类及其方法的原始信息。  注意:Perm Gen 不是 Heap 的一部分。  Perm Gen 被 JVM 使用于应用程序运行期间(runtime),基于应用所使用到的类。  Perm Gen 中同时包括 Java SE 包中的类。  Perm Gen 只有在执行 Full GC 时才会被 GC。  四、内存管理调优参数 -Xms  设置JVM启动时的堆内存(Heap)的大小  -Xmx For setting the maximum heap size.  设置堆内存(Heap)的最大值  -Xmn  设置 Young Gen 内存区的大小  -XX:PermGen  设置 Perm Gen 内存的初始大小  -XX:MaxPermGen  设置 Perm Gen 内存的最大值  -XX:SurvivorRatio  设置 Eden Gen 与 S0 Gen,S1 Gen 内存的大小比。默认值:8  例如:  Yo
凯哥Java
2022/12/15
5400
Java 内存模型之堆内存(Heap)
堆,栈,内存泄露,内存溢出介绍
简单的可以理解为: heap(堆):是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack(栈):是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS 。注意它与数据结构中的堆
前朝楚水
2018/04/02
3.9K0
Apache Spark 内存管理(堆内/堆外)详解
本文旨在梳理出Spark内存管理的脉络,抛砖引玉,引出读者对这个话题的深入探讨。本文中阐述的原理基于Spark 2.1版本,阅读本文需要读者有一定的Spark和Java基础,了解RDD、Shuffle、JVM等相关概念。
Spark学习技巧
2022/01/13
1.8K0
Apache Spark 内存管理(堆内/堆外)详解
JVM--堆内存结构
该结构体为4个int型变量,一个30大小的字符型数组,当前为CentOS7系统,c语言的int型变量占4个字节,char型变量占1个字节 4 * 4 + 30 = 46 当然了结构体是连续的内存,但是不一定是占按照内部定义的数据量总和,一般都会超出一点,因为考虑到内存的整体性,会做内存对齐操作
aruba
2021/12/06
5450
JVM--堆内存结构
Apache Spark 内存管理(堆内/堆外)详解
本文旨在梳理出Spark内存管理的脉络,抛砖引玉,引出读者对这个话题的深入探讨。本文中阐述的原理基于Spark 2.1版本,阅读本文需要读者有一定的Spark和Java基础,了解RDD、Shuffle、JVM等相关概念。
大数据真好玩
2021/09/18
1.3K0
Apache Spark 内存管理(堆内/堆外)详解
JVM内存模型之堆
内容 作为我们程序员最关系的部分:堆,也是占用JVM内存最大的一块。主要用来存放对象实例、数组等,也是GC发生最多的地方。java堆可以处在物理上不连续的内存空间,只要逻辑上是连续的即可。 具体来说堆分为2大部分:年轻代、年老代。而年轻代又分为:Eden空间、From Survivor空间、To Survivor空间
shengjk1
2018/10/24
5130
JVM内存模型之堆

相似问题

jvm实际占用内存为什么大于堆外+堆内?

0109

sqlite3 的In-Memory模式下使用的是 Java 堆内内存还是堆外内存?

1916

gensim模型加载 如何实现内存共享?

01.1K

k8s跨节点的pod如何实现内存共享?

0636

如何定期清理内存?

1111
相关问答用户
高级数据分析师擅长5个领域
萃橙科技 | 合伙人擅长4个领域
腾讯 | 技术专家擅长2个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档