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 和IBM的JDK好坏主要取决于他们各自实现Execution engine的好坏。每个运行中的线程都有一个Execution engine的实例。
Native interface组件 :与native libraries交互,是其它编程语言交互的接口。
Runtime data area组件 : 这个组件就是JVM中的内存。
Runtime data area 主要包括五个部分:Heap (堆), Method Area(方法区域), Java Stack(java的栈), Program Counter(程序计数器), Native method stack(本地方法栈)。Heap(堆) 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有。
Java栈
Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。
Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。
举例说明
简单的说其实 栈(stack) 就是存放变量引用的一个地方, 堆(heap) 就是存放实际对象的地方. 也就是比如: int i = 7; 这个 其实是存在栈里边的。内容为 i = 7。
Apple app = new Apple(); 这个 app 是在栈里边的 他对应的是一个内存地址也在堆里边, 而这个内存地址对应的是堆里边存放 Apple 实例的地址。
String s = "Hello World!"; 这个其实是存在另外一块静态代码区。
总体来说: 栈--主要存放引用 和基本数据类型。
堆--用来存放 new 出来的对象实例。
分享到:
相关推荐
堆和栈是Java编程语言中两个非常重要的概念,它们是Java虚拟机(JVM)中用于存储和管理数据的两个主要组件。在本文中,我们将深入探讨堆和栈的概念、实现和应用。 堆(Heap) 堆是一种特殊的数据结构,用来存储...
描述中提到了一个博文链接,尽管没有给出具体内容,但根据标题,我们可以推测该博文可能详细讨论了JVM相关技术和书籍推荐。给出的标签“源码 工具”表明博文可能还涉及到了分析JVM源代码和使用相关工具进行JVM调优的...
JVM 的类加载是通过 ClassLoader 及其子类来完成的,类的层次关系和加载顺序可以由下图来描述: 1. Bootstrap ClassLoader:负责加载 $JAVA_HOME 中 jre/lib/rt.jar 里所有的 class。 2. Extension ClassLoader:...
描述:本文深入探讨了Java中堆和栈的基本概念、工作原理以及它们之间的显著差异,特别关注了它们在资源管理、性能表现和内存分配策略上的不同。 ### Java中的堆(Heap) Java的堆是运行时数据区域,主要用于存储...
JVM在运行时,将内存空间分为若干个区域,主要包括方法区、堆内存、虚拟机栈、本地方法栈、程序计数器五个部分。 1. 方法区 方法区主要用于存储类信息、常量、静态变量等数据。在jdk1.7之前,方法区是堆的一个逻辑...
- **运行时数据区**:是JVM在运行期间,用于存储数据的内存区域,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。 #### 6. 内存模型中的重要概念 - **方法区**:存储已被虚拟机加载的类信息、常量、静态变量等...
Java虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着...
1. **内存模型**:JVM内存分为堆、栈、方法区、本地方法栈和程序计数器等几个部分。其中,堆用于存储对象实例,栈则用于存储方法调用时的局部变量;方法区存储类信息、常量、静态变量等;本地方法栈为JNI调用服务;...
- **栈与堆的不同**:栈用于存储局部变量和方法调用信息,而堆用于存储对象实例。栈的内存是自动管理的,而堆上的对象需要垃圾回收器来管理。 - **栈溢出**:当方法调用栈过深或过多时,可能导致栈溢出错误 ...
- **Java Stack(虚拟机栈)**:虚拟机栈描述的是Java方法执行的内存模型,其生命周期与线程相同。每当有一个新的方法被执行,虚拟机会为该方法创建一个新的栈帧,用来存储局部变量表、操作数栈、动态链接、方法出口...
JVM 是一个虚拟计算机,包括一套字节码指令、一组寄存器、一个栈、一个垃圾回收器、堆和一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接交互。Java 源文件通过编译器编译后,能产生一个.class 文件,...
- **堆栈分离的好处**: 堆栈分离有助于提高程序的可扩展性和安全性,因为栈空间是有限的且每个线程独有,而堆空间是所有线程共享的。 #### JAVA垃圾收集器 ##### 3.1 垃圾收集简史 垃圾收集的概念最早出现在1959年...
垃圾回收是 JVM 中非常重要的一个概念,它是 JVM 用来管理 Java 堆中对象的生命周期的机制。垃圾回收器会定期地对 Java 堆中对象进行扫描,标记出不再使用的对象,并将其回收,以释放出更多的内存空间。 垃圾收集...
- **栈**:每个线程都有自己的操作栈,用于存储局部变量和运算过程中的数据。 - **垃圾回收堆**:JVM负责内存管理,其中垃圾回收机制自动回收不再使用的对象,避免内存泄漏。 - **方法域**:存储类的静态变量和...
- **本机直接内存溢出**:Java NIO中的DirectByteBuffer分配的直接内存不受JVM堆大小限制,如果分配的直接内存过大,则可能引发OutOfMemoryError。 以上就是本次“JVM技术培训讲座”的主要内容概览。通过理解JVM的...
- **运行时常量池(Runtime Constant Pool)**:每类的class文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池表,用于存放编译期生成的各种字面量和符号引用。 - **直接内存(Direct Memory)**:不在...
最后,在JVM调优的过程中,我们还需要关注内存中的内容分布,如何在堆和栈之间合理分配数据,以及如何高效地使用内存。这不仅涉及到程序设计的层面,还包括对JVM内存模型的深入理解和灵活运用。通过上述的分析和总结...
- 运行时数据区:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器等各个区域的作用和管理策略。 - 字节码执行引擎:解析和执行字节码的过程,如操作数栈、本地变量表等。 2. **垃圾收集与内存管理**: - 垃圾...
2. **运行时数据区**:即通常所说的JVM内存结构,包括方法区、堆、栈、本地方法栈和程序计数器。 3. **执行引擎**:解释或编译Java字节码并执行。 #### 三、运行时数据区详解 ##### 1. 方法区(Method Area) - **...
本文将深入探讨JVM规格描述中的关键概念,包括JVM指令系统、寄存器、栈结构、碎片回收堆以及存储区。 首先,JVM指令系统类似于传统计算机的指令集,由操作码和操作数组成。操作码是8位二进制数,指示指令类型,如i...