JVM-3-JVM内存结构
2024-08-31 10:00:34
JVM内存结构可以大致可划分为线程私有区域和共享区域,
线程私有区域由虚拟机栈、本地方法栈、程序计数器组成,而共享区域由堆、元数据空间(方法区)组成。
虚拟机栈/本地方法栈
当你碰到过StackOverflowException这个异常的时候,有没有思考下为什么会出现这样的异常呢?答案就在虚拟机栈中,JVM会为每个方法生成栈帧然后将栈帧压入虚拟机栈中。
举个粟子:假设JVM参数-Xss设置为1m,如果某个方法里面创建一个128kb的数组,那这个方法在同一个线程中只能递归4次,再递归第五次的时候就会报StackOverflowException异常,因为虚拟机栈的大小只有1m,每次递归都需要为方法在虚拟机栈中分配128kb的空间,很显示到第五次的时候就空间不足了。
程序计数器
程序计数器是一个记录着当前线程所执行的字节码的行号指示器。
JVM的多线程是通过CPU时间片轮转(即线程轮流切换并分配处理器执行时间)算法来实现的。也就是说,某个线程在执行过程中可能会因为时间片耗尽而被挂起,而另一个线程获取到时间片开始执行。
简单的说程序计数器的主要功能就是记录着当前线程所执行的字节码的行号指示器。
方法区(元数据区)
方法区存储了类的元数据信息、静态变量、常量等数据。
堆(heap)
平常大家使用new关键字创建的对象都会进入堆中,堆也是GC重点照顾的区域,堆会被划分为:新生代、老年代,而新生代还会被进一步划分为Eden区和Survivor区:
新生代中的Eden区和Survivor区,是根据JVM回收算法来的,只是现在大部分都是使用的分代回收算法,所以在介绍堆的时候会直接将新生代归纳为Eden区和Survivor区。
小结:
- JVM内存结构划分为线程私有区域和共享区域。
- 虚拟机栈/本地方法栈负责存放线程执行方法栈帧。
- 程序计数器用于记录线程执行指令的位置。
- 方法区(元数据区)存储类的元数据信息、静态变量、常量等数据。
- 堆(heap)使用new关键字创建的对象都会进入堆中,堆被划分为新生代和老年代。
最新文章
- Linux下搭建nginx php环境
- java用spring实现文件下载
- C++: byte 和 int 的相互转化
- 原生Ajax书写
- .NET设计模式(5):工厂方法模式(Factory Method)
- memcached采用的网络模型
- checkbox 删除
- TreeView 数据绑定及选中命令处理
- Linux中下载,压缩,解压等命令
- Codeforces780C
- hyperopt自动调参
- JS和CSS交互的方法
- Python运维开发基础02-语法基础【转】
- cat语法
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
- C++并发编程之std::async(), std::future, std::promise, std::packaged_task
- PHP array_unique()函数去除重复元素
- LOJ2316. 「NOIP2017」逛公园【DP】【最短路】【思维】
- js判断是否为数组
- Python Twisted系列教程19:改变之前的想法
热门文章
- Microsemi Libero使用技巧——使用第三方编辑器Notepad++
- 短信相关的AT指令以及信令
- mysql从5.6升级到5.7后出现 Expression #1 of ORDER BY clause is not in SELECT list,this is incompatible with DISTINCT
- Dockerfile优化
- QT Creator: The process could not be started!
- 12. java ArrayList类
- MyBatis的ResultMapping和ResultMap
- Vue 03
- leetcode-math
- Java之通过接口获取数据并用JDBC存储到数据库中