Runtime Data Area 运行时数据区就是我们常说的jvm内存
1.程序计数器
类似汇编语言中的cs:ip,指向下条指令地址。多线程中每个线程都有自己的程序计数器
2.java栈
java栈也称作虚拟机栈,事实上java栈是java方法执行的内存模型。
java栈中存放许多栈帧,每个栈帧对应一个被调用的方法。当线程执行一个方法就会创建一个对应的栈帧,并将之压栈,方法执行完之后将
栈帧出栈。当然每个线程都有对应的虚拟机栈。
栈帧中包含局部变量表、操作数栈、指向当前方法所属类的运行时常量池的引用、方法返回地址和一些额外信息。
①局部变量表(local variables):用于存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。对于基本数据类型变量,直接存储值,而引用类型的变量,则存的是指向对象的引用。
局部变量表所需的内存空间在编译期间完成分配,大小是确定的其中64位的long和double占两个局部变量空间,其余占一个。在方法运行期间表大小了两种异常:如果线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常;如果虚拟机可以动态扩展,当扩展时无法申请足够内存会抛出OutOfMemoryError异常
②操作数栈(operand stack):“详情了解栈的应用之表达式求解”
③运行时常量池的引用(reference to runtim是不会改变的。
java虚拟机规范,对这个区域规定e constant pool):方法执行中可能要用到类中的常量,需要一个引用指向他们
④方法返回地址(return address):一个方法执行之后,要返回之前调用它的地方,就是这个返回地址
3.本地方法栈
与java栈的作用和原理非常相似。本地方法栈是为执行本地方法服务的。
4.堆heap
堆是所有线程共享的一块内存区域,在虚拟机启动时创建。所有的对象实例和数组都要在堆上分配内存,这也是它的唯一目的。
堆可以只要逻辑上连续就行。如果在堆中没有内存完成实例分配,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。
5.方法区
方法区又叫静态区,跟堆一样,被所有线程共享。方法区中包含的是整个程序中永远唯一的元素,如class,static变量
现给出例子以更直观了解:
public class AppMain //运行时, jvm 把appmain的信息都放入方法区 { public static void main(String[] args) //main 方法本身放入方法区。 { Sample test1 = new Sample( " 测试1 " ); //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面 Sample test2 = new Sample( " 测试2 " ); test1.printName(); test2.printName(); } } public class Sample //运行时, jvm 把appmain的信息都放入方法区 { private name; //new Sample实例后, name 引用放入栈区里, name 对象放入堆里 public Sample(String name) { this .name = name; } public void printName() //print方法本身放入 方法区里。 { System.out.println(name); } }
系统启动java虚拟机进程后,首先从classpath中找到AppMain.class文件,读取这个文件中的二进制数据,然后把AppMain类的类信息存放到运行时数据区的方法区中。即AppMain类的加载。
接着,java虚拟机定位到方法区中AppMain类的Main()方法的字节码,开始执行它的指令。第一句:
Sample test1 = new Sample("测试1");
1.虚拟机建一个Sample实例,到方法区找Sample类的类型信息。没有,加载Sample类。
2.在堆中为Sample实例分配内存,这个Sample实例持有指向方法区中Sample类的类型信息的引用。这个引用实际上就是Sample类类型信息在方法区中的内存地址。
3.test1就是在方法栈中的的一个变量。“=”将这个test1变量指向堆区中的Sample实例。
接下来,虚拟机执行test1.printName()方法时,根据局部变量test1持有的引用,定位到堆中的Sample实例,再根据Sample实例持有的引用,定位到方法区中Sample类的类型信息,从而获得printName()方法的字节码,执行printName()方法包含的指令。
相关推荐
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
《深入理解IDEA插件JProfiler11:高效优化JVM内存》 在Java开发领域,高效运行和优化JVM内存是至关重要的。IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能...
### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...
MAT JVM内存分析工具可以帮助开发者深入理解Java虚拟机(JVM)的内存管理机制,通过分析堆内存快照来识别内存消耗异常的情况。 首先,MAT提供了丰富的视图来帮助用户查看内存状态,例如“概述”视图可以快速了解堆...
总之,MAT作为一款强大的JVM内存分析工具,对于优化Java应用的内存使用,提升应用性能,尤其是对于Mac OS X平台的开发者来说,是不可或缺的利器。通过熟练掌握MAT的使用,开发者可以更有效地管理和优化应用程序的...
JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要。 ### 1. JVM内存结构 #### 1.1.1 JVM内存概述 JVM内存分为几个关键区域,每个区域都有特定的...
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
### JVM内存配置优化 #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组...
JVM内存模型深度剖析与优化 JVM内存模型是Java虚拟机的核心组件之一,它直接影响着Java应用程序的性能和可靠性。本文将深入剖析JVM内存模型的结构和工作机理,并讨论如何优化JVM参数以提高Java应用程序的性能。 一...
本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并解析给定代码片段中的关键概念。 ### JVM内存模型 在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存...
### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...
在JVM内存管理中,内存泄漏是一种常见的性能问题,可能导致应用运行缓慢,甚至崩溃。MAT通过解析JVM生成的hprof文件(内存快照),可以深入分析堆内存的各个部分,包括对象分配、存活状态、引用关系等,帮助定位问题...
该文档描述了开发测试环境中Docker及JVM内存限制部署方案
在开发和优化Java应用程序时,理解JVM内存日志至关重要,因为它可以帮助我们诊断性能问题,例如内存泄漏或过度的垃圾收集。`jmap`是Java的一个命令行工具,用于获取堆内存的详细信息,包括堆dump,这对于分析JVM内存...
1. **JVM内存结构** JVM内存主要分为以下几个区域: - **方法区(Method Area)**:这是所有线程共享的区域,存储类信息、常量、静态变量、即时编译后的代码等。在Java 8以前,这部分也被称为永久代(Permanent ...
JVM 内存参数详解以及配置调优 JVM 内存参数是 Java 虚拟机中最重要的参数之一,它直接影响着 Java 应用程序的性能和稳定性。在这个资源中,我们将详细讨论 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...
本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC ...
### JVM内存结构详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,其核心组件之一便是内存管理系统。理解JVM的内存布局对于开发高性能的应用程序至关重要。本文将详细介绍JVM内存结构及其各个组成部分...