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

如题所述

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

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

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

堆内存:
是一块内存区域,区别于栈区、全局数据区和代码区的另一个内存区域。堆内存允许程序在运行时动态地申请某个大小的内存空间。堆内存是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-13
其实我也不太懂,最近才开始学的java编程。不过我在《java编程思想4》上看到过这么一句话 “在被称为堆的内存池中动态地创建对象”,不知道有没有关系,希望能帮到你一点。
第2个回答  2013-08-15
没有关系概念不同而已,内存池是内存使用的一种机制,有效的回收内容,减少内存碎片的产生,java里面的堆内存,存放所有new出来的对象。
栈内存:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)本回答被网友采纳

java 常量池 到底是在堆中还是栈中?
java常量池不在堆中也不在栈中,是独立的内存空间管理。1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)2. 堆:存放所有new出来的对象。3. 常量池:存放字符串常量和基本类型常量(public static...

新建一个JAVA线程,占用的是JAVA堆内存还是操作系统的内存?
Thread对象本身是在堆内存创建的,调用start()后开辟的线程空间是属于栈内存的。内存管理在Java语言中是JVM自动操作的,当JVM发现某些对象不再需要的时候,就会对该对象占用的内存进行重分配(释放)操作,而且使得分配出来的内存能够提供给所需要的对象。在一些编程语言里面,内存管理是一个程序的职责,但是...

JAVA中的各种东西存储在什么地方
比如,JAVA对象引用存储于堆栈区,但对象并不存储于其中。3、堆一种通用的内存池(也位于RAM区),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间,因此堆里分配存储有很大的灵活性。当需要一个对象时,只需要new一个即可,当执行这行代码时,会自动在...

java内存模型的java对象的内存分配
一种通用性的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同的是,“内存堆”或“堆”(Heap )最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。

超越内存限制:深入探索内存池的工作原理与实现
因此,需要内存管理,从而有内存池存在。通过内存管理避免内存碎片以及避免频繁的申请、释放内存。new和malloc\/callol关系:new是关键字,内部调用的是malloc\/callol,delete和free一样,是对内存释放。分配内存的时候,分配的大小以及何时分配何时释放都是不确定的。因此,针对不同的常见有不同的内存管理方式...

java内存诊断软件?
对于每一个java进程来说都有自己的内存池和使用空间,而这也就意味着会出现内存使用错误等问题,而这时候我们就需要对java内存进行诊断分析,今天昌平java培训就一起来了就一下,在进行内存诊断上都有哪些软件可以使用。Java堆:分析诊断数据 堆转储分析 堆转储可以使用如下的工具进行分析:EclipseMAT(内存...

【330期】JDK 内置实用工具:JVM 监视、故障排除分析!
Java VM管理两种内存:堆内存和非堆内存,并利用内存池和内存管理器进行高效管理。垃圾回收是释放不再引用的对象占用内存的过程,Java Hotspot VM使用代数 GC。JConsole的“垃圾回收”部分可以显示GC的操作,允许随时点击按钮进行垃圾回收。线程部分提供关于线程使用的详细信息,类部分显示类加载的信息,VM概要...

怎样查看JAVA内存的大小?
系统对C Heap没有限制,故C Heap发生问题时,Java进程所占内存会持续增长,直到占用所有可用系统内存 参数说明:JVM 堆内存(heap)设置选项 参数格式 说 明 设置新对象生产堆内存(Setting the Newgeneration heap size)-XX:NewSize 通过这个选项可以设置Java新对象生产堆内存。在通常情况下这个选项的...

Spring Boot引起的“堆外内存泄漏”排查及经验总结
使用系统层面的工具定位堆外内存。因为已经基本上确定是Native Code所引起,而Java层面的工具不便于排查此类问题,只能使用系统层面的工具去定位问题。首先,使用了gperftools去定位问题。从上图可以看出:使用malloc申请的的内存最高到3G之后就释放了,之后始终维持在700M-800M。笔者第一反应是:难道Native Code中没有使用...

Minor GC,Major GC和Full GC之间的区别
区不存在内存碎片。写指针总是停留在所使用内存池的顶部。执行Minor GC 操作时,不会影响到永久代。从永久代到年轻代的引用被当成 GC roots,从年轻代到永久代的引用在标记阶段被直接忽略掉。质疑常规的认知,所有的 Minor GC 都会触发“全世界的暂停(stop-the-world)”,停止应用程序的线程。对于大部分应用程序,...

相似回答