![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
《深入理解Java虚拟机》笔记
文章平均质量分 70
Daniel_2046
这个作者很懒,什么都没留下…
展开
-
Java内存区域的划分
运行时数据区包括:方法区、堆、虚拟机栈、本地方法栈、程序计数器。其中前两个是线程共享的,后面三个是线程私有的。1.方法区: 方法区存储被虚拟机加载的类信息(类的名称、方法信息、字段信息)、常量、静态变量、JIT编译后的代码。是线程共享的, 方法区里有一个部分叫常量池,编译期生成的各种字面量和符号引用会在类加载后进入方法区的运行时常量池中。在厂商的实现中,常量池里通常还会存放翻译...原创 2018-06-03 23:20:35 · 129 阅读 · 0 评论 -
Java的GC
垃圾收集简称GC。在C/C++中,如果一个变量不再使用,需要程序员手动释放相应的内存,当程序很长,变量很多的时候,这种操作就变得非常繁琐,容易出错。从开发的角度看,程序员也不应该在内存分配释放这样的事情上消耗太多精力。于是有了GC。where? 程序计数器、虚拟机栈、本地方法栈是线程私有的,随线程创建和消亡,栈帧的大小在类结构确定下来时已经确定,这些部分内存的分配和回收具备确定性。而...原创 2018-06-21 14:25:17 · 179 阅读 · 0 评论 -
对象的创建
此处指普通Java对象的创建,不包括数组、Class对象。JVM遇到一条new指令时,会执行以下动作。1.检查类的加载if((这条指令的参数能否在常量池中找到一个类的符号引用)&&(这个符号引用代表的类已经被加载、解析、初始化)) { //类已经加载 } }else { 执行加载过程 } 2.为新建的对象分配内存,所需内存大小在类加载完成后已经确定。if(堆内存是规整的) { ...原创 2018-06-06 23:52:14 · 127 阅读 · 0 评论 -
对象的内存布局
在HotSpot虚拟机中,对象在内存中的布局分为三块:对象头、示例数据、对齐填充。1.对象头 包括两部分:Mark Word、类型指针、数组长度(if 数组对象) (1)Mark Word:存储对象自身的运行时数据(哈希码、GC年龄、锁标志、持有的锁等)。被设计成非固定数据结构,根据对象状态服用内部空间。 (2)类型指针:对象指向它的类元数据的指针。虚拟机通过这个指针确定对象是哪...原创 2018-06-07 12:42:31 · 268 阅读 · 0 评论 -
HotSpot中的OopMap、Safe Point和Safe Region
1.OopMap 在正式的GC之前,要进行可达性分析来标记出将来可能要宣告死亡的对象。如果每次GC的时候都要遍历所有的引用,这样的工作量是非常大的。因为在可达性分析的时候要保证期间不发生引用关系的变化,所有执行线程要停顿等待,称为“Stop The World”,程序中的线程需要停止来配合可达性分析。 所以,每次直接遍历整个引用链肯定是不现实的。 为了应对这种尴尬的问题,最早有保守式G...原创 2018-06-23 21:13:42 · 5121 阅读 · 0 评论 -
JVM内存分配策略
对象的内存分配,主要是分配在新生代的Eden区上,如果启动了本地线程分配缓冲,就按线程优先在TLAB上分配,如果TLAB不够用,再分配在Eden上,如果Eden上也不够用,就分配在老年代中。分配规则的细节取决于垃圾收集器组合和虚拟机与内存相关的参数的配置。对象优先在Eden上分配 大多数情况下,对象在Eden上分配。 如果Eden上空间不够,VM会发起一次新生代GC(Mino...原创 2018-06-24 22:30:41 · 189 阅读 · 0 评论 -
Java类加载机制:加载的时机
Java类的加载机制与C语言不同。C语言在在编译器进行连接工作,而在Java中,类的加载、连接和初始化工作都是在程序运行期间完成的。这种策略虽然在类加载时稍微增加了性能开销,却未Java程序提供了高度的灵活性。Java天生可以动态扩展的语言特性就得益于这一点。类加载的时机 类的生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。其中验证、准备、解析三个部分统称连接(Linking...原创 2018-06-26 17:44:54 · 176 阅读 · 0 评论