l Tenured Generation(heap):在surviver space中已经存在了一段时间之后的对象会移动到这个池中。
l Permanent Generation(non-heap):包含虚拟机自身的所有反射数据。比如class和mothod对象。对于使用的JVM,这一代分为只读和读写两个区域。
Code Cache (non-heap):HotSpot JVM也包含一个“代码缓存”,是编译和存储本地代码所占用的内存。
查看关于内存池的详细信息:
Detail区域显示了几种当前内存度量:
lUsed:当前使用的内存总量。使用的内存总量是指所有的对象占用的内存,包括可达和不可达的对象。
lCommitted:JVM可使用的内存量。Committed内存数量可能随时间变化而变化。JA虚拟机可能将某些内存释放,还给操作系统,committed内存可能比启动时初始分配的内存量要少。Committed内存总是大于等于used内存。
lMax:内存管理可用的最大内存数量。此可能改变或者为未定义。如果JVM试图增加使用内存(used memory)超出了committed内存,那么即时使用内存小于或者等于最大内存(比如系统虚拟内存较低),内存分配仍可能失败。
右下角的图表显示了内存池在heap和non-heap消耗的内存量。当内存使用超出了内存使用阀时,柱状图会变红。你可以通过设置MemoryMXBean的一个属性来调整内存占用阀。
Heap and Non-heap内存
JVM管理两种内存:heap和non-heap内存,两种内存都是在JVM启动时建立。
Heap memory 是运行时数据区域,用于JVM为所有对象实例和队列分配的内存。Heap可能为固定植或者可变。jdk15 jconsole 监控不到垃圾收集器是一个用于回收对象占用的heap内存的自动化内存管理系统。
Non-heap memory 包含一个在所有线程共享的方法区域(method area)和内部进程或JVM优化所需的内存。它存储了每一个类的结构,比如运行常量池,字段和方法数据,构造函数和方法的代码。方法区域逻辑上是 heap的一部分,但是依赖于实现,JVM可能不进行垃圾收集或压缩。像heap一样,方法区域可能为固定或可变大小。方法区域所需要的内存没有必要是连 续的。
除了方法区域之外,一个JVM实现的内部进程或优化所需的内存也属于non-heap内存。比如JIT编译器为了提高性能而用于存储本地机器码所需的内存。
内存池(Memory pools)和内存管理器是JVM内存管理系统的关键部分
一个内存池(memory pool)代表JVM管理的一块内存区域。JVM拥有最少一个内存池,JVM在运行中可能创建或删除内存池。一个内存池可以属于heap内存或者non-heap内存。
内存管理器(memory manager)管理一个或多个内存池。垃圾回收其是一种负责回收被不可打对象占用的内存的内存管理器。一个JVM可以拥有一个或者多个内存管理器。JVM在运行中可能增加或删除内存管理器。一个内存池可以被多于一个内存管理器管理。
垃圾收集:
垃圾收集(GC)是指JVM释放那些被无引用对象占用的内存空间。它通常认为那些有活动引用的对象是“活”对象,而那些没有引用或不可达的对象为“死”对象”。垃圾收集是释放被死对象占用的内存的过程。GC的算法和参数对性能有巨大的影响。
HotSpot VM垃圾收集器使用 分代垃圾收集(generational garbage collection)。分代GC利用了大多数程序中,从经验看有如下特点:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-44302-7.html
杨洋的Hi-Res初体验##杨洋h