
jvm学习笔记
文章平均质量分 71
Yoke______
这个作者很懒,什么都没留下…
展开
-
jvm----类文件结构
Java虚拟机提供的语言无关性Class类文件的结构Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符。Class的结构不像XML等描述语言,由于它没有任何分隔符号,所以在表6-1中的数据项,无论是顺序还是数量,甚至于数据存储的字节序(Byte Ordering Class文件中字节序为Big-Endian)这样的细节,都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,全部都不允许改变。魔数与Cl原创 2022-02-13 12:23:37 · 314 阅读 · 0 评论 -
jvm----类加载器
Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。类与类加载器比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。双亲委派模型两种不同的类加载器:一种是原创 2022-02-13 12:17:05 · 258 阅读 · 0 评论 -
jvm----类加载
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。类加载的时机一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段。其中验证、准备、解原创 2022-02-13 12:10:58 · 454 阅读 · 0 评论 -
jvm----对象的内存分配策略
对象的内存分配,从概念上讲,应该都是在堆上分配(而实际上也有可能经过即时编译后被拆散为标量类型并间接地在栈上分配 )原创 2022-02-13 10:58:13 · 656 阅读 · 0 评论 -
jvm----CMS垃圾收集器和Garbage FIrst 收集器
如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。垃圾收集器有很多,但是需要我去重点学习的就是CMS垃圾收集器和Garbage FIrst 收集器CMS收集器CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。基于标记-清除算法实现的,整个过程分为四个步骤:初始标记(CMS initial mark):初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。 并发标记(CMS concurrent mark):从原创 2022-01-23 11:02:40 · 114 阅读 · 0 评论 -
jvm---垃圾收集算法
因为对象死亡,所以要将他们回收,释放内存空间。Garbage Collect GC 垃圾收集分代收集理论弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到原创 2022-01-20 18:08:01 · 269 阅读 · 0 评论 -
jvm----强软弱虚引用
引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。强引用强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用软引用是用来描述一些还有用,但非必须的对象。只被软原创 2022-01-20 17:32:56 · 142 阅读 · 0 评论 -
jvm----如何判断一个对象实例“死亡”
引用计数算法在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。可达性分析算法通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。固定可作为GC原创 2022-01-20 17:24:55 · 268 阅读 · 0 评论 -
jvm----对象探秘
对象的创建类加载检查通过后,虚拟机将为新生对象分配内存。为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。指针碰撞假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump ThePointer)。空闲列表如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起原创 2022-01-20 17:11:43 · 749 阅读 · 0 评论 -
jvm----运行时数据区域
先导Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域:程序计数器(Program Counter Register)PCR是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里 ,字节.原创 2022-01-19 11:08:22 · 675 阅读 · 0 评论 -
jvm----内存分配原则
先导对象的内存分配,从概念上讲,应该都是在堆上分配(而实际上也有可能经过即时编译后被拆散为标量类型并间接地在栈上分配 )。在经典分代的设计下,新生对象通常会分配在新生中,少数情况下(例如对象大小超过一定阈值)也可能会直接分配在老年代。分配规则并不固定。接下来记录集中最基本的内存分配原则。对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC(只局限于新生代区域内的收集)。大对象直接进入老年代...原创 2022-01-19 10:49:38 · 151 阅读 · 0 评论