前言
JVM的内存分配是一个老生常谈的话题了,但是如果开发者想要开发出高质量的APP,那么JVM的内存分配是必须要了解的。本文主要介绍JVM的内存分配。
JVM的内存区域划分
在网上一些介绍JVM内存分配的文章中,他们将Java的内存大致分为堆内存(heap)和栈内存(stack),这种划分的方式,体现了开发者最关注的区域,但是并不完全准确。JVM会将内存划分为若干个不同的数据区域,主要分为:程序计数器、虚拟机栈、本地方法栈、堆、方法区这五部分。
在介绍这五个内存区域前,我们先了解一下,Java文件被JVM加载到内存中的过程:
- A.java文件经过编译器编译,生成A.class字节码文件
- 程序访问A这个类时,会通过ClassLoader(类加载器)将A.class加载到JVM的内存中
- JVM将内存区域划分为若干个不同的数据区域,主要分为:程序计数器、虚拟机栈、本地方法栈、堆、方法区这五部分。
程序计数器
程序计数器的作用
Java程序是多线程的,线程的执行与挂起由CPU来决定。当CPU将一个线程(暂且就叫A线程)挂起,去执行另一线程(暂且叫B线程)时,这时需要记录代码已经执行到的位置;当CPU重新执行A线程时,就可以根据之前记录的位置,知道自己应该从哪行