JVM简单概述

 

一、内存模型&分区

Java虚拟机在运行Java程序时,会管理着一块内存区域:运行时数据区

在运行时数据区里,会根据用途进行划分为以下模块:

1、Java虚拟机栈

2、本地方法栈

3、Java堆

4、方法区

5、程序计数器

二、Java堆

简介:

1、定义:即堆内存(Heap),是垃圾收集器管理的主要区域,也称为GC堆。

2、作用:存放Java对象实例。

3、特点:在JVM内存中是最大的,是线程共享的区域。

4、抛出的异常:OutOfMemoryError异常,堆中没有足够的内存完成对象实例的分配、堆无法再扩展。

注: 1、从内存回收的角度分为:新生代和老年代; 2、从内存分配的角度相当于:多个线程私有的分配缓冲区。

三、Java虚拟机栈

简介:

1、定义:栈内存(Stack),是Stack、java方法执行的内存模型。

2、作用:存储java方法执行时的局部变量。

注:以帧栈的形式,含数据型、对象的应用,方法执行结束后释放。

3、特点:线程私有、生命周期与线程相同。

4、抛出的异常:OutOfMemoryError异常(虚拟机栈扩展时无法申请到内存空间)、StackOverflowError异常(线程请求栈深度>虚拟机所允许深度)。

注: 1、每个java方法执行时都会创建一个栈帧; 2、一个java方法从被调用到执行完成等于一个栈帧在虚拟机栈中的入栈到出栈; 3、局部变量表所需内存空间在方法编译时就会完成分配,在方法运行时不会改变大小。

四、本地方法栈

简介: 十分类似java虚拟机栈,与java虚拟机栈区别在于:服务对象。java虚拟机栈为执行java方法服务,而本地方法栈为执行native方法服务。

五、方法区

简介: 1、定义:堆的一个逻辑部分,为了与java堆区分,又称“非堆”区域(Non-Heap)。

2、作用:存储已被虚拟机加载的类信息、常量、静态变量等数据。

3、特点:线程共享。

4、抛出的异常:OutOfMemoryError异常(当方法区无法满足内存分配需求时抛出)。

注:该区域的内存回收主要针对运行时常量池和对类的卸载,又称:永久代,回收条件苛刻,很少出现垃圾收集。

运行时常量池

  • 定义:方法区的一部分。

  • 作用:存放类文件在编译时生成的各种字面量、符号引用。

  • 特点:动态性,即运行时也可添加新的常量,如String类的intern()。

  • 抛出的异常:OutOfMemoryError异常(当场量池无法申请到内存时)。

六、程序计数器

简介:

1、定义:当前线程所执行的字节码的行号指示器。

2、作用:实现异常处理、线程恢复等基础功能。

3、原理:通过改变计数器的值来选取下一条执行的字节码指令。

4、特点:线程私有、内存空间小。

5、抛出的异常:唯一一个在jvm中无任何OutOfMemoryError的内存区域。

注:线程私有的内存区域:为了使得线程切换后恢复到正确的执行位置,每个线程都配有一个独立的程序计数器,各线程互不影响,独立存储的内存区域。

 

原文地址:https://www.cnblogs.com/typ1805/p/13651293.html