java 内存池和堆内存什么关系啊

来源:百度知道 编辑:UC知道 时间:2024/06/11 04:04:28

两者是完全不同的两个概念

内存池:
在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升。
一个程序会随着长时间的运行和内存的申请释放而变得越来越慢,内存也会随着时间逐渐碎片化。特别是高频率的进行小内存申请释放,此问题变得尤其严重。
内存池最大的优势在于:
1、极少的(甚至没有)堆碎片整理
2、较之普通内存分配(如malloc,new),有着更快的速度

额外的,你还将获得如下好处:
1、检测任意的指针是否指向内存池内
2、生成"heap-dump"
3、各种 内存泄漏 检测:当你没有释放之前申请的内存,内存池将抛出断言

堆内存:
是一块内存区域,区别于栈区、全局数据区和代码区的另一个内存区域。堆内存允许程序在运行时动态地申请某个大小的内存空间。堆内存是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便

没有关系概念不同而已,内存池是内存使用的一种机制,有效的回收内容,减少内存碎片的产生,java里面的堆内存,存放所有new出来的对象。
栈内存:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

其实我也不太懂,最近才开始学的java编程。不过我在《java编程思想4》上看到过这么一句话 “在被称为堆的内存池中动态地创建对象”,不知道有没有关系,希望能帮到你一点。