1.jvm执行java程序时内存的区域划分
1.1程序计数器:简称PC (可以参考下面方法区class字节码的行号)
1.1.1 作用
在java虚拟机中所有java代码要编译成class字节码文件,由字节码解释器通过改变程序计数器的值来选取下一个需要执行的字节码指令,分支、循环、跳转,异常处理、线程恢复等基础功能。
1.1.2 生命周期
每个线程私有,确保了线程独立,native方法没有对应的程序控制器的值。
1.1.3 个人理解
有了它我们就知道下面开始执行哪一条语句,相当于保存了每个执行语句的位置,并且记录了执行的状态否则也就谈不上线程恢复的功能了。
1.2 java虚拟机栈
1.2.1 作用
用来描述方法执行的内存模型,每个方法的执行都会创建一个栈帧,用来存储局部变量、操作数栈、动态链接、方法出口等信息。每个方法的执行是入栈道出栈的过程。栈帧是随着方法的创建而创建,随着方法的结束而销毁,如果方法抛出异常,也算方法结束。然而在每一个栈帧中,都有着自己的局部变量表以及操作数栈以及对当前类的运行时常量池的引用。
1.2.2 局部变量
存放编译期间的基本类型(int,short,long等)和对象引用类型但是不是对象本身(可能是指向对象的起始位置或对象的句柄或其他与对象有关的位置)。long,double占用俩个局部变量空间其他则占用1个。局部变量所占的内存空间要在编译期间完成分配,当进入一个方法的时,这个方法需要在帧中分配多大的局部变量空间是确定的,运行期间不会改变局部变量表的大小。
1.2.3操作数栈
它是一个后进先出(LIFO)栈,而它的长度也是在编译时期就写入了class文件当中,是固定的。它的作用就是提供字节码指令操作变量计算的空间,比如简单的,对于int a=9这句话来说,就需要先将9压入操作数栈,再将9赋给a这个变量。和局部变量区一样,操作数栈也是被组织成一个以字长为单位的数组。但是和前者不同的是,它不是通过索引来访问,而是通过标准的栈操作—压栈和出栈—来访问的。比如,如果某个指令把一个值压入到操作数栈中,稍后另一个指令就可以弹出这个值来使用。
1.2.4StackOverflowError
栈请求深度大雨虚拟机允许的深度则会抛出
public class Test1 { private static void ces (){ ces(); System.out.println("栈深度测试"); } public static void main (String args []){ //不停循环调用方法也就是一直在压栈 ces(); } }
1.2.5 OutOfMemoryError(-Xss设定栈容量)
Java 虚拟机栈允许动态扩展,也允许固定长度,如果拓展时申请不到足够的内存那么就会抛出改异常。OutOfMemoryError 是堆和栈异常总称,所以局部变量区域内存溢出和堆内存溢出都会出现OutOfMemoryError错误
1.2.6 生命周期 (线程私有)
1.3 本地方法栈 : 同java虚拟机栈 只不过执行的是native方法
1.4 java 堆(java heap 俗称GC堆 -Xms -Xmx设置参数)
1.4.1 作用
java虚拟机管理内存实例的地方,几乎所有实例都在这里分配。它随着JAVA虚拟机的启动创建,储存着所有对象实例以及数组对象,而且内置了“自动内存管理系统”,也就是我们常说的垃圾搜集器。JAVA堆中的内存释放是不受开发人员控制的,完全由JAVA虚拟机一手操办。对于JAVA虚拟机如何实现垃圾搜集器,JAVA虚拟机规范没有明确的规定,也正因如此,我们平时使用的JAVA虚拟机中提供了许多种垃圾搜集器,它们采用不同的算法以及实现方式,已满足多方面的性能需求。
1.4.2 生命周期:所有线程共享区域
1.4.3 事例
// -Xms10m -Xmx10m import java.util.List; /** * Created by coffice on 2017/3/1. */ public class Test1 { private static void ces (){ ces(); System.out.println("栈深度测试"); } public static void main (String args []){ List<String> list = new ArrayList<String>(); while (true){ list.add("测试"); System.out.println("list添加成功"); } } } //由于list一直添加字符串对象导致堆内存溢出 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
1.5 方法区
1.5.1 描述
java虚拟机规范将它描述为堆的一个逻辑部分,但是显然还是有区别的因此他有个别名Non-Heap非堆就是为了区分java堆
1.5.2 作用
存储已经加载的类的信息(方法,字段,接口等)、常量、静态变量、即时编译后的代码等数据(如果你加载了足够多的类超出java堆的容量那么就会OutOfMemoryError了)
1.5.3 生命周期:所有线程共享
1.5.4 字节码
public class Test1 { // private static void ces (){ // ces(); // System.out.println("栈深度测试"); // } // public static void main (String args []){ // List<String> list = new ArrayList<String>(); // while (true){ // list.add("测试"); // System.out.println("list添加成功"); // } // } public static void main (String args []){ List<String> list = new ArrayList<String>(); while (true){ list.add("测试"); System.out.println("list添加成功"); } } } cofficedeMacBook-Pro:java coffice$ javap -c com/coffice/improve/jvm/Test1.class Compiled from "Test1.java" public class com.coffice.improve.jvm.Test1 { public com.coffice.improve.jvm.Test1(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: new #2 // class java/util/ArrayList 3: dup 4: invokespecial #3 // Method java/util/ArrayList."<init>":()V 7: astore_1 8: aload_1 9: ldc #4 // String 测试 11: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z 16: pop 17: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 20: ldc #7 // String list添加成功 22: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 25: goto 8 }
1.6 运行时常量池(属于方法区一部分)
1.6.1 作用
方法区一部分,存放类编译期间生成的各种字面量和符号引用,这些会在类加载后进入方法区运行的常量池中
相关推荐
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上...
- 作为JVM加载类的基础。 - 支持类的动态加载和验证。 #### 五、虚拟机与JVM **JVM (Java Virtual Machine)**是Java平台的核心部分,它负责执行字节码。 1. **JVM的工作流程**: - 加载Class文件。 - 解释...
### JVM基础知识精讲 #### 一、JVM概述与HotSpot简介 Java虚拟机(JVM)是Java技术的核心组成部分之一,它为Java程序提供了运行时环境。本节将详细介绍JVM的基本概念及其核心技术——HotSpot。 **HotSpot VM** 是...
Java JVM(Java虚拟机)是Java程序运行的基础,它负责解释和执行字节码,使得Java具有跨平台的能力。INSTR在Java世界中通常不直接对应一个特定的概念,但可能是指反编译过程中的一些指令或者工具。反编译是将已编译...
在深入了解Java虚拟机(JVM)指令集之前,读者应具备一定的Java基础知识。虽然本指南假设读者至少了解Java的基础语法,但即使只熟悉C++,也足以理解下面所讨论的内容。对于Java完全陌生的读者,可以参考作者提供的...
总之,Java JVM虚拟机是Java语言运行的基础,它的设计和实现直接影响着Java程序的性能和可移植性。通过深入了解JVM的工作原理,开发者可以更好地优化代码,提高程序运行效率,同时也能充分利用Java的平台无关性优势...
### Java基础之JVM #### 一、JVM简介 **1.1 JVM是什么** Java Virtual Machine (JVM),即Java虚拟机,是Java技术的核心组成部分之一。它是一种抽象计算机,能够执行Java字节码(一种中间代码)的虚拟机环境。JVM...
Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,提供了一个平台无关的运行环境。JVM性能优化是提升Java应用效率的关键环节,涉及到内存管理、垃圾回收、线程调度等多个方面。以下是对"Java JVM及...
JVM基础部分通常会涵盖以下几个关键知识点: 1. **JVM结构**:JVM由类加载器、运行时数据区、执行引擎、本地方法接口和本地库组成。理解这些组成部分的功能对于理解JVM如何工作至关重要。 2. **类加载机制**:包括...
Java基础知识学习:包括JVM虚拟机、对象模型等Java基础知识代码案例Java基础知识学习:包括JVM虚拟机、对象模型等Java基础知识代码案例Java基础知识学习:包括JVM虚拟机、对象模型等Java基础知识代码案例Java基础...
这份“Java JVM面试必备八股文”涵盖了JVM的基础知识、垃圾回收(GC)机制和类加载机制等关键点,旨在帮助准备面试的Java开发者提升对JVM的理解和应用能力。 首先,我们要了解JVM的基础概念。JVM是Java虚拟机的缩写...
#### 三、Java虚拟机基础架构 ##### 3.1 什么是虚拟机? 虚拟机(Virtual Machine, VM)是一种能够模拟特定计算机体系结构、执行特定指令集的软件环境。它可以分为两类: - **硬件级虚拟机**:例如x86架构的虚拟化...
总结,了解JVM的这些基础知识是成为一名合格的Java开发者的必经之路。深入学习JVM,不仅可以提升编程技能,还能帮助解决性能问题,使代码运行更加高效。通过实践和不断探索,我们可以更好地理解和利用这个强大的平台...
而JVM的内存模型规定了线程间的可见性和数据一致性,是理解和解决并发问题的基础。 JLS8和JVMS8的PDF文件是学习这些规范的重要资源,它们为开发者提供了官方的、权威的参考材料。通过阅读这些书籍,开发者不仅可以...
"JVM 基础知识点" JVM(Java Virtual Machine)是 Java 语言的运行环境,负责执行 Java 字节码。 JVM 的主要组件包括类加载器、字节码验证器、执行引擎和垃圾回收器等。 1. JVM 参数分类 JVM 参数可以分为三类:...
通过学习《JVM基础-超清文字版.pdf》,开发者可以更好地理解JVM的工作原理,从而编写出更高效、更稳定的Java程序。了解JVM的细节对于进行性能调优、排查问题以及优化大型Java应用具有重要意义。
JVM作为Java程序运行的基础,为开发者屏蔽了底层硬件和操作系统的复杂性,使得Java程序具有跨平台的特性。然而,随着Java应用在高并发、高性能场景的普及,对JVM的深入理解变得至关重要。 在本书中,作者不仅涵盖了...
Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码。在JVM中,内存管理是至关重要的,而`-Xms`, `-Xmx`, `-Xmn`, `-Xss`等参数则直接影响着Java应用程序的性能和稳定性。这些参数是用来调整JVM堆内存...
"Java-基础/jvm/多线程"这个主题涵盖了Java语言的基础知识,包括JVM(Java虚拟机)、多线程以及Java的基础语法和特性。 1. **JVM、JRE和JDK的关系**: - JVM(Java Virtual Machine)是Java程序运行的平台,负责...
JVM(Java虚拟机)是运行Java程序的核心,它负责解释执行Java字节码。...随着Java版本的更新,JVM也不断地引入新的特性和优化,学习和掌握JVM的基础知识对于Java开发者来说是一项基础且重要的任务。