Java虚拟机基础教程-概论
- 格式:pptx
- 大小:954.75 KB
- 文档页数:20
Java虚拟机的原理与实现Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心,也是Java语言的重要特性之一。
不同于其他编程语言的Interpreter或编译器,Java语言的运行环境是基于虚拟机的。
它可以将Java代码编译成字节码文件,并在JVM上运行,从而实现了Java语言的跨平台特性。
Java虚拟机是Java技术的基石,它的设计和实现影响了适用于Java语言的各种应用程序的性能、可靠性和可移植性。
本文将剖析Java虚拟机的原理和实现,以帮助开发人员深入了解Java语言的核心设计。
一、Java虚拟机的组成部分Java虚拟机是由不同的组件组成的,这些组件负责不同的功能。
下面是Java虚拟机的几个组件:1. Class Loader(类加载器)类加载器是Java虚拟机的核心组件之一。
它的主要任务是将类的字节码加载到JVM中。
类的字节码可以存放在本地文件系统、网络等位置。
在加载过程中,类加载器将类的字节码转化为JVM可识别的格式,并将其放置在Java堆中。
Java虚拟机中的类加载的过程遵循了父子代的模型,即一个类加载器可以有一个或多个父加载器和一个或多个子加载器。
2. Java堆Java堆是Java虚拟机管理的内存区域的重要部分,其中主要存储对象实例。
在类加载器将类的字节码加载到Java虚拟机中之后,运行时数据区域中会为每一个对象分配一定的内存空间。
此时,Java堆中的对象就产生了。
3. Java栈Java栈是Java虚拟机运行时数据区域中的另一个组件。
它主要用来存放方法执行时的局部变量、操作数栈和方法的执行过程。
每个线程都拥有一个独立的Java 栈。
当线程调用一个方法时,Java虚拟机创建一个新的栈帧并将其插入到Java栈的顶部。
当方法执行结束时,该栈帧被弹出,并释放相应的内存空间。
4. Native方法栈Native方法栈和Java栈类似,但用于执行本地方法。
java虚拟机运行原理Java虚拟机(Java Virtual Machine,JVM)是Java程序运行的基础,它是Java语言的核心部分。
本文将深入探讨Java虚拟机的运行原理,包括JVM的体系结构、类加载过程、内存管理、垃圾回收和即时编译等关键内容。
一、JVM的体系结构Java虚拟机的体系结构包括类加载器(ClassLoader)、运行时数据区(Runtime Data Area)和执行引擎(Execution Engine)。
类加载器负责将Java源文件编译后的字节码文件加载到JVM中,运行时数据区包括方法区、堆、虚拟机栈、本地方法栈和程序计数器,而执行引擎则负责解释和执行字节码。
二、类加载过程类加载是Java虚拟机的核心功能之一,它将类的二进制数据加载到内存中,并对数据进行校验、准备和解析。
类加载过程包括加载、验证、准备、解析和初始化五个阶段,其中验证阶段对字节码进行验证,确保它符合Java虚拟机规范;准备阶段负责为类变量分配内存,并设置初始值;解析阶段将符号引用转化为直接引用;初始化阶段是类加载过程的最后一步,它负责执行类的初始化方法。
三、内存管理Java虚拟机的内存管理主要包括堆、栈和方法区。
堆是Java虚拟机中最大的一块内存区域,用于存储对象实例和数组。
栈则用于存储局部变量、方法参数和返回值等信息,它以栈帧的形式存在,每个方法调用都会创建一个栈帧。
方法区用于存储类的结构信息、常量池和静态变量等数据。
四、垃圾回收Java虚拟机通过垃圾回收机制来自动释放不再使用的内存。
垃圾回收的核心算法包括标记-清除、复制、标记-整理和分代收集等。
标记-清除算法先标记出所有活动对象,然后清除未标记的对象;复制算法将内存分为两块,一块用于存储存活对象,另一块用于存储新创建的对象,当一块内存用完后,将活动对象复制到另一块内存中;标记-整理算法将存活对象向一端移动,然后清理掉端部空间;分代收集算法将内存划分为不同的代,根据对象的存活周期采用不同的垃圾回收算法。
JVM,Java虚拟机基础知识新⼿⼊门教程(超级通熟易懂)⼀.写在前⾯ ⾸先,本篇⽂章并没有涉及原理,⽽是在笔者撸了《深⼊理解Java虚拟机》好⼏遍的基础上讲解⾃⼰的经验,从⼀个新⼿到现在明⽩JVM是个什么玩意,怎么去理解和明⽩,讲解这样⼀个经验⽽已。
这篇⽂章并对JVM并没有挖掘得很深,在下⽬前暂时也没有这个能⼒,只是以通熟易懂的⽅式,让读者理解JVM是个什么玩意。
下⾯开始我的讲解。
⼆.谁说⼈神不得相爱——Java的跨平台 理解Java的跨平台特性,是对JVM最直观的认识。
所谓的“⼀次编译,到处运⾏”,为什么C/C++ 却不能实现呢?这⼀类语⾔直接使⽤物理硬件(或者说操作系统的内存模型),那么不同系统之间的内存模型是不同的,⽐如说Linux和Window,这就意味,在Window编译好的代码,却不能在Linux上运⾏。
《深⼊理解Java虚拟机》记录说,Java虚拟机规范中试图定义⼀种Java内存模型(JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台上都能达到⼀致性的并发效果。
举个现实的例⼦,⼀个只会听说中⽂的⼈,要如何和⼀个只会听说英⽂的⼈交流,在Java的世界⾥,采⽤的⽅式即是给两边的⼈各配⼀名翻译官(JVM),所以,这就是为什么JVM要有window版本,也要有Linux版本。
众所周知,Java的程序编译的最终样⼦是.class⽂件,不同虚拟机的对每⼀个.class⽂件的翻译结果都是⼀致的。
⽽对于C/C++⽽⾔,编译⽣成的是纯⼆进制的机器指令,是直接⾯对计算机系统的内存,但是,java程序的编译结果是⾯向JVM,是要交付给JVM,让他再做进⼀步处理从⽽让计算机识别运⾏,这就是所谓的“屏蔽掉各种硬件和操作系统的内存访问差异”。
这⾥的特点⼜和⾯向对象推崇的⾯向接⼝有着不可描述的关系,我只需要有这么个规范,不需要去知道接触你的底层原理实现。
三.活在梦⾥的真实——虚拟机 JVM,全称Java Virtual Machine,英⽂为Java虚拟机,简单的探讨⼀下虚拟机这三个字,对后⾯的学习也是挺舒服的。
Java虚拟机原理及优化技巧Java虚拟机(JVM)是Java程序的核心执行环境。
它是一种基于栈的解释执行方式,可以在各种操作系统上运行Java程序。
Java是一种编译型语言,编译器将Java源代码编译成Java字节码,而JVM则将Java字节码解释成计算机可执行代码。
Java虚拟机的架构JVM是一个用于执行Java字节码的虚拟机,是Java技术的核心所在。
JVM的架构主要由三部分组成:类加载器、执行引擎和运行时数据区域。
1. 类加载器类加载器负责将Java字节码加载到JVM中,并转换成JVM内部表示的类结构。
JVM中有三种类加载器:启动类加载器、扩展类加载器和应用程序类加载器。
其中,启动类加载器负责加载JVM自身的类库,扩展类加载器负责加载Java扩展类库,应用程序类加载器负责加载应用程序的第三方类库和应用程序自身的类。
2. 执行引擎执行引擎是JVM的核心,负责执行Java字节码。
执行引擎有两种实现方式:解释器和即时编译器(JIT)。
解释器将Java字节码解释成计算机可执行代码,执行效率较低;JIT则将Java字节码编译成本地机器码,执行效率更高。
JIT是JVM的性能优化的重要手段之一。
3. 运行时数据区域运行时数据区域是JVM用于存储数据的区域。
包括:方法区、堆、栈、程序计数器和本地方法栈。
其中,方法区存储类信息、常量池、静态变量等数据;堆存储对象实例;栈存储基本类型、对象引用、方法返回值等数据;程序计数器记录当前线程的执行位置;本地方法栈存储Java调用本地方法时的参数和返回值。
JVM的优化技巧JVM的性能优化是Java应用程序优化的重要手段之一。
以下是几种JVM的优化技巧:1. 垃圾回收优化Java程序中的垃圾回收是JVM自动进行的,但垃圾回收所花费的时间对程序的性能有着直接的影响。
通过调整JVM的垃圾回收策略和垃圾回收器的参数,可以降低垃圾回收的开销,提高程序的执行效率。
2. 即时编译器(JIT)JIT是JVM的一个重要组成部分,通过将Java字节码编译成本地机器码,可以大大提高程序的执行效率。
Java虚拟机原理,理解Java程序底层运行机制Java作为一门跨平台的高级编程语言,可以在不同的操作系统和硬件平台上运行,这主要得益于Java虚拟机。
Java虚拟机是一种基于栈式结构的计算机,负责执行Java程序,并提供跨平台的支持。
本文将从Java虚拟机的基本原理、Java程序的执行过程、Java内存模型和垃圾收集等方面,深入分析Java程序的底层运行机制。
一、Java虚拟机的基本原理Java虚拟机是由Java编译器将Java源代码编译成Java字节码文件,然后由Java虚拟机负责解释和执行字节码文件。
Java虚拟机采用栈式结构,它的基本运行单元是栈帧。
每个方法在被执行时,都会创建一个栈帧,在栈帧中保存着该方法的局部变量表、操作数栈、返回地址等信息。
每条指令在执行时,都会从操作数栈中取出相应的数据,进行计算,并把计算结果重新压回操作数栈中。
当一个方法被调用时,Java虚拟机会创建一个新的栈帧,将该方法的参数和返回值压入操作数栈中,并跳转到该方法的第一条指令开始执行。
当该方法执行完成后,Java虚拟机会弹出该方法的栈帧,并将执行结果返回给调用该方法的方法。
Java虚拟机的主要优点是跨平台性,但它也存在一些缺点。
由于需要解释执行字节码文件,Java程序的执行速度相对较慢。
为了提高Java程序的执行效率,Java虚拟机可以采用即时编译技术,将字节码文件直接编译成机器语言,再直接执行。
二、Java程序的执行过程Java程序的执行过程可以分为编译和执行两个阶段。
编译阶段通过Java 编译器将Java源代码编译成Java字节码文件,包括编译、优化、生成字节码等过程,其中编译器会进行静态检查,以确保程序的正确性。
执行阶段则是Java虚拟机将字节码文件解释或编译成机器语言,执行其中的指令。
Java程序在运行时,会调用Java虚拟机的类加载器,将需要运行的类装载到Java虚拟机中,并进行链接和初始化。
链接过程包括验证、准备和解析三个步骤,其中验证是确保该类的正确性,准备是为类的静态变量分配内存并设定初始值,解析是将符号引用转换为直接引用。
Java虚拟机学习(1):体系结构内存模型2016/11/02 | 分类:技术架构 | 0 条评论 | 标签: JVM分享到:8原文出处:java2000_wl一:Java技术体系模块图二:JVM内存区域模型1.方法区也称”永久代”、“非堆”,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。
默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和-XX:MaxPermSize 参数限制方法区的大小。
运行时常量池:是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。
2.虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息。
每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
声明周期与线程相同,是线程私有的。
局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(引用指针,并非对象本身),其中64位长度的long和double 类型的数据会占用2个局部变量的空间,其余数据类型只占1个。
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量是完全确定的,在运行期间栈帧不会改变局部变量表的大小空间。
3.本地方法栈与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。
4.堆也叫做java 堆、GC堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。
该内存区域存放了对象实例及数组(所有new的对象)。
一、Java虚拟机概述Java虚拟机(JVM)是Java程序运行的核心部分,它是一个能够在不同评台上运行Java字节码的虚拟机。
通过将Java源代码编译为字节码,JVM可以在不同操作系统上运行,实现了“一次编写,到处运行”的特点。
JVM的出现极大地推动了Java语言的普及和发展。
二、JVM的工作原理1. 类加载器JVM通过类加载器(ClassLoader)来加载Java类文件,将类文件转换成Class对象。
2. 运行时数据区JVM的运行时数据区包括方法区、堆、虚拟机栈、本地方法栈、程序计数器等。
其中,堆用于存放对象实例和数组,而虚拟机栈则用于存放方法的局部变量表、操作数栈和动态信息等信息。
3. 执行引擎执行引擎负责在运行时执行Java字节码指令,其中包括解释器和即时编译器等部分,负责将字节码转换为机器码执行。
4. 本地方法接口JVM的本地方法接口(Native Interface)允许Java调用本地C、C++等语言编写的函数,从而实现与底层系统的交互。
三、JVM参数调优1. 堆大小调优通过-Xms和-Xmx参数可以设置JVM的初始堆大小和最大堆大小,合理的设置堆大小可以避免内存溢出和性能问题。
2. 垃圾回收调优通过设置-XX:+UseG1GC等参数可以调优JVM的垃圾回收器,从而减少GC停顿时间、提高程序性能。
3. 线程栈大小调优通过设置-Xss参数可以调优线程栈的大小,避免因为线程栈过小导致的栈溢出异常。
四、性能分析与调优工具1. JConsoleJConsole是JDK自带的性能分析工具,可以通过连接远程或本地的JVM进程,监控堆、线程、类、GC等信息。
2. VisualVMVisualVM是一个基于Eclipse评台的性能分析工具,支持多种插件,能够进行堆分析、线程分析、CPU分析等。
3. JProfilerJProfiler是一款商业性能分析工具,提供了丰富的性能分析功能和图形化界面,适合企业级应用的性能调优。
深入理解JVM1 Java技术与Java虚拟机说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。
它们的关系如下图所示:图1 Java四个方面的关系运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。
最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。
从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java 语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。
这个平台的结构如下图所示:在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。
它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API,利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。
那么到底什么是Java虚拟机(JVM)呢?通常我们谈论JVM时,我们的意思可能是:1. 对JVM规范的的比较抽象的说明;2. 对JVM的具体实现;3. 在程序运行期间所生成的一个JVM实例。
对JVM规范的的抽象说明是一些概念的集合,它们已经在书《The Java Virtual Machine Specification》(《Java虚拟机规范》)中被详细地描述了;对JVM的具体实现要么是软件,要么是软件和硬件的组合,它已经被许多生产厂商所实现,并存在于多种平台之上;运行Java程序的任务由JVM的运行期实例单个承担。
java虚拟机教程Java虚拟机(Java Virtual Machine,简称JVM)是一种运行在操作系统之上的虚拟计算机,能够执行Java字节码文件。
它是Java语言的核心,使得Java具备了跨平台的特性。
首先,Java虚拟机的基本概念是什么?Java虚拟机相当于一个中间层,位于应用程序与操作系统之间。
它将Java程序编译成字节码文件,然后在各个操作系统上通过解释执行或者即时编译的方式运行。
这意味着无论是在Windows、Linux还是其他操作系统上,Java程序都能够得到正确的执行。
Java虚拟机的另一个重要特性是内存管理。
Java虚拟机自动进行垃圾回收,即在程序运行过程中自动释放不再使用的内存空间,减少了程序员手动管理内存的负担。
这使得Java程序更加健壮和安全,可以有效避免内存泄漏等问题。
另外,Java虚拟机还提供了一些其他的功能,比如动态类加载和即时编译等。
动态类加载意味着程序可以在运行时加载新的类文件,这使得Java程序可以根据需要进行扩展和灵活调整。
即时编译则是将源代码实时地编译为机器码,以提高Java程序的执行效率。
除了上述的基本概念和功能,Java虚拟机还有一些其他的重要方面。
例如,Java虚拟机规范定义了一种与硬件平台无关的字节码文件格式,这使得Java程序可以在不同的操作系统和硬件平台上执行。
同时,Java虚拟机还支持多线程编程,通过线程机制,程序可以并发地执行多个任务。
总结一下,Java虚拟机是Java语言的核心和关键技术之一,它将Java程序编译成字节码文件,并在各个操作系统上执行。
它具有跨平台、内存管理、动态类加载、即时编译等特性,使得Java程序具备了高度的灵活性、可扩展性和安全性。
Java虚拟机的学习和理解对于Java程序员来说是非常重要的。
通过深入了解Java虚拟机的原理和机制,可以编写出高效、健壮的Java程序,并能够更好地优化程序的性能和资源利用。
因此,掌握Java虚拟机是每个Java程序员的必备知识之一。
概述什么是Java虚拟化技术?Java虚拟机的基本概念Java虚拟机的工作原理Java程序的编译与执行过程JVM的基本组成和功能类加载器与字节码解释器JIT编译器和运行时优化Java虚拟化技术的应用服务器端应用移动设备应用嵌入式系统应用云计算和大数据应用Java虚拟化技术的挑战与未来性能问题与优化手段安全隐患与防范措施跨平台兼容性与标准化新兴技术的发展与应用结论Java虚拟化技术的原理与实践概述在计算机领域,Java虚拟化技术是一种通过Java虚拟机(JVM)实现的硬件和操作系统无关的编程方式。
它可以将Java程序编译成字节码,然后在不同的平台上运行。
本文将介绍Java虚拟化技术的原理和实践,深入探讨其在不同领域的应用和挑战,并展望其未来发展的方向。
Java虚拟机的工作原理Java程序的编译与执行过程在Java开发中,程序员首先使用Java编译器将Java源代码编译成字节码。
然后,这些字节码被加载到JVM中,并由JVM的解释器将其转换为机器码执行。
这种分阶段的执行方式有助于提高程序的可移植性和跨平台性。
JVM的基本组成和功能JVM由四个主要组件组成:类加载器、字节码解释器、即时编译器(JIT)和运行时数据区域。
类加载器负责加载和验证字节码文件,字节码解释器将字节码转换为机器码执行,JIT编译器则负责将热点代码编译为本地机器码以提高执行效率。
运行时数据区域包括堆、栈、方法区等,用于存储程序执行过程中的数据和运行时状态。
类加载器与字节码解释器类加载器是JVM的关键组件之一,它负责动态加载类文件并将其转换为可执行代码。
字节码解释器则负责解释和执行字节码指令。
这种分离的设计能够在运行时动态加载和执行代码,增强了程序的灵活性和可扩展性。
JIT编译器和运行时优化JIT编译器是JVM中的一个重要组件,它在运行时动态地将热点代码编译为本地机器码。
通过使用JIT编译器,Java虚拟机能够实现更高的执行效率,减少解释器的性能损失。
1.1Java 虚拟机类装载机制、原理和应用实例1、JVM中的类装载器(Classloader)(1)类文件必须首先加载到JVM内存中执行由于Java程序(class文件)并不是本地的可执行程序,因此在运行Java程序时,首先JVM (Java虚拟机)要把目标Java 类文件加载到JVM中的CodeSegment(代码段)中运行,负责加载Java类文件的这部分程序就叫做Class Loader。
因此Classloader也叫做类加载器。
(2)JVM的类动态装载技术JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行。
(3)什么是JVM中的类装载器Java中的所有类必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中——类装载就是寻找一个类或是一个接口的字节码文件并通过解析该字节码来构造代表这个类或是这个接口的class 对象的过程。
(4)类装载器把一个类装入JVM中一般要经过如下三个步骤来完成装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。
2、各个步骤的主要工作内容(1)装载查找和导入类或接口的字节码;(2)链接执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的。
1)校验:检查导入类或接口的二进制数据的正确性;2)准备:给类的静态变量分配并初始化存储空间;3)解析:将符号引用转成直接引用;(3)初始化激活类的静态变量的初始化Java 代码和静态Java 代码块。
3、Java中的类文件大致分为三种(1)系统类(2)扩展类(3)由程序员自定义的类4、Java中类装载方式有两种(1)隐式装载程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到JVM中。
(2)显式装载通过Class.forName(“目标类名称”)等方法,显式加载需要的类(3)隐式加载与显式加载两者在本质上是一样的,可以通过下面的示例说明:package com.px1987.javaexample;public class UserInfoVO {String userName;int userAge;public UserInfoVO() {}public void setUserAge(int newAge){userAge=newAge;newAge=1;}public void setUserName(String newUserName){userName=newUserName;newUserName="新的用户名称";}public String getUserName(){return userName;}public void setUserInfo(UserInfoVO oneUserInfoVO){oneUserInfoVO.setUserName("新的用户名称");}public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException{UserInfoVO oneUserInfoVO=new UserInfoVO();oneUserInfoVO.setUserName("张三");System.out.println("oneUserInfoVO="+oneUserInfoVO.getUserName());Class someOneClassObj=Class.forName("erInfoVO");UserInfoVO twoUserInfoVO=(UserInfoVO)someOneClassObj.newInstance();twoUserInfoVO.setUserName("张三");System.out.println("twoUserInfoVO="+oneUserInfoVO.getUserName());}}下面为本示例程序的执行结果:(4)利用java -verbose class可以观察类的具体加载过程5、JVM对类文件的加载是采用“动态加载”机制实现的(1)延迟加载由于一个Java应用程序总是由N多个类所组成的,当该Java应用程序启动并被开始执行时,JVM并不是一次性地把所有的类文件全部加载到内存中后再运行它们,JVM总是先把保证程序运行的JRE中的基础类库中的类文件一次性地加载到JVM内存中,而其它的类文件则需要等到JVM用到的时候再实际加载。
JVM原理速记复习Java虚拟机总结思维导图⾯试必备良⼼制作,右键另存为保存JVM喜欢可以点个赞哦Java虚拟机⼀、运⾏时数据区域线程私有程序计数器记录正在执⾏的虚拟机字节码指令的地址(如果正在执⾏的是Native⽅法则为空),是唯⼀⼀个没有规定OOM(OutOfMemoryError)的区域。
Java虚拟机栈每个Java⽅法在执⾏的同时会创建⼀个栈桢⽤于存储局部变量表、操作数栈、动态链接、⽅法出⼝等信息。
从⽅法调⽤直到执⾏完成的过程,对应着⼀个栈桢在Java虚拟机栈中⼊栈和出栈的过程。
(局部变量包含基本数据类型、对象引⽤reference和returnAddress类型)本地⽅法栈本地⽅法栈与Java虚拟机栈类似,它们之间的区别只不过是本地⽅法栈为Native⽅法服务。
线程公有Java堆(GC区)(Java Head)⼏乎所有的对象实例都在这⾥分配内存,是垃圾收集器管理的主要区域。
分为新⽣代和⽼年代。
对于新⽣代⼜分为Eden空间、FromSurvivor空间、To Survivor空间。
JDK1.7 ⽅法区(永久代)⽤于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
对这块区域进⾏垃圾回收的主要⽬的是对常量池的回收和对类的卸载,但是⼀般难以实现。
HotSpot虚拟机把它当做永久代来进⾏垃圾回收。
但很难确定永久代的⼤⼩,因为它受到很多因素的影响,并且每次Full GC之后永久代的⼤⼩都会改变,所以经常抛出OOM异常。
从JDK1.8开始,移除永久代,并把⽅法区移⾄元空间。
运⾏时常量池是⽅法区的⼀部分Class⽂件中的常量池(编译器⽣成的字⾯量和符号引⽤)会在类加载后被放⼊这个区域。
允许动态⽣成,例如String类的intern()JDK1.8 元空间原本存在⽅法区(永久代)的数据,⼀部分移到了Java堆⾥⾯,⼀部分移到了本地内存⾥⾯(即元空间)。
元空间存储类的元信息,静态变量和常量池等放⼊堆中。