JVM学习一.Java虚拟机内存区域介绍
去大厂面试,二话不说,问到是Java内存区域划分你清楚吗?
我刚刚写着业务代码,就随便答了几句,回头看了书,我的天,回头想想,我的回答简直就驴头不对马嘴,但是吧,大厂就是大厂,让人又爱又恨,趁着有空,就把《深入理解Java虚拟机》这本书掏了出来,疯狂恶补。不扯了,入正题!
虚拟机运行时,5大内存区域:
方法区,虚拟机栈(我们常说的栈区),本地方法栈,堆区,程序计数器。
内存区域作用范围介绍:
程序计数器
简单描述:控制程序的执行,类似当前线程的的信号指示器。
控制线程循环,跳转,异常处理,线程恢复等,各线程之间的计数器互不影响,独立存储,线程私有。
虚拟机栈
线程私有,生命周期与线程相同。
每个栈都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接(不太清楚,后期清楚补上),方法出口等信息,一个方法从开始调用,到执行完成,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
存储的局部变量包括:常用数据类型,和对象引用地址(reference)。
这边要说到两个异常:一个时StackOverflowError和OutOfMemoryError两个异常了(不展开)
本地方法栈
Java虚拟机为虚拟机执行Java方法服务开辟出来的栈区。
不过大部分虚拟机把本地方法栈和虚拟机栈合并起来了。
堆区
Java堆时Java虚拟机锁管理的内存中最大的一块,重点Java堆被所有线程共享。
我们经常说的新生代,老生代就在堆上面,也是垃圾收集器的主要区域。
(几乎)所有的对象实例以及数组都在堆上分配。
为什么是几乎而不是绝对呢?
随着JIT编译器发展与逃逸分析技术逐渐成熟,一些优化技术(栈上分配,标量替换)导致一系列微妙变化,也变得不是那么绝对了。
堆区又具体细分:新生代和老年带
新生代又细分:Eden,From survior,ToSuvivor;占比空间约:8:1:1
方法区
它和Java堆一样各个线程共享。
它主要存放:虚拟机加载的类信息,常量,静态变量,即时编译其编译后的代码(这个没有听说过,大神指导)
常量池:静态和动态
静态:比方说静态类加载完毕,这个时候各种常量也已经生成了,就在这个里面
动态:它也是方法区的一部分,不过不是在编译期产生的,运行期间也可以将新的常量放进去。常用的String intern().
参考:《深入理解Java虚拟机》
- jvm学习笔记1:JVM内存数据区域介绍
- Java虚拟机学习 - JVM内存区域模型:
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
- jvm虚拟机学习之内存区域介绍
- Java基础学习总结(96)——Java虚拟机JVM及Tomcat中的JVM有关内存的设置与调优
- jvm笔记一(java虚拟机和java内存区域)
- Java虚拟机深入学习之一: Java虚拟机的内存区域
- 学习JVM之java内存区域与异常
- java内存区域与内存异常(jvm学习)
- Java虚拟机学习笔记1-内存区域
- Java 内存区域和GC机制以及JVM(Java虚拟机)优化大全和案例实战
- JVM内存区域划分 (粗略认识介绍)
- 深入理解Java虚拟机---(1)JVM五大内存区域划分
- JVM内存区域介绍
- JVM学习系列(二)——JAVA内存区域
- JVM内存区域介绍
- JAVA虚拟机(JVM)划重点 第二章 Java内存区域与内存溢出异常 之 运行时数据区域
- 学习深入理解jvm虚拟机心得——Java内存区域与常见内存溢出异常(1)
- java虚拟机学习之路-java内存区域与内存溢出异常
- Java虚拟机内存区域详细介绍