本文在终于搞懂了java8的内存结构,再也不纠结方法区和常量池了!_java8堆中存放静态变量和字符串常量池吗-CSDN博客基础上加入了一些个人思考,原文写得就很通俗易懂,推荐
Java内存
Java程序在运行过程中使用的内存可以分成虚拟内存和本地内存两大类。
虚拟内存
虚拟内存,就是指JVM自己管理的内存区域,包含运行java程序所需要的各种数据结构和运行环境。
主要包括:方法区、堆、栈、程序计数器、本地方法栈。
我们可以用个例子简单理解这五大区域的含义:
如果把JVM内存比作一个巨大的游乐场,在这个游乐场中有五大区域,每个区域有自己特定的功能:
1.程序计数器:游乐场里的指南针,指示玩家(线程)正在玩什么(当前执行的字节码指令)。
2.虚拟机栈:游乐场里的桌台,比如给娃娃涂色,每个玩家(线程)都有自己的桌台,每当玩家要做某个动作时(方法调用),就会在桌台上放一些需要的工具(方法的局部变量、操作数栈等)。
3.本地方法栈:有时候玩家可能需要用到一些特别的工具(本地方法),这些工具并不是在游乐场中提供的(非java语言),本地方法栈就是存放这些特别工具的地方。
4.堆:这是游乐场最大的区域,有各种各样的玩具(对象),所有的玩家(线程)都会在这里创建和使用这些玩具。
5.方法区:类似于游乐场里的信息板,存放类的信息、常量、静态变量等,每当玩家(线程)玩一个新游戏(类)时,信息板上就会记录这个新游戏的信息(类的信息)。
本地内存
本地内存,就是JVM之外的内存,由操作系统直接管理,java程序可以通过特定的机制和接口访问和使用本地内存。
线程的角度看Java内存
通过上面的例子,可以发现使用Java内存的都线程,那么就有线程私有和线程共享两种分类。
- 线程私有
- 程序计数器:每个线程都有自己的程序计数器。程序计数器相对于一个标志,用来告诉线程执行到哪里了,从而实现多线程轮换切换。
- 虚拟机栈:每执行一个Java方法,就会在虚拟机栈中创建一个栈帧,执行完后出栈。
- 本地方法栈:类似于虚拟机栈,不过是每执行一个非Java方法就会在本地方法栈中创建栈帧,执行完后出栈。
- 线程共享:
- 堆:这里主要存放对象实例、字符串常量池、静态变量、线程分配缓冲区,所有的线程都可以使用。
- 方法区:这里主要存放类元信息(类的基本信息等)、运行时常量池。