`
什么都不懂的孩子
  • 浏览: 28033 次
社区版块
存档分类
最新评论

JVM几个运行时内存区域

 
阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

 

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
 
    1. 程序计数器(线程私有)
     对于JVM来说,每个Java文件都会被编译成.class文件,里面的方法,常量等等,都会被包括在内,但是运行时,如何知道目前线程运行到哪一行命令,就需要程序计数器指出来。在JVM中,多线程是通过线程轮流切换CPU的使用时间来实现,每个线程都会有一小块区域,用来记录当前所执行到的命令的位置,如果不这样的话,那么线程暂停以后,就没法知道目前命令执行到哪一条了。很好理解,这块区域属于线程的私有区域,不允许其他线程访问。
     所需要注意的是,程序计数器只记录Java方法,也就是说,它只记录虚拟机自己的字节指令,对于Native方法,这个计数器的值为空。这块区域是唯一没有规定任何OutOfMemory异常的地方。
 
    2. Java虚拟机栈(线程私有)
      这个栈是真正用来执行Java方法的区域,每当执行到一个Java方法的时候,就会创建一个栈帧,这个栈帧里面会记录局部变量、操作数栈、动态链接、方法出口和其他附加信息等等,每个方法从开始执行到执行完就是一个出栈到入栈的过程。
     在这个区域,如果线程规定了栈的深度,那么在执行方法时超出了栈的最大深度,那么就会出现StackOutflowError异常,如果虚拟机栈可以扩展,那么在扩展的时候分配不出内存,就会抛出OutOfMemoryError异常。当前大部分的虚拟机都是可以扩展的。
 
    3. Java堆(线程共享)
      对于大多数应用来说,这一块是Java内存分配管理中最大的一块,它是所有线程共享的,主要用于存储对象实例和数组。这一区域会涉及到Java的内存回收机制Garbage Colleted Heap,这个区域在不同的内存垃圾回收机制下面,会呈现不同的内存空间(不同是指是否规则,回收后是否会进行内存空间整理),当内存空间无法分配的时候抛出OutOfMemoryError
 
    4. 本地方法栈(线程私有)
      与Java虚拟机栈类似,区别在于本地方法栈用于执行Native方法,Java虚拟机栈却是执行Java字节码的地方。在虚拟机规范中没有规定对此块内存区域应该如何使用,各种虚拟机可以自由实现它。跟Java虚拟机栈一样,会抛出两种异常。
 
    5. 方法区(线程共享)
      各个线程共享,用于储存被加载的类信息、常量、静态变量、即时编译器编译的代码等数据。GC对这块内存的收集是必要而且条件苛刻的,回收主要是针对常量池和对类型的卸载。会出现OutOfMemoryError异常。
 
    6. 运行时常量池(线程共享)
      这块区域是方法去的一部分,.class文件中会有这些信息,用于存放编译时生成的各种字面量和对象的引用,在类加载完成后,放入方法区运行时常量池存放。另外一个特征就是具备动态性,所有常量并不要求在编译期产生,在运行时产生的常量也可以放入该区域,用的最多的就是String.intern()方法http://bbs.csdn.net/topics/190153906
 
    7. 直接内存
      在Java1.4中加入了NIO(New Input/Output),引入了一种基于通道与缓冲区的I/O方式,它可以使用Native函数直接在堆外面分配内存,然后用一个储存在堆里面的DirectByteBuffer对象作为这块内存的引用,能提高IO性能,可能会出现OutOfMemoryError异常。
 
 
 
 
 
 
 
 
 
 
 
 
5
4
分享到:
评论

相关推荐

    JVM内存空间分配笔记

    JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分进行详细介绍。 #### 二、程序计数器 程序计数器是一...

    jvm 内存分析文档

    JVM内存分为几个关键区域,每个区域都有特定的功能和作用。这些区域包括: - **程序计数器(PC Register)**:每个线程都有自己独立的程序计数器,用于记录当前线程执行的字节码的行号。在方法调用、异常处理等过程...

    java获得jvm内存大小

    1. **堆内存(Heap)**:这是程序共享的内存区域,用于存储对象实例和数组。 2. **方法区(Method Area)**:用于存储类的信息、静态变量、常量池等数据。 3. **栈内存(Stack)**:每个线程都有一个私有的栈,用于存储...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    1. **堆内存(Heap)**:这是JVM管理的最大块内存区域,用于存储所有对象实例以及数组。堆内存又分为年轻代(Young Generation)和老年代(Old Generation),年轻代进一步细分为Eden区和两个Survivor区(S0、S1)。 2. **...

    JVM内存模型及分区 JVM内存模型及分区

    Java虚拟机(JVM)内存模型是Java编程中不可或缺的一部分,它主要分为以下几个分区: 1. **程序计数器(Program Counter Register)** - 这是每个线程独享的内存区域,用于存储当前线程正在执行的字节码指令的行号...

    jvm内存管理,pdf

    Java虚拟机(JVM)将内存分为几个主要区域,每个区域都有其特定的功能和用途。这些区域包括程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区。下面我们将重点介绍其中与内存管理密切相关的几个部分: 1. **程序...

    JVM内存模型

    运行时数据区是JVM管理的主要内存区域,包括以下几个部分: - **程序计数器(Program Counter Register)**:线程私有,记录当前线程所执行的字节码指令地址。每条线程都有独立的程序计数器,当线程执行的是Java方法...

    JVM 内存结构及配置总结

    JVM内存主要分为以下几个区域: - **方法区(Method Area)**:这是所有线程共享的区域,存储类信息、常量、静态变量、即时编译后的代码等。在Java 8以前,这部分也被称为永久代(Permanent Generation),在...

    详解JVM 运行时内存使用情况监控

    JVM 的内存结构主要包括以下几个部分: 1. 程序计数器(Program Counter Register):记录当前执行的字节码的行号。 2. Java虚拟机栈(Java Virtual Machine Stack):用于存储方法的局部变量、操作数栈、动态链接...

    JVM原理-jvm内存及相关图示

    运行时数据区是JVM的内存区域,它是JVM存储和管理数据的地方。运行时数据区主要包括以下几个部分: 1. 方法区:存储类信息、静态变量和常量池 2. 堆(Heap):存储对象实例和数组 3. 虚拟机栈(Java Virtual ...

    java中jvm内存分配相关资料总结整理

    JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。每个区域都有特定的用途: - **方法区**:存储类信息、常量、静态...

    Tomcat JVM内存设置方法

    1. **堆内存(Heap Memory)**:这是JVM管理的主要内存区域之一,用于存储对象实例以及数组等数据。堆内存又可以细分为新生代(Young Generation)和老年代(Old Generation)。 - **新生代**:新创建的对象首先被...

    JVM历史发展和内存回收笔记.rar

    JVM在运行Java程序时,会创建几个不同的运行时数据区域,包括: 1. **程序计数器**:记录当前线程正在执行的字节码指令的地址。 2. **Java虚拟机栈**:每个线程都有自己的虚拟机栈,用于存储局部变量表、操作数栈、...

    JVM参数配置及MyEclipse内存不足.rar

    JVM内存主要分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。每个区域都有其特定用途,例如堆用于存储对象实例,栈则处理方法调用...

    解决JVM实际使用的内存比-Xmx的少的问题.docx

    JVM内存主要分为几个部分:堆内存、方法区、程序计数器、本地方法栈和虚拟机栈。其中堆内存是用于存储Java对象实例的主要区域,也是我们关注的重点。`-Xms`和`-Xmx`这两个参数分别用来设置初始堆大小和最大堆大小。 ...

    JVM 内存分析

    JVM为应用程序提供了运行时环境,它包括堆内存、栈内存、方法区、程序计数器以及本地方法栈等几个主要区域。以下是对这些内存区域的详细说明: 1. **堆内存**:这是Java对象的主要存储区域,所有通过`new`关键字...

    (主讲视频)JVM原理、内存模型、性能调优

    JVM内存模型主要包括以下几个部分: 1. **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每个线程都有一个私有的程序计数器。 2. **Java虚拟机栈(Java Virtual Machine Stacks)**...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    JVM内存主要分为以下几个区域: 1. **堆内存(Heap Memory)**:这是Java对象的主要存储场所,分为年轻代和老年代。年轻代又细分为Eden区、Survivor From区和Survivor To区,用于新生对象的分配和初步筛选。 2. **...

    JAVA内存分区与CC++内存分区的总结

    1. **堆区**:这是所有线程共享的内存区域,用于存放对象实例、数组等数据。每当有新的对象被创建时,就会在堆上分配空间。垃圾回收机制主要针对堆区进行,自动管理对象的生命周期,释放不再使用的对象占用的空间。 ...

Global site tag (gtag.js) - Google Analytics