Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。关于回收内存这一点,我们会在下面的内容去介绍虚拟机中的垃圾收集算法,现在我们来探讨一下给对象分配内存的那点事儿。
知道JVM对象分代,了解虚拟机优化。
1.了解对象在各个年代的状态。
2.了解垃圾回收机制。
JVM会怎么分配内存?大多数人的回答是内存分为堆和栈,但实际上内存的分配比堆栈更严格
内存被划分为5个大区:程序计数器、本地方法栈、虚拟机栈、堆、方法区。
程序计数器(线程独享)当前线程所执行的字节码的行号指令器,通过改变计数器的值选取虚拟机下一条需要执行的字节码指令,分支、循环、跳转、异常、线程恢复等基础功能。
虚拟机栈(线程独享)JAVA方法执行的内存模型,每个方法在执行的同时都会存建一个栈帧用于存储方法出口、局部变量表、操作数栈、动态连接等信息,局部表量表(大多数人认为的栈)用于存放可知各种数据类型(Boolean、byte、char、short、int、float、long、double)、对象引用类型和returnAddress(指向了一个字节码指令地址)
本地方法栈与虚拟机栈的作用非常相似,它们之间的区别是虚拟机栈为虚拟机执行JAVA方法服务,本地方法栈为Native方法服务。
方法区(线程共享)被虚拟机加载的常量、静态量、方法描述、类信息等。JAVA虚拟机规范把方法区描述为堆的一个逻辑部分,但它还有一个别名叫做Non-Heep 运行时常量池:方法区的一部分,用于存放编译时的字面量、符号引用。
堆(线程共享)在分配对象时,对象包括了三部分内容:对象头(存储自身运行数据