后端面试笔记深入理解JVM笔记
大家好,我是老田 这段时间我有刷了一遍JVM,整理成一篇文章,就当做笔记和大家分享。 前言刷豆瓣看到《深入理解JVM》出第三版了,遂买之更新JVM知识,本文为笔记,仅供个人Review。 Java内存区域与内存溢出运行时数据区域参考:JVM规范,MemoriesofaJavaRuntime 堆:JVM启动时按-Xmx,-Xms大小创建的内存区域,用于分配对象、数组所需内存,由GC管理和回收 方法区:存储被JVM加载的类信息(字段、成员方法的字节码指令等)、运行时常量池(字面量、符号引用等)、JIT编译后的CodeCache等信息;JDK8前Hotspot将方法区存储于永久代堆内存,之后参考JRockit废弃了永久代,存储于本地内存的Metaspace区 直接内存:JDK1.4引入NIO使用Native/Unsafe库直接分配系统内存,使用Buffer,Channel与其交互,避免在系统内存与JVM堆内存之间拷贝的开销 线程私有内存 程序计数器:记录当前线程待执行的下一条指令位置,上下文切换后恢复执行,由字节码解释器负责更新JVM栈描述Java方法执行的内存模型:执行新方法时创建栈帧,存储局部变量表、操作数栈等信息存储单位:变量槽slot,long,double占2个slot,其他基本数据类型、引用类型占1个,故表的总长度在编译期可知本地方法栈:执行本地C/C++方法JVM对象1.创建对象 分配堆内存:类加载完毕后,其对象所需内存大小是确定的;堆内存由多线程共享,若并发创建对象都通过CAS乐观锁争夺内存,则效率低。故线程创建时在堆内存为其分配私有的分配缓冲区(TLAB:ThreadLocalAllocationBuffer) 内存模型分配流程注:当TLAB剩余空间不足以分配新对象,但又小于最大浪费空间阈值时,才会加锁创建新的TLAB 零值初始化对象的堆内存、设置对象头信息、执行构造函数()V 2.对象的内存布局 对象头 MarkWord:记录对象的运行时信息,如hashCode,GC分代年龄,尾部2bit用于标记锁状态ClassPointer:指向所属的类信息数组长度(可选,对象为数组):4字节存储其长度对象数据:各种字段的值,按宽度分类紧邻存储 对齐填充:内存对齐为1个字长整数倍,减少CPU总线周期 验证:openjdk/jol检查对象内存布局 publicclassUser{privateintage=-1;privateStringname="unknown";}//java-jar~/Downloads/jol-cli-latest.jarinternals-cp. |
转载请注明地址:http://www.tanhuaa.com/gyth/10951.html
- 上一篇文章: 初中语文个优秀作文开头,需要的快收
- 下一篇文章: 发现middot思考middot