失效链接处理 |
JVM调优攻略 PDF 下载
本站整理下载:
提取码:y37e
相关截图:
主要内容:
2.2.1. 程序计数器
线程私有的,互不影响、独立存储,是当前线程执行的字节码的行号指示器。让字节码解释器工作时可以通过改变
这个计数器的值来选取下一执行的字节码的指令,分支、循环、跳转、异常、恢复都需要这个计数器来完成。
程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域。
2.2.2. 虚拟机栈
线程私有的,JAVA方法执行的动态内存模型,每个方法执行都会创建一个栈帧,伴随着方法创建到执行完成,用于
存储局部变量表、操作数栈、动态链接、方法出口信息等组成。
局部变量表:局部变量表存放编译器可知的基础类型(包括int、boolean、byte、char、short、lang、
double、float)以及对象引用(地址引用或者句柄引用)。大小在编译过程中以及分配,在方法执行中改变不
了大小
虚拟机栈常见的两种异常有:
StackOverFlowError:Java虚拟机栈的内存大小不允许动态扩展,当线程请求栈的深度超过当前Java虚拟
机定义的空间,则抛出 StackOverFlowError
OutOfMemoryError:Java虚拟机栈的内存大小许动态扩展,当线程请求栈的内存用完啦,则抛
出 OutOfMemoryError
2.2.3. 本地方法栈
与 虚拟机栈 类似,只不过它是虚拟机用到的 Native 方法服务的,也有栈帧,同样的也会抛出与 虚拟机栈 一样的
异常。
2.2.4. 堆
这是虚拟机所管理的内存中最大的一块,所有对象实例均存储在这块区域,因此也被人称作GC堆,也是垃圾回收
器重点工作的区域。分为:年轻代、老年代。
2.2.4.1. 年轻代
新生代也称年轻代(Young Gen)这里二者没有区别,所以在篇幅中我都会混着用。年轻代主要存放新创建的对
象,内存大小相对较小,垃圾回收比较频繁,将年轻代 再细分,它有 Eden 和两个 Suvivor (也可以叫
做 from 和 to ),二者之间默认比例为 8:1 ,至于为啥默认会是这样,后面会聊到。
2.2.4.2. 年老代
年老代主要存放 JVM 认为 生命周期比较长 的对象(经过几次的 Young Gen 的垃圾回收后仍然存在),内存大小相对
会比较大,垃圾回收也相对没有那么频繁(譬如可能几个小时一次)。年老代主要采用压缩的方式来避免内存碎片
(将存活对象移动到内存片的一边,也就是内存整理)。当然,有些垃圾回收器(譬如CMS垃圾回收器)出于效率
的原因,可能会不进行压缩。
2.2.4.3. 内存申请流程
|