JVM
文章平均质量分 54
SuNew_bee
这个作者很懒,什么都没留下…
展开
-
类加载器
类与类加载器 任意一个类,必须由加载它的加载器和类本身一起确定它在JVM中的唯一性,每一个类加载器都拥有一个独立的类名称空间。 所以,比较两个类是否相等只有在两个类是由同一个加载器加载的前提下才有意义,若加载器不同,则两个类必不可能相等。 这里的“相等”,包括代表类的 Class 对象的 equals() 方法、isInstance() 方法的返回结果,也包括使用 instanceof 关键字做对象所属关系判定等情况。双亲委派模型从JVM的角度看类加载器分为两类: 1、启动类加载器(原创 2021-05-20 22:23:27 · 144 阅读 · 0 评论 -
类加载的过程
类加载的过程分为:加载、验证、准备、解析和初始化五个阶段。加载 加载是类加载过程中的一个阶段,切勿混淆。 加载需要完成三件事:1、通过类的全限定类名来获取类的二进制字节流。2、将字节流代表的静态存储结构转化为方法区的运行时数据结构。3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区该类的数据访问入口。 对于非数组类型来说,既可以使用虚拟机内置的引导类加载器来完成,也可以用用户自定义的类加载器完成。 对于数组类型来说,数组类本身不通过类加载器创建,但数组的原创 2021-05-20 21:12:40 · 2814 阅读 · 0 评论 -
类加载时机
类从被加载到虚拟机到被卸载出内存为止,它的生命周期经历:加载、验证、准备、解析、初始化、使用、卸载七个阶段。 其中加载、验证、准备、初始化、卸载五个阶段的顺序是确定的。类进行初始化的情况1、遇到new、getstatic、putstatic、invokestatic四条字节码指令时,如果类没有进行过初始化则需要初始化。 生成这四条字节码指令的情况: ①使用new关键字 ②读取或设置一个类型的静态字段 ③调用一个类型的静态方法2、使用java.lang.reflect包原创 2021-05-19 19:32:42 · 100 阅读 · 0 评论 -
HotSpot经典垃圾收集器
Serial收集器它是新生代收集器,采用复制算法,只开启一条GC线程,在垃圾收集过程中需要暂停所有用户线程。该收集器适合客户端使用,因为客户端内存和堆都较小,用户感觉不到明显的停顿。Serial的优点在于只开启一条收集线程,避免上下文切换,简单高效。ParNew收集器ParNew是Serial收集器的多线程并行版本,采用复制算法,同样是新生代收集器。同样在进行回收时需要暂停所有用户线程。除了Serial收集器,只有ParNew收集器才能与CMS搭配使用。并行处理器:描述的是多条垃圾收集器线程并行原创 2021-05-19 18:17:51 · 83 阅读 · 0 评论 -
垃圾收集算法
分代收集理论分代假说:1、弱分代假说:绝大多数对象都是朝生夕灭的。2、强分代假说:熬过越多次垃圾收集的对象就越难消亡。跨代引用假说:跨代引用相对于同代引用只占极少数。根据这条假说,不应再为少量跨代引用扫描整个老年代,不必浪费空间记录每一个对象跨代引用的情况,只需在新生代建立一个全局的数据结构“记忆集”,把老年代分为若干小块,标识出老年代的哪一块存在跨代引用。发生新生代垃圾收集时,只有包含跨代引用的小块内存会被加入到GC Roots进行扫描。分代垃圾收集部分收集 Partial GC:不是完整收集原创 2021-05-19 14:23:01 · 75 阅读 · 0 评论 -
对象存活
判断对象是否存活在垃圾回收前需要判断对象是否存活。判定算法:1、引用计数法:在对象中添加一个引用计数器,有一个地方引用它计数器就加一,引用失效时就减一,计数器为零时就是不再使用的对象了,即对象已死。存在的问题:重复引用,当一个对象A引用对象B,而对象B引用对象A时,计数器永不为零,即使这两个对象不再被访问了也不会被回收。2、可达性分析:通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始根据引用关系向下搜索,路径称为引用链,如果某个对象到GC Roots间没有引用链相连的话,则认原创 2021-05-18 22:16:45 · 93 阅读 · 0 评论 -
对象的内存布局和对象的访问定位
对象的布局 在HotSpot中,对象的布局划为三个部分:对象头、实例数据、对其填充对象头对象头包含两类信息:1、存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。2、类型指针,指向对象的类型元数据的指针,通过该指针能确定对象是哪个类的实例。但是,查找对象的元数据信息不一定要经过对象本身。实例数据该部分是对象真正存储的有效信息。对齐填充没有特殊的作用,仅仅起占位符的作用。HotSpot虚拟机要求对象大小的8字节的整数倍,当对象大小不符合原创 2021-05-18 18:43:30 · 91 阅读 · 0 评论 -
Java对象的创建
Java对象的创建过程:1、JVM遇到一个new指令时,先检查指令的参数能否在常量池中定位到一个类的符号引用,并检查类是否已被加载、解析和初始化。如果没有先进行类加载。2、在类加载检查后,JVM为对象分配内存。对象的大小在类加载完成后就可以确定,分配内存就是把一块空间从堆中分配给对象。对象空间分配方式: ①“指针碰撞”:当堆中内存是规整的情况下的策略,即被使用过的内存放 在一边,没有使用过的内存放在另一边,分界点有一个指针。分配内存时只需将指针往未分配的方向移动对象的大小即可。 ②“空闲列表原创 2021-05-18 18:14:00 · 91 阅读 · 0 评论 -
JVM内存区域
JVM运行时数据区域JVM数据区域分为:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量。程序计数器程序计数器是一块较小的内存空间,可以看做是字节码的行号指示器。在JVM多线程程序中,为了程序切换后能恢复到正确的执行位置,每条线程都有一个程序计数器,占用线程独有的内存空间。Java虚拟机栈Java虚拟机栈是线程私有的,生命周期与线程相同。方法被执行的时候,JVM会创建一个栈帧存储局部变量表、操作数栈、动态链接、方法出口等信息。方法的调用和执行完毕分别对应栈帧出栈入栈的过程原创 2021-05-18 16:14:06 · 67 阅读 · 0 评论