1、Java虚拟机运行时的数据区域,如下图所示。
(1) 程序计数器
每个线程都有一个独立的程序计数器,该内存区域不会出现OutOfMemoryError。
(2) Java虚拟机栈
线程私有,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表存放了编译期可知的各种基本数据(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型。局部变量表也就是人们常说的栈内存(Stack)。
(3) Java堆
所有线程共享,Java虚拟机启动时创建,通常是Java虚拟机所管理的内存中最大的一块。Java虚拟机规范说:所有的对象实例以及数据都要在堆上分配(栈上分配、标量替换等优化技术例外)。
线程共享的java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。
Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
Java堆还可以细分为新生代和老年代。
(4) 方法区
线程共享,用于存储已被机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 方法区也被称为“永久代”,垃圾收集行为在这个区域也比较少。
运行时常量池(Runtime Constant Pool)也是方法区的一部分。
(5) 直接内存(Direct Memory)
直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但仍然会出现导致OutOfMemoryError出现(如忽略掉直接内存,导致各个内存区域的总和大于物理内存限制)
2、对象访问举例
Object obj = new Object();
“Object obj”这部分语义将会反映到Java栈的本地变量表中,作为一个reference类型数据出现。而“new Object()”这部分的语义将会反映到java堆中,形成一块存储了Object类型所有实例数据值(Instance Data,对象中各个实例字段的数据)的结构化内存。另外,在java堆中还必须包含能查到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。
相关推荐
### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...
虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...
本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...
#### 第二章:Java基本类型变量 ##### 变量定义 - **变量**:用来存储数据的容器。 - **声明与初始化**: - 必须声明变量类型和名称。 - 可以在声明时初始化变量,也可以之后进行初始化,但必须在使用前完成。 ...
对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。 3. **弱引用**:比软引用更弱的一种引用关系,弱引用所指向的对象只能生存到下一次垃圾回收发生之前。当...
Error是由Java虚拟机抛出的异常,程序无法处理的问题,例如虚拟机错误、内存溢出错误、线程死锁等。Exception是程序本身可以进行处理的异常,包括非检查异常和检查异常。 非检查异常(Unchecked Exception)是...
在实际的学习中,我们还需要结合实践,通过编写代码、运行程序、调试和解决实际问题来逐步深入理解Java JDK的各个方面。同时,与时俱进地关注和学习JDK的新特性和新版本的更新,将有助于保持自己的技术水平始终保持...
#### 第二章:Java语言特性 1. **标识符规则** - Java标识符区分大小写。 - 标识符可以由字母、数字、下划线(_)和美元符号($)组成,但不能以数字开头。 2. **字符类型** - Java采用双字节字符表示法,即`...
当系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收后还没有足够的内存,才会抛出内存溢出异常。 3. **弱引用**:弱引用比软引用的生命周期更短。只具有弱引用的对象拥有更...
6. **高性能:** Java虚拟机(JVM)通过即时编译(JIT)技术提高程序的执行速度。 7. **多线程:** Java内置对多线程的支持,简化了并发程序的开发。 #### 三、Java开发环境配置 1. **Linux环境:** - 配置`JAVA_HOME...
第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,存储局部变量表、操作数...
在Android工程师的成长过程中,深入理解和熟练运用JAVA算法、数据结构以及Android源码是至关重要的步骤。这份名为"Android工程师成长之路:JAVA算法的实现,数据结构 和 Android源码笔记等 分享.zip"的资源包,显然...
在IT行业中,性能优化是至关重要的一个环节,尤其是在Java虚拟机(JVM)环境中。"Performance.zip"这个压缩包文件包含的显然是关于JVM性能调优的学习笔记,这对于理解和提升Java应用的运行效率非常有帮助。JVM是Java...
在深入探讨嵌入式Android系统开发的过程中,Java语言扮演了至关重要的角色。本文将结合《Embedded Android》一书中的注释和代码段,探讨在阅读过程中发现的一些关键知识点,这对于维护和理解Android应用以及系统层...