您的位置:首页 > 编程语言 > Java开发

JVM学习一.Java虚拟机内存区域介绍

2018-12-20 22:35 197 查看

去大厂面试,二话不说,问到是Java内存区域划分你清楚吗?
我刚刚写着业务代码,就随便答了几句,回头看了书,我的天,回头想想,我的回答简直就驴头不对马嘴,但是吧,大厂就是大厂,让人又爱又恨,趁着有空,就把《深入理解Java虚拟机》这本书掏了出来,疯狂恶补。不扯了,入正题!

虚拟机运行时,5大内存区域:

方法区,虚拟机栈(我们常说的栈区),本地方法栈,堆区,程序计数器。

内存区域作用范围介绍:

程序计数器
简单描述:控制程序的执行,类似当前线程的的信号指示器。
控制线程循环,跳转,异常处理,线程恢复等,各线程之间的计数器互不影响,独立存储,线程私有。
虚拟机栈
线程私有,生命周期与线程相同。
每个栈都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接(不太清楚,后期清楚补上),方法出口等信息,一个方法从开始调用,到执行完成,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
存储的局部变量包括:常用数据类型,和对象引用地址(reference)。
这边要说到两个异常:一个时StackOverflowError和OutOfMemoryError两个异常了(不展开)
本地方法栈
Java虚拟机为虚拟机执行Java方法服务开辟出来的栈区。
不过大部分虚拟机把本地方法栈和虚拟机栈合并起来了。
堆区
Java堆时Java虚拟机锁管理的内存中最大的一块,重点Java堆被所有线程共享。
我们经常说的新生代,老生代就在堆上面,也是垃圾收集器的主要区域。
(几乎)所有的对象实例以及数组都在堆上分配。
为什么是几乎而不是绝对呢?
随着JIT编译器发展与逃逸分析技术逐渐成熟,一些优化技术(栈上分配,标量替换)导致一系列微妙变化,也变得不是那么绝对了。
堆区又具体细分:新生代和老年带
新生代又细分:Eden,From survior,ToSuvivor;占比空间约:8:1:1
方法区
它和Java堆一样各个线程共享。
它主要存放:虚拟机加载的类信息,常量,静态变量,即时编译其编译后的代码(这个没有听说过,大神指导)
常量池:静态和动态
静态:比方说静态类加载完毕,这个时候各种常量也已经生成了,就在这个里面
动态:它也是方法区的一部分,不过不是在编译期产生的,运行期间也可以将新的常量放进去。常用的String intern().

参考:《深入理解Java虚拟机》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: