Java 内存池是如何划分的?
我目前正在使用jconsole监视Java应用程序。内存选项卡允许您在以下选项中进行选择:
Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”
它们之间有什么区别?
我目前正在使用jconsole监视Java应用程序。内存选项卡允许您在以下选项中进行选择:
Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”
它们之间有什么区别?
堆内存是运行时数据区域,Java VM 从中为所有类实例和数组分配内存。堆的大小可以是固定的,也可以是可变的。垃圾回收器是一种自动内存管理系统,用于回收对象的堆内存。
Eden Space:最初为大多数对象分配内存的池。
幸存者空间:包含伊甸园空间垃圾回收后幸存下来的物体的游泳池。
终身世代或老一代:包含幸存者空间中已经存在了一段时间的物体的池。
非堆内存包括在 Java VM 的内部处理或优化所需的所有线程和内存之间共享的方法区域。它存储每个类的结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码。方法区域在逻辑上是堆的一部分,但根据实现的不同,Java VM 可能不会对其进行垃圾回收或压缩。与堆内存一样,方法区域可以是固定大小或可变大小。方法区域的内存不需要是连续的。
永久生成:包含虚拟机本身的所有反射数据(如类和方法对象)的池。对于使用类数据共享的 Java VM,这一代分为只读和读写区域。
代码缓存:HotSpot Java VM 还包括一个代码缓存,其中包含用于编译和存储本机代码的内存。
该关键字在 Java 堆上分配内存。堆是主内存池,可供整个应用程序访问。如果没有足够的内存可用于为该对象分配,JVM 将尝试使用垃圾回收从堆中回收一些内存。如果仍然无法获得足够的内存,则抛出 ,并且 JVM 退出。new
OutOfMemoryError
堆被分成几个不同的部分,称为代数。随着对象在更多的垃圾回收中幸存下来,它们被提升到不同的世代。老一辈人没有被经常垃圾收集。由于这些对象已被证明具有更长的生存期,因此它们不太可能被垃圾回收。
当对象首次构建时,它们被分配到伊甸园空间中。如果他们在垃圾收集中幸存下来,他们将被提升到幸存者空间,如果他们在那里生活得足够长,他们就会被分配到终身一代。这一代垃圾回收的频率要低得多。
还有第四代,称为永久一代或PermGen。驻留在此处的对象不符合垃圾回收的条件,并且通常包含 JVM 运行所需的不可变状态,例如类定义和 String 常量池。请注意,PermGen空间计划从Java 8中删除,并将替换为一个名为Metaspace的新空间,该空间将保存在本机内存中。参考资料:www.programcreek.com/2013/04/jvm-run-time-data-areas/