`

JVM学习笔记-方法区(Method Area)

 
阅读更多
    方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。
    对于习惯在HotSpot虚拟机上开发和部署程序的开发者来说,很多人愿意把方法区称为“永久代”(Permanent Generation),本质上两者并不等价,仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,或者说使用永久代来实现方法区而已。对于其他虚拟机(如BEA JRockit、IBM J9等)来说是不存在永久代的概念的。即使是HotSpot虚拟机本身,根据官方发布的路线图信息,现在也有放弃永久代并“搬家”至Native Memory来实现方法区的规划了。
       Java虚拟机规范对这个区域的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是有必要的。在Sun公司的BUG列表中,曾出现过的若干个严重的BUG就是由于低版本的HotSpot虚拟机对此区域未完全回收而导致内存泄漏。
根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

以上描述截取自:
《深入理解Java虚拟机:JVM高级特性与最佳实践》 作者: 周志明
----------------------------------------------------------------------------------

Inside a Java Virtual Machine instance, information about loaded types is stored in a logical area of memory called the method area. When the Java Virtual Machine loads a type, it uses a class loader to locate the appropriate class file. The class loader reads in the class file--a linear stream of binary data--and passes it to the virtual machine. The virtual machine extracts information about the type from the binary data and stores the information in the method area. Memory for class (static) variables declared in the class is also taken from the method area.
在Java虚拟机中,关于被装载类型的信息存储在一个逻辑上被称为方法区(Method Area)的内存中,当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件——一个线性二进制数据流——然后将它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区(Method Area)。该类型中的类变量(static变量)同样也是存储在方法区(Method Area)中。

The manner in which a Java Virtual Machine implementation represents type information internally is a decision of the implementation designer. For example, multi-byte quantities in class files are stored in big-endian (most significant byte first) order. When the data is imported into the method area, however, a virtual machine can store the data in any manner. If an implementation sits on top of a little-endian processor, the designers may decide to store multi-byte values in the method area in little-endian order.
Java虚拟机在内部如何存储类型信息,这是由具体实现的设计者来决定的。比如,在class文件中,多字节值总是以高位在前的顺序存储。但是当这些数据引入到方法区后,虚拟机可以以任何方式存储它。假设某个实现是运行在低位优先的处理器上,那么它很可能会把多字节值以低位优先的顺序存储到方法区。


The virtual machine will search through and use the type information stored in the method area as it executes the application it is hosting. Designers must attempt to devise data structures that will facilitate speedy execution of the Java application, but must also think of compactness. If designing an implementation that will operate under low memory constraints, designers may decide to trade off some execution speed in favor of compactness. If designing an implementation that will run on a virtual memory system, on the other hand, designers may decide to store redundant information in the method area to facilitate execution speed. (If the underlying host doesnít offer virtual memory, but does offer a hard disk, designers could create their own virtual memory system as part of their implementation.) Designers can choose whatever data structures and organization they feel optimize their implementations performance, in the context of its requirements.
当虚拟机运行Java程序时,它会查找使用存储在方法区中的类型信息。设计者应当为类型信息的内部表示设计恰当的数据结构,以尽可能在保持虚拟机小巧紧凑的同时加快程序的运行效率。如果正在设计一个需要在少量内存的限制中操作的实现,设计者可能会决定以牺牲某些运行速度来换取紧凑性。另外一个方面,如果设计一个将在虚拟内存系统中运行的实现,设计者可能会决定在方法区中保存一些冗余信息,一次来加快执行速度。(如果底层主机没有提供虚拟内存,但是提供了一个硬盘,设计者可能会在实现中创建一个虚拟内存系统。)Java虚拟机的设计者可以根据目标平台的资源限制和需求,在空间和时间上做出权衡,选择实现什么样的数据结果和数据组织。

All threads share the same method area, so access to the method areaís data structures must be designed to be thread-safe. If two threads are attempting to find a class named Lava, for example, and Lava has not yet been loaded, only one thread should be allowed to load it while the other one waits.
由于所有线程都共享方法区,因此它们对方法区数据的访问必须被设计为是线程安全的。比如,假设同时有两个线程都企图访问一个名为Lava的类,而这个类还没有被装入虚拟机,那么,这时只应该有一个线程去装载它,而另一个线程则只能等待。

The size of the method area need not be fixed. As the Java application runs, the virtual machine can expand and contract the method area to fit the applicationís needs. Also, the memory of the method area need not be contiguous. It could be allocated on a heap--even on the virtual machineís own heap. Implementations may allow users or programmers to specify an initial size for the method area, as well as a maximum or minimum size.
方法区的大小不必是固定的,虚拟机可以根据应用的需要动态调整。同样,方法区也不必是连续的,方法区可以在一个堆中自由分配。另外,虚拟机也可以允许用户或者程序员指定方法区的初始大小以及最小和最大尺寸等。


The method area can also be garbage collected. Because Java programs can be dynamically extended via class loader objects, classes can become "unreferenced" by the application. If a class becomes unreferenced, a Java Virtual Machine can unload the class (garbage collect it) to keep the memory occupied by the method area at a minimum. The unloading of classes--including the conditions under which a class can become "unreferenced"--is described in Chapter 7, "The Lifetime of a Class."
方法区也可以被垃圾收集,因为虚拟机允许通过用户定义的类装载器来动态扩展Java程序,因此一些类也会成为程序“不再引用”的类。当某个类变为不再被引用的类时,Java虚拟机可以卸载这个类(垃圾收集),从而使方法区占据的内存保持最小。类的卸载以及一个类变为“不再被引用”的必需条件,都将在第7章中描述。

以上描述截取自:
《Inside the Java Virtual Machine 2nd Edition》 作者:Bill Venners   
分享到:
评论
1 楼 5cai 2012-05-28  
跟着学习学习

相关推荐

    虚拟机学习笔记--周志明老师第三版

    * 方法区(Method Area):存储被 JVM 加载的类信息、运行时常量池、JIT 编译后的 Code Cache 等信息。 * 直接内存(Direct Memory):用于 NIO 的缓冲区分配,避免在系统内存与 JVM 堆内存之间拷贝的开销。 * 线程...

    JVM性能学习笔记思维导图

    本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...

    jvm学习笔记

    《JVM学习笔记》 Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行所有的Java应用程序。这篇笔记将深入探讨JVM的工作原理、内存管理、类加载机制以及优化策略,帮助读者全面理解JVM并提升Java程序的性能。 ...

    深入JVM笔记word版

    #### 六、方法区(Method Area) 方法区也称为非堆区,它被所有线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。尽管方法区与堆一样在逻辑上被视为连续的内存空间,但...

    ImagesForJVM-JVM笔记图片

    1. **内存模型**:JVM内存分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(PC Register)、本地方法栈(Native Method Stack)。每个线程都有自己独立的栈和程序计数器,而堆和方法区则是...

    JVM内存管理学习笔记

    JVM内存主要分为五个区域:堆内存(Heap)、虚拟机栈(Java Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。这五部分构成了JVM运行时数据区。 1. ...

    jvm-juc:jvm学习笔记

    2. 运行时数据区:包括堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(PC Register)。其中,堆是所有线程共享的内存区域,主要存储对象实例;...

    JVM思维导图,学习思维笔记

    本思维导图及学习笔记将深入探讨JVM的工作原理、内存模型、垃圾收集机制以及性能优化等方面,帮助你全面理解这个至关重要的技术。 一、JVM概述 Java虚拟机是Java平台的一部分,它负责解析字节码并执行Java程序。JVM...

    JVM内存结构笔记.rar

    2. **方法区(Method Area)**:在Java 8之前,也被称为永久代,存储了类的信息,如类名、方法信息、常量池等。Java 8之后,这部分被元空间(Metaspace)所替代,元空间位于 native 内存中,可以避免Java堆溢出的...

    JAVA-JVM-全面/发展史/GC.zip

    JVM的内存模型包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。其中,堆是所有对象的存储空间,而栈则存储方法调用的状态。 垃圾回收(GC)...

    JVM和性能优化学习思维笔记.rar_java

    2. **内存模型**:JVM内存分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。堆内存用于存储对象实例,栈内存存储方法调用,方法区存储...

    Java - JVM: 读书笔记 Chapter 05 The Java Virtual Machine ( Part I Basic )

    1. **JVM内存结构**:JVM内存分为几个主要区域,包括方法区(Method Area)、堆(Heap)、栈(Stack)、本地方法栈(Native Method Stack)、程序计数器(Program Counter Register)。每个区域都有其特定的功能,...

    eclipse性能优化 <深度理解jvm>读书笔记

    1. **JVM内存模型**:JVM内存分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。理解这些区域的作用以及它们之间的交互对于优化内存使用至关...

    Java学习笔记_内存管理.rar

    - **方法区(Method Area)**:存储类的信息,如类的元数据、常量池、字段和方法数据等。在Java 8之后被元空间(Metaspace)替代,不再有固定大小限制。 - **本地方法栈(Native Method Stack)**:为Java方法和...

    理解虚拟机--有笔记版

    JVM内存模型定义了程序中各种变量的访问规则,它包含了堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter)和本地方法栈(Native Method Stack)五个主要区域。每个区域都有其特定的...

    java学习笔记

    - **方法区(Method Area)**:存储已加载类的信息、常量、静态变量等数据。 #### 七、垃圾回收机制 - **垃圾回收(Garbage Collection)**:自动管理内存,回收不再使用的对象所占有的内存。 - **垃圾回收算法**:...

    Java核心知识点整理.pdf

    5. 方法区/永久代(Method Area/PermGen):方法区/永久代是JVM的内存区域之一,用于存储类和方法的信息。 JVM运行时内存 JVM运行时内存是JVM的内存管理机制,负责管理Java对象和数组的生命周期。JVM运行时内存...

    动力节点_Java零基础_课堂笔记.zip

    JVM内存主要分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。其中,对象实例主要在堆内存中分配,而方法调用时的局部变量存储在栈中...

    Performance.zip

    包括堆(Heap)、年轻代(Young Generation)、老年代(Tenured/Old Generation)、永久代/元空间(Permanent/Metaspace)以及方法区(Method Area)。了解各区域的作用和垃圾收集器的工作方式对于避免内存溢出至关...

Global site tag (gtag.js) - Google Analytics