1.内存区域划分 根据我们之前介绍的垃圾收集算法,限定商用虚拟机基本都采用分代收集算法进行垃圾回收.根据对象的生命周期的不同将内存划分为几块,然后根据各块的特点采用最适当的收集算法.大批对象死去.少量对象存活的,使用复制算法,复制成本低:对象存活率高.没有额外空间进行分配担保的,采用标记-清除算法或者标记-整理算法. 从上面的图可以看出, JVM区域总体分两类,heap区和非heap区. 1.heap区又分为: - Eden Space(伊甸园). - Survivor Space(幸存者区).…
JVM区域总体分两类,heap区和非heap区.heap区又分为: Eden Space(伊甸园). Survivor Space(幸存者区). Old Gen(老年代). 非heap区又分: Code Cache(代码缓存区): Perm Gen(永久代): Jvm Stack(java虚拟机栈): Local Method Statck(本地方法栈): 下面我们对每一个内存区域做详细介绍.Eden Space字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能被回收的对象…
本文整理于  Java内存与垃圾回收调优 Java 堆内存 从几个sample来学习Java堆,方法区,Java栈和本地方法栈 首先来一张图让我们理清楚java运行时状态: 诚然,如上图所示:java内存空间包括四部分: 1.Java堆:所有类实例(成员变量)和数组的内存均从此处分配,它是线程共享的,参看Java VisualVM截图 2.Java栈  主要存储基本类型的变量(byte short int long char float double boolean).对象的引用变量和方法中的局…
本文分为两部分:一是JVM内存区域的讲解:二是常见的内存溢出异常分析. 1.JVM内存区域 java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,这些区域有哪些呢?如下图: 1.1 程序计数器 程序计数器是一块很小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令.分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个程序计…
JVM 运行时的数据区域 首先获取一个直观的认识: 总共也就这么 5 个区(直接内存不属于 JVM 运行时数据区的一部分),除了程序计数器其他的地方都有可能出现 OOM (OutOfMemoryError),其中像是程序计数器和两个栈(Java 虚拟机栈 & 本地方法栈)都是每个线程要有一个的,所以肯定是线程隔离的.而其他 2 个区就是线程共享的了,也就是说,如果有多个线程要同时访问这两个区的数据,是会出现线程安全问题的.接下来,我们将对这些区域进行详细的介绍. 程序计数器 当前线程所执行的字节…
了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域.这些数据区域都有各自的用途,以及创建时间和销毁时间.有的随着虚拟机进程的而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.根据java虚拟机的规范,jvm管理的内存将包括以下几个运行时数据区域. 1.1 程序计数器 程序计数器是…
JVM虚拟机内存组成: 如下图:                       1. 程序计数器: (1)是一块较小的内存空间:可以看做当前程序执行子界面的行号指示器,字节码解析器执行的时候就是根据这个判断下一条指令该执行什么. (2)因为cpu在执行代码的时候,会在多个线程之间进行切换执行,所以为了在cup切换后恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各线程之间互不影响,独立存在,我们称此类内存为"线程私有"的内存. (3) 如果当前cup执行的是java代码,这个计数…
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实例的时候,虚拟机要为对象分配内存,Java虚拟机又是如何配分内存的呢?这些都涉及到Java虚拟机的内存划分机制,今天我们就来探究一下Java虚拟机的内存模型. Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间,有的区域随…
参考文章: <Java Se11 虚拟机规范> <深入理解Java虚拟机-JVM高级特性与最佳实践 第3版>- 周志明 本文基于Java Se 11讲解. 根据<Java虚拟机规范>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 对于不同的虚拟机实现,在运行时数据区的实现上并不完全相同.对于常用的HotSpot虚拟机来说,它的运行时数据区如下: 主要区别在于,HotSpot使用了直接使用本地内存(即机器本身内存)的元空间(metaspace)来实现方…
一.概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间.Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示: 下面就每一个区域进行阐述. 二.运行时数据区域 程序计数器 程序计数器,可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都要依赖这个计数器来完成.…