`
传说の黄花菜
  • 浏览: 201548 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM specification对JVM内存的描述

阅读更多



 首先我们来了解JVM specification中的JVM

 

 


    

主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎) 子系统;Runtime data area (运行时数据区域)组件, Native interface(本地接口)组件。
     Class loader
子系统的作用 :根据给定的全限定名类名( java.lang.Object)来装载class文件的内容到 Runtime data area中的method area(方法区域)Javsa程序员可以extends java.lang.ClassLoader类来写自己的Class loader

      Execution engine
子系统的作用 :执行classes中的指令。任何JVM specification实现(JDK)的核心是Execution engine, 换句话说:Sun JDK IBMJDK好坏主要取决于他们各自实现的Execution  engine的好坏。每个运行中的线程都有一个Execution engine的实例。

     Native interface
组件 :与native libraries交互,是其它编程语言交互的接口。
 
     Runtime data area
组件:这个组件就是JVM中的内存。 下面对这个部分进行详细介绍。



 
Runtime data area
的整体架构图

Runtime data area 主要包括五个部分:Heap (), Method Area(方法区域), Java Stack(java的栈), Program Counter(程序计数器), Native method stack(本地方法栈)Heap Method Area是被所有线程的共享使用的;而Java stack, Program counter Native method stack是以线程为粒度的,每个线程独自拥有。

Heap
Java
程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。 (这里可能出现的异常java.lang.OutOfMemoryError: Java heap space


Method area
Java虚拟机中,被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。与Heap 一样,method area是多线程共享的,因此要考虑多线程访问的同步问题。比如,假设同时两个线程都企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。
(这里可能出现的异常java.lang.OutOfMemoryError: PermGen full

Java stack
       Java stack
以帧为单位保存线程的运行状态。虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到java stack(压栈);当一个方法调用返回时,从java stack弹出一个帧(出栈)栈的大小是有一定的限制,这个可能出现StackOverFlow问题。 下面的程序可以说明这个问题。

public class TestStackOverFlow {
 
        public static void main(String[] args) {
 
               Recursive r = new Recursive();
               r.doit(10000);
               // Exception in thread "main" java.lang.StackOverflowError
        }
 
}
 
class Recursive {
 
        public int doit(int t) {
               if (t <= 1) {
                       return 1;
               }
               return t + doit(t - 1);
        }
 
}

  

Program counter

每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿&ldquo;地址&rdquo;,这里的&ldquo;地址&rdquo;可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

 

 



Native method stack
对于一个运行中的Java程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止与此,它还可以做任何它想做的事情。比如,可以调用寄存器,或在操作系统中分配内存等。总之,本地方法具有和JVM相同的能力和权限。 (这里出现JVM无法控制的内存溢出问题
native heap OutOfMemory )


Sun JVM中对JVM Specification的实现(内存部分)

JVM Specification
只是抽象的说明了JVM实例按照子系统、内存区、数据类型以及指令这几个术语来描述的,但是规范并非是要强制规定Java虚拟机实现内部的体系结构,更多的是为了严格地定义这些实现的外部特征。


Sun JVM
实现中:Runtime data area(JVM 内存) 五个部分中的Java Stack , Program Counter, Native method stack三部分和规范中的描述基本一致;但对Heap Method Area进行了自己独特的实现。这个实现和Sun JVM Garbage collector(垃圾回收)机制有关,下面的章节进行详细描述。


垃圾分代回收算法(Generational Collecting

基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。



 



如上图所示,为Java堆中的各代分布。
1. Young
(年轻代)JVM specification中的 Heap的一部份

年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制&ldquo;年老区(Tenured)&rdquo;。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。

2. Tenured
(年老代)JVM specification中的 Heap的一部份

年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。

3. Perm
(持久代) JVM specification
中的 Method area
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。

 

  • 大小: 23.7 KB
  • 大小: 55.4 KB
  • 大小: 21.8 KB
分享到:
评论

相关推荐

    JVM Specification

    《JVM Specification》是一份详细的技术文档,详细阐述了JVM的设计、工作原理以及其与Java程序之间的交互机制。这份规范是Java开发者深入理解平台的重要参考资料,特别是对于优化性能、排查问题和开发JVM相关的工具...

    JVM深入解析(JVM specification 和Sun的JVM的内存机制)

    2. JVM内存模型 - JVM规范定义了不同的内存区域,包括程序计数器、Java虚拟机栈、本地方法栈、堆和方法区(在Java 8之后变为元空间)。 - Java虚拟机栈:每个线程都有一个独立的栈,用于存储方法调用的状态,包括...

    JVM Specification Third Edition 草稿

    ### JVM Specification Third Edition 草稿 - 关键知识点解析 #### 一、概述 《Java虚拟机规范》第三版草稿是由JDK的开发者们发布的一部重要文档,旨在为软件开发人员提供深入理解Java虚拟机(JVM)内部结构与运作...

    jvm specification

    - **类加载器子系统**:负责加载Java类文件到内存中,并将其转换为可以被JVM执行的形式。 - **运行时数据区**:包括方法区、堆、栈等部分,这些区域存储了程序运行时的数据。 - **执行引擎**:负责解释或编译字节...

    JVMSpecification

    ### JVM Specification概述 《Java™ Virtual Machine Specification》是学习Java虚拟机的核心参考资料,由Sun Microsystems公司出版,被视为理解和实现Java虚拟机(JVM)的权威指南。本文档旨在全面记录JVM的设计...

    慢慢琢磨jvm 经典

    因此,理解JVM如何管理内存,特别是堆内存和非堆内存,以及垃圾回收机制,对提升应用程序的性能至关重要。 #### JVM的组成结构 JVM由多个关键组件构成,包括类加载器(ClassLoader)、执行引擎(ExecutionEngine)...

    JVM Specification 8

    The Java® Virtual Machine Specification Java SE 8 Edition , Oracle官网上下载的JVM规范(JavaSE 8)。建议结合周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》一起学习,这样可能效果比较好。喜欢...

    JVM Specification 2

    JAVA虚拟机规范(第二版) CHM格式 方便阅读

    jvm规范和java规范

    《Java语言规范》(Java Language Specification,简称JLS)8版是描述Java编程语言的官方文档。它详细阐述了语言的所有细节,包括关键字、类型系统、表达式、语句、类、接口、包等。JLS8涵盖了Java 8的主要特性,如...

    Java虚拟机(JVM)

    对JVM规范的的抽象说明是一些概念的集合,它们已经在书《The Java Virtual Machine Specification》(《Java虚拟机规范》)中被详细地描述了;对JVM的具体实现要么是软件,要么是软件和硬件的组合,它已经被、

    JVM规范第二版

    《JVM规范第二版》是Java虚拟机设计与实现的核心参考文档,由Sun Microsystems发布,旨在全面详尽地描述Java虚拟机(JVM)的设计原理和技术细节。此书不仅是编译器开发人员针对JVM进行优化的目标指南,也是对任何...

    JVM分享pdf

    7. **JSR292**:Java Specification Requests(JSR)292介绍了在Java虚拟机上对动态类型语言的支持,特别是在JDK7中引入的invokedynamic指令,用于支持动态语言方法的绑定,这是对Java虚拟机功能的重要扩展。...

    JVM系统结构.docx

    JVM的抽象规范在《Java Virtual Machine Specification》一书中详尽描述,而实际的JVM实现可能是纯软件或软硬件结合,由不同厂商实现,如TaobaoVM。尽管不同实现可能存在差异,但JVM的跨平台特性得益于其设计的体系...

    Java虚拟机规范9

    描述中提到的《The Java® Virtual Machine Specification Java SE 9 Edition》是Oracle官方发布的Java SE 9版本的JVM规范文档,它为开发者和实现者提供了遵循的标准。标签“jvm”是指Java虚拟机这一关键组件,它在...

    The Java® Virtual Machine Specification Java SE 10 Edition.rar

    9. **JVM内存泄漏** - 内存泄漏可能导致系统资源耗尽,理解对象生命周期和垃圾回收机制是避免内存泄漏的关键。 10. **JVM安全** - JVM提供了一套安全管理机制,包括类加载的隔离、权限控制等,以确保Java应用的...

    The Java® Virtual Machine Specification Java SE 12 Edition.rar

    《Java® Virtual Machine Specification Java SE 12 Edition》是官方发布的关于JVM在Java SE 12版本中的详细规范,旨在定义JVM如何执行字节码、管理内存以及实现各种平台无关的特性。 1. **JVM概述**: - JVM是...

    The Java® Virtual Machine Specification Java SE 8 Edition.rar

    JVM内存分为以下几个区域: 1. **方法区**:存储类信息、常量、静态变量等。 2. **堆**:所有对象实例和数组都在堆中分配内存,是JVM中最大的一块内存区域。 3. **栈**:每个线程都有一个独立的程序计数器、虚拟机栈...

    The Java® Virtual Machine Specification Java SE 11 Edition.rar

    《Java® Virtual Machine Specification Java SE 11 Edition》是Java开发工具包(Java Development Kit,JDK)的重要组成部分,它详细定义了Java虚拟机(Java Virtual Machine,JVM)的行为和运行机制。JVM作为Java...

Global site tag (gtag.js) - Google Analytics