Heap and Non-Heap Memory
-
Heap memory is the runtime data area from which the Java VM allocates memory for all class instances and arrays. The heap may be of a fixed or variable size. The garbage collector is an automatic memory management system that reclaims heap memory for objects.
-
Non-heap memory includes a method area shared among all threads and memory required for the internal processing or optimization for the Java VM. It stores per-class structures such as a runtime constant pool, field and method data, and the code for methods and constructors. The method area is logically part of the heap but, depending on the implementation, a Java VM may not garbage collect or compact it. Like the heap memory, the method area may be of a fixed or variable size. The memory for the method area does not need to be contiguous.
Memory Pools and Memory Managers
Memory pools and memory managers are key aspects of the Java VM's memory system.
-
A memory pool represents a memory area that the Java VM manages. The Java VM has at least one memory pool and it may create or remove memory pools during execution. A memory pool can belong either to heap or to non-heap memory.
-
A memory manager manages one or more memory pools. The garbage collector is a type of memory manager responsible for reclaiming memory used by unreachable objects. A Java VM may have one or more memory managers. It may add or remove memory managers during execution. A memory pool can be managed by more than one memory manager.
Garbage Collection
Garbage collection (GC) is how the Java VM frees memory occupied by objects that are no longer referenced. It is common to think of objects that have active references as being "alive" and non-referenced (or unreachable) objects as "dead." Garbage collection is the process of releasing memory used by the dead objects. The algorithms and parameters used by GC can have dramatic effects on performance.
The Java HotSpot VM garbage collector uses generational GC. Generational GC takes advantage of the observation that most programs conform to the following generalizations.
-
They create many objects that have short lives, for example, iterators and local variables.
-
They create some objects that have very long lives, for example, high level persistent objects.
The Java HotSpot VM defines two generations: the young generation (sometimes called the "nursery") and the old generation. The young generation consists of an "Eden space" and two "survivor spaces." The VM initially assigns all objects to the Eden space, and most objects die there. When it performs a minor GC, the VM moves any remaining objects from the Eden space to one of the survivor spaces. The VM moves objects that live long enough in the survivor spaces to the "tenured" space in the old generation. When the tenured generation fills up, there is a full GC that is often much slower because it involves all live objects. The permanent generation holds all the reflective data of the virtual machine itself, such as class and method objects.
The default arrangement of generations looks something like Figure 3-7.
分代垃圾收集器将内存分为多个代,并为每个代分配一个或多个内存池。当一个代用完了分配给它的内存,VM将在内存池中执行部分垃圾收集(也称为minor 收集),收回被已死对象占用的内存。这个局部垃圾收集通常比full GC要快很多。Figure 3-7 Generations of Data in Garbage Collection
If the garbage collector has become a bottleneck, you can improve performance by customizing the generation sizes. Using JConsole, you can investigate the sensitivity of your performance metric by experimenting with the garbage collector parameters. For more information, see Tuning Garbage Collection with the 5.0 HotSpot VM.
如果垃圾收集器成为瓶颈,可以调整各个代的大小来改善性能。使用JConsole,你可以尝试通过垃圾收集器参数调查你的性能指标的灵敏度。更多信息,请参见Tuning Garbage Collection with the 5.0 HotSpot VM.
相关推荐
### Java VM Heap 堆分析知识点详解 #### JVM内的内存管理 Java虚拟机(JVM)在执行Java程序的过程中,会负责内存的分配与回收。内存管理主要包括对象的创建、存储以及垃圾回收等过程。 - **Root Set 和对象的...
总结来说,通过在运行JAR程序时添加VM参数,我们可以定制JVM的行为,包括内存管理策略和远程监控设置。这对于优化程序性能、监控系统状态以及解决内存泄漏等问题非常有帮助。确保正确理解和使用这些参数,可以更好地...
1. **配置与启动**:VM插件允许用户自定义Java虚拟机参数,如设置JVM内存大小(-Xms, -Xmx)、堆分配策略、类加载器行为等。在项目启动时,这些参数会被应用到运行或调试的Java进程,确保应用按照预期配置运行。 2. *...
Maxine VM是一种高度可配置的实验性虚拟机,它的设计目标是为了方便研究人员理解和改进JVM的内部机制。 ##### 特点 - **灵活性**:允许对JVM内部进行更多的定制和扩展。 - **可研究性**:提供了丰富的工具和文档,...
Visual VM是一款强大的Java性能分析工具,它为开发者提供了一种可视化的方式来监控和分析JVM(Java虚拟机)上的应用程序。1.3.6是Visual VM的一个版本,它包含了许多改进和增强,使得开发者能够更有效地理解和优化...
- **内存**:展示堆和非堆内存使用情况。 - **线程**:提供详细的线程活动和阻塞信息。 - **类**:显示已加载类的数量和详细信息。 - **JVM**:显示 JVM 的配置和运行时参数。 - **MBeans**:查看和管理 MBeans...
1. **内存分析**:Visual VM可以实时监控Java应用的内存分配和使用情况,包括堆内存、 PermGen(在Java 8中已移除)、Metaspace等区域。通过内存视图,开发者可以定位内存泄漏,了解对象生命周期,并分析对象存活集...
2. **内存分析**:通过查看堆内存和对象详细信息,Visual VM可以帮助开发者找到内存占用过高的类或者对象,从而优化内存使用。它支持堆转储分析,可以导出堆快照进行深度分析。 3. **线程分析**:Visual VM提供线程...
此外,理解IBM J9 VM的内存模型和垃圾回收机制也非常重要,这有助于更好地利用IBM堆内存分析工具。 总的来说,IBM堆内存分析工具ha456.jar是Java开发和运维人员不可或缺的工具之一,它可以帮助我们有效地管理和优化...
- **Metaspace**: 存储类元数据的空间,位于本地内存而非堆内存。 #### 4. 内存溢出案例分析 - **案例背景**: Oracle传输网管版本在2013年3月份遇到的问题,WebUI进程中的JVM分配的内存堆栈被耗尽,导致监控界面...
内存区域主要分为方法区(存储类信息)、Java堆(所有对象实例都在此分配内存)、栈(每个线程有一个独立的栈,用于存储栈帧)、PC寄存器(记录当前线程执行的指令地址)、本地方法区(为Java的本地方法接口提供内存...
每个线程都有自己独立的程序计数器和虚拟机栈,而堆和方法区则是所有线程共享的数据区域。 - **程序计数器**:记录当前线程正在执行的字节码指令地址。 - **虚拟机栈**:用于存储局部变量表、操作数栈、动态链接...
2. **堆内存使用情况**:显示堆内存的总体使用情况,包括新生代、老年代和持久代的大小、已分配空间和剩余空间。这对于识别潜在的内存溢出问题非常有帮助。 3. **对象生存周期**:通过图表展示对象从新生代到老年代...
4. 在"Java Settings"页签中,你可以看到"VM arguments"输入框,这里就是用来输入JVM参数的地方,如`-Xms`和`-Xmx`。 5. 输入你的内存配置,例如`-Xms1024m -Xmx2048m`,然后点击"OK"保存设置。 注意,过大的堆大小...
- **Native Heap (C-Heap)**:所有JVM厂商都会使用的一种内存区域,主要用于存储非Java代码的内存需求。 ##### **1.2 学习JVM内存管理的重要性** 深入理解JVM内存管理的重要性不言而喻。一方面,这有助于开发者更...
可以看出JVM主要管理两种类型的内存:堆和非堆 简单来说:堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类...
- 包含起始和结束虚拟地址、标志(如只读标志)、虚拟内存操作集(`vm_ops`)和对应的文件(如果该区域由文件支持的话)等信息。 - 当发生缺页异常时,`nopage()`函数会被调用来处理。 #### 七、分页结构 Linux...
这个问题通常伴随着错误消息:“Unable to open kernel device '\\.\VMCIDev\VMX': 堆叠 I/O 操纵在停止中. Did you reboot after installing VMware Workstation?” 这个错误提示表明虚拟机与主机操作系统之间的...
开发者应详细阅读各个JVM厂商的文档,如Sun HotSpot VM、IBM VM和Oracle JRockit VM,以便更好地了解内存管理机制。 2. **评估应用程序需求**: 应用程序的静态内存占用需求,包括部署的应用数量、加载的类、数据...