自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 JVM-垃圾回收器

总:HotSpot虚拟机用到的垃圾回收器如下图所示。连线代表可以搭配使用两种分类: {串行回收器:Serial. Serial Old 并行回收器:ParNew. Parallel Scavenge. Parallel Old 并发回收器:CMS. G1(分区算法)} {新生代收集器: Serial、 ParNeW、Parallel Scavenge; 老年代收集器: Serial Old、 Parallel Old、 CMS;

2021-12-02 14:39:38 310

原创 JVM-垃圾收集算法

总:垃圾收集算法分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)。或称为直接垃圾收集和间接垃圾收集。主流java虚拟机用Tracing GC。三种算法:标记-清除,标记-复制,标记-整理。在分代收集中:新生代:每次收集都会有大量对象死去,所以可以选择复制算法 老年代:对象存活几率高,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。因为移动是一个风险动作,移动必须暂停用户应用应

2021-12-01 23:07:40 290

原创 redis-对象使用的底层数据结构(一)

总:底层数据结构有简单动态字符串,链表,字典,跳跃表,整数集合,压缩列表一.SDS(简单动态字符串):redis默认字符串1.结构:struct sdshdr { // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度 int len; // 记录buf数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[];}; 2.使用\0结尾好处:

2021-12-01 23:02:23 857

原创 JVM-分代收集

总:三个分代理论造就了分代收集,收集器将java堆根据年龄(熬过垃圾收集的次数)分为新生代,老年代。针对这些代有了三种回收类型:Minor GC,Major GC,Mixed GC,Full GC三个假说:弱分代假说:对象都是朝生夕灭 强分代假说:熬过多次垃圾收集的对象难死 跨代引用假说:对象间存在跨代引用,但是跨代引用少,因为一般他们是同生同灭。在新生代上建立一个全局的数据结构(叫做记忆集),它将老年代划分为若干块,标识出哪一块存在跨代引用。当发生Minor GC时,只有这块会加入到

2021-11-30 14:18:37 261

原创 JVM-宣告对象死亡

总:两次标记过程一.第一次标记:可达性分析算法中,判定为不可达对象,标记一次二.第二次标记筛选条件:是否有必要执行finalize()方法,如果有就会被放进F-Queue队列里。想要在finalize()里拯救自己,就要与引用链上的对象关联⚠️:finalize方法只能用一次,以为运行代价高已经被抛弃,可以用try-finally代替...

2021-11-30 12:02:33 55

原创 JVM-引用reference

背景:JDK1.2之前,Java中引用的定义很传统:如果reference类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。JDK1.2以后,Java对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种(引用 强度逐渐减弱)总:引用分为强引用、软引用、弱引用、虚引用四种。一.强引用(StrongReference)垃圾回收器不会回收它。二.软引用(SoftReference)如果内存空间不足了,就会回收这些对象的内存。

2021-11-30 11:52:33 270

原创 JVM-判断对象是否死亡

总:对堆垃圾回收前的要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。两种方法:引用计数法和可达性分析算法。一.引用计数法:给对象中添加一个引用计数器,引用一次,加1;引用失效,计数器减1;计数器为0的对象是不可能再被使用的。注意:不被主流虚拟机使用,因为要考虑很多情况。比如两个没用的对象相互循环引用,A引用B,B引用A。二.可达性分析算法:通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点向下搜索, 节点所走过的路径称为引用链,当一个对象到 GC Roots

2021-11-30 11:41:29 112

原创 JVM-访问对象的方式

总:通过栈上的 reference 数据来操作堆上的具体对象。两种方式:使用句柄和直接指针(reference:指向对象的引用)。主要使用直接指针一.使用句柄:Java堆中会划分出一块内存来作为句柄池,reference 中存 储对象的句柄地址,句柄中包含了对象实例数据与类型数据各自的具体地址信息;1.优点:reference存储的是稳定句柄地址,对象移动(垃圾收集时)时只用改变指针,reference不用改二.直接指针:reference 中存储的直接就是对象的..

2021-11-30 11:11:42 287

原创 JVM-对象在内存里的存储布局

三部分:对象头,实例数据,对齐填充一.对象头包括两类信息1.Mark Word:存储对象运行的数据2.类型指针:对象指向的类型元数据的指针(如果是数组还需要记录数组长度)二.实例数据;存储自己和父类的东西。1.存储顺序:父类信息先,子类后 相同宽度字段分配到一起三.对齐填充:对象大小必须是8字节整数倍,用占位符来补齐...

2021-11-30 11:00:08 53

原创 JVM-java对象创建过程

一.类加载检查遇到new指令->看在常量池能否定位到这个参数的类引用和看这个类是否已经被加载,解析和初始化过。二.分配内存1.两种分配方式:指针碰撞:java堆中内存是所有用过和没用过的内存分开放的,中间用指针分界,那么分配时就把指针向空闲区挪。(Serial,ParNew) 空闲列表:java堆中内存是所有用过和没用过的内存分开放的一起放的,用列表记录那些内存块可用,分配时在列表上找够大的内存,并更新列表(CMS)注意:分配方式跟你用的垃圾收集器是否有空间压缩整理功能(c..

2021-11-30 10:36:33 390

原创 JVM-java内存区域

一.背景:java虚拟机拥有控制内存的权利,一旦内存泄露和溢出,我们要了解虚拟机怎么使用内存才能找出错误二.元素每个线程私有的:1.程序计数器:当前线程执行的字节码的地址(如果是本地方法,计数器为空),字节码解释器通过改变这个计数器的值来选取下条需要执行的指令(没有OutOfMemoryError情况)2.java虚拟机栈:是java方法执行的线程内存模型,每个方法执行都会创建一个栈帧,方法执行完后就出栈。栈帧存储局部变量表 {用Slot局部变量槽的方式存储基本数据类型bo...

2021-11-30 10:12:46 500

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除