Java和C++之间有一堵又内存动态分配和垃圾收集技术所围成的高墙。
对于Java程序员来说,虚拟机的自动内存管理机制的帮助下,不需为每个new操作去写配对的delete/free代码,而且不容易出现内存泄漏和内存溢出的问题,看起来虚拟机管理一切都很好,但是一旦出现了内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将变得很困难。
Java虚拟机在执行Java程序的过程中会把所管理的你存划分为若干个不同的数据区域。这些都有各自的用途和生命周期,有的数据区域随虚拟机进程的启动而存在,有些则依赖用户线程的启动和结束而建立和销毁。
Java虚拟机所管理的内存将会包括以下几个运行时数据区域:
接下来简要介绍一下各个组件的作用:
1、程序计数器
一块较小的内存空间,线程隔离,是当前线程所执行的字节码的行号的指示器。
如果线程正在执行Java方法,这个计数器记录是正在执行的虚拟机字节码指令的地址。
如果正在执行的是Native方法,则该计数器为空。
此内存区域是唯一一个没有规定任何OutOfMemoryError情况的区域。
2、Java虚拟机栈
线程私有,生命周期与线程相同,描述了Java方法执行的内存模型,进栈和出栈则完成一个方法的执行。每个方法执行都会创建一个栈帧:用于存储局部变量表、操作栈、动态链接、方法出口等信息。
会出现的异常:
栈深度太深--StackOverFlowError
无法申请足够的内存--OutOfMemoryError
3、本地方法栈
作用与Java虚拟机栈一样,区别是本地方法栈是为虚拟机使用到的Native方法服务的。
会出现的异常:
同上!!!
4、Java堆
线程共享,在虚拟机启动时创建,是Java虚拟机管理的最大的一块内存,创建的唯一目的是存放对象实例,是GC管理的主要区域,也被称为GC堆。
Java堆可细分为:新生代和老年代。
Java堆上的内存空间不要求物理连接,但必须逻辑连接。即可固定大小又可自定扩展,通过-Xms和-Xmx来控制。
会出现的异常:
无法申请足够的内存--OutOfMemoryError
5、方法区
与Java堆一样,也是线程共享的内存区域,在虚拟机启动时创建,别名为Non-Heap。
用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
常量池是Java方法区的一部分,存放编译时期生成的各种字面量和符号引用,该部分的内容在类加载后存放于方法区的运行时常量池中。
它被归为堆的一个逻辑部分。
GC在这个区域比较少出现,在这个区域回收的目标主要针对常量池的回收和对类型的卸载。回收的条件比较苛刻。
HotSpot虚拟机把方法区称为“永久代”。
会出现的异常:
无法申请足够的内存--OutOfMemoryError
- 大小: 57.3 KB
分享到:
相关推荐
### JAVA内存分区与C/C++内存分区的深度解析 #### JAVA内存分区 在JAVA中,JVM(Java虚拟机)的内存主要分为三个区域:堆(heap)、栈(stack)和方法区(method)。每个区域都有其特定的功能和管理机制。 1. **...
Java内存区域和垃圾收集(GC)机制是Java编程中至关重要的一部分,它关乎程序的性能、稳定性和资源管理。本文将深入探讨Java虚拟机(JVM)中的内存划分、垃圾收集的工作原理以及相关工具的使用。 1. **Java内存区域...
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
Java内存区域是Java虚拟机(JVM)管理内存的核心组成部分,它们主要分为以下几个部分: 1. **程序计数器(ProgramCounterRegister)**:每个线程都有自己的程序计数器,用于存储当前线程正在执行的字节码的行号指示...
java内存区域和内存溢出.xmind
Java内存区域与内存溢出异常.pdf
Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作...
Java虚拟机Java内存区域及对象.doc
深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字) Java序列化和反序列化是Java虚拟机中的一种重要机制,它们可以将Java对象转换为二进制数据,然后...
1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间不足时,会抛出`java.lang.OutOfMemoryError: Java heap space`异常。为了优化内存管理,Java采用了垃圾回收机制(Garbage ...
Java内存区域的使用详解主要涵盖了五个核心部分:程序计数器、虚拟机栈、本地方法栈、Java堆以及方法区。这些区域各自负责不同的任务,共同确保Java应用程序的正常运行。 1. **程序计数器**:每个线程都有自己的...
这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...
#### 二、Java内存区域概述 Java程序在运行时会根据不同的数据类型和生命周期将其分配到不同的内存区域。这些内存区域主要包括: 1. **寄存器**:用于临时存放CPU计算过程中产生的中间结果,这部分内存不由程序员...
#### 一、Java内存区域划分 Java的内存管理机制将内存分为以下几个区域: 1. **栈(Stack)**: - 存储局部变量(如基本类型的变量和对象的引用)。 - 每个线程拥有一个独立的栈。 - 栈内存中的数据在方法执行...
- **主内存**: 所有线程共享的内存区域,包含堆和方法区,线程间通信的媒介。 - **工作内存**: 每个线程的私有缓存,用于存储从主内存中复制的变量副本,执行计算操作后可能更新回主内存。 2. **内存间交互** - ...
Java内存区域主要分为两部分:主内存(Main Memory)和工作内存(Working Memory)。 - **主内存**:所有线程共享的内存区域,用于存放程序中所有的变量。Java中所有变量都储存在主存中,对于所有线程都是共享的。 - **...
Java虚拟机(JVM)中有三个主要的内存区域:堆内存(Heap)、栈内存(Stack)和方法区(Method Area)。其中,堆内存是Java对象的主要存储场所,栈内存主要存储方法调用时的局部变量,而方法区则存储类的信息,如类...
"浅谈Java内存区域划分和内存分配策略" 本文将详细讲述Java内存区域划分和内存分配策略,涵盖程序计数器、虚拟机栈、本地方法栈、堆、方法区等内存区域的概念和作用,以及对象创建过程和内存分配策略。 程序计数器...
### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...
#### 一、Java内存区域划分 Java程序在运行过程中涉及的内存主要分为两大类:栈内存和堆内存。 1. **栈内存**:主要用于存储局部变量,如基本数据类型变量(int、long、char等)以及对象的引用变量。这些变量在...