图1 深入理解java虚拟机封面
大家好!最近第三遍看这本书,颇有心得,自己也算深入的了解到了不少知识,从这本书里提取了自己认为比较重要的知识点分享给大家,还有自己的一些图例总结。
侧重于本书的以下几章内容:第2章-java内存区域与内存溢出异常、第3章-垃圾收集器与垃圾回收策略、第6章-类文件结构、第7章-虚拟机类加载机制、第8章-虚拟机字节码执行引擎。下图是我自己绘制的一个图例,简单介绍了一下这几章之间的联系:
图2 主要章节链接图例
从上图可以看出,这几个主要章节是有一定的内在联系。虚拟机中内存占用最大的就是堆内存,而对象的实例就存在堆中,所以这部分内存的使用效率最高。java语言是面向对象的,而对象是怎样来占用堆中这部分内存的呢?下面内容或者下面几期我会为大家揭开迷雾!
当然,java虚拟机中不仅仅只有堆占用内存还有:java虚拟机栈、程序计数器、本地方法栈、方法区这5类瓜分虚拟机内存。如下图:
图3 运行时数据区
如上图所示,由java虚拟机管理的这五部分数据区域,可分为两大类:一类是线程共享的,一类是线程私有的。而线程私有的数据区,每一部分的内存和线程的生命周期相同,每个线程之间互不影响,独立存储。
线程共享的区域可分为:java堆(占用的内存最大)、方法区
java堆:在虚拟机启动时创建,几乎所有对象的实例都在堆上分配内存。是垃圾收集器管理的主要区域
方法区:主要存储运行时常量池、常量、静态变量、已被虚拟机加载的类信息、即时编译器编译后的代码等数据
线程私有的区域可分为:程序计数器、java虚拟机栈、本地方法栈
程序计数器: 存储当前线程执行的字节码的行号指示器
java虚拟机栈: 是描述java方法执行的内存模型,每个方法在执行时都会申请一段内存存放方法执行时的数据,称为栈帧;其包含局部变量、操作数栈、动态链接、方法出口等数据。JVM是基于栈的,所以每个方法从开始执行到结束,对应这一个栈帧在虚拟机中入栈到出栈的过程。
下期会接着分享类加载机制~敬请期待!