自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程安全集合类

文章目录1. ConcurrentHashMapJDK 8 ConcurrentHashMap源码分析1. ConcurrentHashMapJDK 8 ConcurrentHashMap源码分析ForwardingNode在一个桶数组中的元素全部被搬迁完毕的时候会用来标记那个桶数组,表示它已经搬迁完毕了;同时还有一个作用就是当访问桶数组的时候,如果一个桶数组项已经被ForwardingNode标记了,那么就应该在新的桶数组(已经被扩容了的数组)中进行数据的访问;先扩容再红黑;大于8小于6;构造

2021-09-07 20:44:50 346 2

原创 Java并发编程(2)

文章目录1. Java内存模型1. JMM简介2. 可见性3. 两阶段终止模式1. Java内存模型1. JMM简介JMM的细节在JVM的总结中已经将结果了,在这里不在赘述,只总结必要的内容;Java内存模型在Java层面定义了主存,工作内存的抽象概念,底层对应着CPU寄存器,缓存,硬件内存,CPU指令优化等,JMM主要体现在以下的几个方面:原子性:保证指令不会受线程上下文的影响;可见性:保证指令不会受CPU缓存的影响;有序性:保证指令不会受CPU指令并行优化的影响;JMM使得每

2021-08-31 15:13:24 211

原创 Java并发编程(1)

文章目录1. Java线程1. 线程的应用2. 创建线程3. 各个Java方法的使用1. Java线程1. 线程的应用线程可以使程序实现异步调用,如果调用之后需要等待结果返回才能继续运行就是同步;不需要等待结果的返回就可运行就是异步;比如读取磁盘的操作,如果采用同步的话,就必须等待磁盘数据读取完毕,但是读取磁盘的操作是不需要CPU的,CPU将保持空闲状态,所以说浪费了CPU的利用率。但是线程允许CPU异步执行,在读取磁盘的时候CPU可以运行其它的线程而不需要空等,当磁盘操作完成的时候,CPU在选

2021-08-27 21:57:02 297

原创 CSAPP笔记(下)

文章目录1. 链接1. 简介2. 编译驱动程序3. 静态链接4. Linux x86-64的内存映像2. 异常控制流1. 简介1. 链接1. 简介链接是将各种代码和数据片段收集在一起并且组合成为一个单一的文件的过程,所得到的文件可以被加载到内存并执行;链接可以发生在编译时,也就是源代码被翻译成机器码的时候;也可以发生在加载时,也就是程序被加载到内存并执行的时候;也可以执行于运行时,也就是由应用程序来执行。在现代系统中,加载是由连接器完成的;加载是我们可以做到分离编译,我们不需要将一个大型的应用

2021-08-03 21:42:45 606

原创 CSAPP笔记(上)

文章目录1. x86-64机器码可见的寄存器2. 过程及过程调用1. x86-64机器码可见的寄存器程序计数器:给出将要执行的下一条指令在内存中的地址;整数寄存器文件:包含16个命名的位置,分别存储64位的值;这些寄存器可以存储地址空间,比如C语言中的指针,也可以存储整数数据;有的寄存器被用来存储比较重要的程序状态,而其他的寄存器可以用来保存临时的数据,比如说过程的参数以及局部变量和函数的返回值;条件码寄存器:保存着最近执行的算数或者是逻辑指令的状态信息,他们用来实现控制数据流中的条件变化,比

2021-07-25 21:11:48 956 3

原创 Netty部分源码分析

文章目录1. Netty启动流程2.1. Netty启动流程// Selector selector = Selector.open(); // 创建 NioServerSocketChannel,同时会初始化它关联的 handler,以及为原生 ssc 存储 configNioServerSocketChannel attachment = new NioServerSocketChannel();// 创建 NioServerSocketChannel 时,创建了 java 原生的

2021-06-10 22:41:46 150

原创 Netty进阶

文章目录1. Netty的粘包与半包现象1.1 粘包现象1. Netty的粘包与半包现象1.1 粘包现象

2021-06-07 21:41:35 222

原创 Netty基础

文章目录1. Netty概述2. Netty入门案例3. 组件1. Netty概述Netty是什么:Netty is an asynchronous event-driven network application framework for rapiddevelopment of maintainable high performance protocol servers & clients.也就是说Netty是一个异步的,基于事件驱动的网络应用框架,用于快速开发可维护,高性

2021-06-06 15:05:25 178

原创 NIO基础

文章目录1. NIO与IO的区别与联系2. NIO三大组件的解释3. NIO的工作流程步骤4. 使用ByteBuffer1. NIO与IO的区别与联系NIO是JDK1.4中引入的一组新的API(New IO),可以替代标准的Java IO,NIO与IO有着同样的作用和目的,但是NIO将以更加高效的方式进行文件的读写操作;NIO是以块处理数据的,但是普通的IO是以最基础的字节流进行写入和读取的,所以在执行效率上NIO会比普通的IO高出不少;NIO虽然不同于IO用OutPutStream输出流和I

2021-06-02 22:28:29 410 1

原创 自己实现一个栈和队列

文章目录1. 栈2. 队列3. 双端队列4. 循环队列5. 循环双端队列1. 栈在这里实现的栈都是基于之前自己实现的ArrayList以及链表,所以说通篇下来代码量比较的少,实际上JDK也是根据已有的数据结构来实现栈的,当然JDK需要考虑的方面肯定比我们考虑的要多很多,至于JDK对栈的具体实现方式在之后的源码分析之中会讲解到;栈是一种特殊的线性表,它只允许我们在一端进行操作,所以说我们先加进去的元素会比后加进去的元素要更晚的出栈,也就是栈结构先进后出的特点;往栈里面添加元素的操作通常被称为入栈,

2021-05-26 20:27:22 160 1

原创 操作系统中常见的调度算法

文章目录一、MLFQ如何改变优先级实例1. 单个长工作实例2. 外加一个短工作实例3. 加上I/O当前MLFQ的一些问题解决方案1:提升优先级解决方式2:更好的计时方式二、比例份额一、MLFQ如果我们想要获得表现更优异的周转时间,那么我们就会采用SJF或者是STCF,这两个调度算法必须知道一个工作会运行多长时间,但是在实际的情况中,OS通常并不知道一个工作会运行多久,所以说SJF和STCF在很多情况下是不能使用的;同时,由于现代的OS很多都是应用于个人PC上面的,所以我们需要OS提供良好的响应时

2021-05-19 20:30:47 3479

原创 JVM方法调用

文章目录一、动态链接二、方法调用1.引入库三、虚方法和非虚方法四、虚拟机中提供了以下几条方法调用指令五、关于invoke dynamic指令六、动态类型语言和静态运行语言七、方法重写的本质八、方法返回地址一、动态链接注意:运行时常量池位于方法区中,在JDK1.7及之后版本的JVM已经将运行时常量池从方法区中移了出来,在Java堆中开辟了一块新的区域存放运行时常量池常量池的作用:提供一些符号和常量,便于指令的识别;在每一个栈帧内部中均包含一个指向运行时常量池(Constant Pool)或该栈帧

2021-05-16 10:45:43 265

原创 Java垃圾收集器详解

文章目录GC的分类与性能指标评估GC的性能指标吞吐量暂停时间不同的垃圾收集器概述垃圾收集器发展史7款经典的垃圾收集器7款经典的垃圾收集器与垃圾分代之间的关系垃圾收集器的组合关系查看默认的垃圾收集器Serial回收器:串行回收优势ParNew回收器:并行回收Parallel回收器:吞吐量优先参数配置CMS回收器:低延迟CMS的弊端参数设置小结JDK 后续版本中CMS的变化G1回收器:区域化分代式优势缺点参数设置G1的适用场景分区RegionG1垃圾收集器的垃圾收集流程G1收集器的年轻代GCG1垃圾回收的过程

2021-04-18 16:54:56 297

原创 JVM本地方法栈与本地方法接口

文章目录一、本地方法接口二、为什么要使用Native Method三、现状四、本地方法栈一、本地方法接口简单来讲,一个Native Method就是一个Java程序调用非Java代码的接口,一个Native Method是这样一个方法:该方法的底层实现并非由Java语言进行编写的,而是C/C++等,这个特征并非Java所特有,很多编程语言都有有这么一种机制,比如在C++中,我们可以用extern "C"来告知C++编译器去调用一个C的函数;在定义一个本地方法时,并不提供实现体(有些类似于定义一个

2021-03-11 21:52:27 144

原创 JVM引用

文章目录引用强引用: 不回收软引用: 内存不足即回收弱引用: 发现即回收虚引用: 对象回收跟踪终接器引用引用我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。 -【既偏门又非常高频的面试题】强引用、软引用、弱引用、虚引用有什么区别?具体使用场景是什么?在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(StrongReference)、软引用(Soft Reference) 、弱引用(Weak R

2021-03-08 10:44:56 120

原创 JVM垃圾回收相关概念

文章目录System.gc()的理解手动GC理解不可达对象的回收行为内存溢出与内存泄漏内存溢出内存泄漏(Memory Leak)举例Stop The World垃圾回收的并行与并发并发(Concurrent)并行(Parallel)二者对比垃圾回收的并发与并行安全点与安全区域安全点(Safepoint)如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢?安全区域(Safe Region)System.gc()的理解在默认情况下,通过System.gc()或者是Runtime.gc()的调用

2021-03-08 10:42:47 249

原创 JVM垃圾回收算法

文章目录1. 概述什么是垃圾大厂相关面试题为什么需要GC早期垃圾回收Java垃圾回收机制2. 垃圾回收相关算法垃圾标记阶段:对象存活判断2.1 标记阶段:法1_引用计数法 (Java没有采用)2.2 标记阶段:法2_可达性分析算法2.3 对象的finalization机制2.4 MAT与JProfiler的GC Roots溯源2.5 清除阶段:法1_标记-清除算法背景执行流程缺点2.6 清除阶段:法2_复制算法背景核心思想优点缺点应用场景2.7 清除阶段:法3_标记-压缩(整理,Mark-Compact)算

2021-03-07 10:13:30 199

原创 JVM字符串常量池StringTable详解

文章目录1. 字符串拼接操作拼接操作与append的效率对比2. intern()的使用new String("ab")会创建几个对象,new String("a")+new String("b")呢关于String.intern()的面试题总结String的intern()的使用练习练习1练习2intern()效率测试3. StrtingTable的垃圾回收4. G1中的String去重操作实现命令行选项1. 字符串拼接操作常量与常量的拼接结果在常量池,原理是编译期优化;常量池中不会存在相同内

2021-03-07 10:09:02 235 1

原创 JVM字符串常量池StringTable的基本概述

文章目录1. String的基本特性2. String的内存分配3. String的基本操作1. String的基本特性String是用一对 “” 引起来表示的字符串;String s1 = “hello”; //字面量的定义方式;String s2 = new String(“hello”);String是被声明为final的,不可被继承;String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小的

2021-03-07 10:05:25 123 1

原创 JVM垃圾回收算法补充

文章目录1. 分代收集算法2. 增量收集算法、分区算法增量收集算法分区算法小结1. 分代收集算法通过之前的文章我们可以得知,标记—清除算法,标记—整理算法以及复制算法都拥有着各自的优缺点,也都具有各自独特的优势和特点,并没有一种算法可以完全替代其它算法,所以说没有更好的算法,只有更合适的算法;而分代收集算法应运而生;分代收集算法,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。一般是把Java堆分为新生代和老年代,这样就

2021-03-07 10:01:49 94

原创 JVM执行引擎

文章目录执行引擎概述Java代码编译和执行过程什么是解释器以及JIT编译器?为什么说Java是半编译半解释性语言?机器码,指令,汇编语言机器码指令指令集汇编语言高级语言字节码C/C++源程序的执行流程解释器现状JIT编译器HotSpot VM为什么解释器与JIT并存解释器依然存在的必要性HotSpot VM的执行方式案例JIT编译器相关概念解释热点代码及探测方式HotSpot VM可以设置程序执行方式测试解释器模式和JIT编译模式HotSpot VM中的JIT分类C1和C2编译器不同的优化策略总结Graal

2021-03-04 21:48:08 162 1

原创 JVM方法区

文章目录1、堆,栈,方法区的交互关系2. 方法区的理解3. 设置方法区大小与OOM4.1、堆,栈,方法区的交互关系运行时数据区结构图(从线程共享与否的角度来看)堆,栈,方法区的交互关系2. 方法区的理解《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾或者压缩;但对于HotSpot虚拟机来说,方法区还有一个名字叫做非堆(Non-heap),目的就是要和堆分开;所以方法区可以看作是独立于堆空间的一块内存区域;方法区与堆

2021-03-01 13:54:43 138 1

原创 JVM运行时数据区

文章目录前言一、Java内存的概念JVM的经典内存布局具体的内存划分二、Java的线程与进程Java Runtime APIJava线程JVM系统线程分类前言之前已经学习过了类加载子系统,接下来将会详细地学习运行时数据区 一、Java内存的概念内存是非常重要的系统资源,是硬件以及CPU的中间仓库以及桥梁,承载着操作系统以及应用程序的实时运行。JVM的内存布局规定了Java在运行过程中内存申请,分配,管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。

2020-12-12 17:25:20 126

原创 JVM类加载子系统

文章目录类加载子系统细节架构图一、类加载子系统的作用二、类加载子系统功能的细分加载链接验证准备解析初始化,初始化阶段就是执行类构造器方法clinit()的过程三、类加载器的分类四、自定义类与核心类库的加载器类加载子系统细节架构图一、类加载子系统的作用类加载子系统负责从文件系统或者是网络系统等中加载class文件,class文件在文件的开头之中有特定的文件标识,即16进制的模数CA FE BA BE;加载后的Class类信息存放于一块名为方法区的内存空间;除了类信息之外,方法区还会存放运行时常量

2020-12-10 16:38:32 147

空空如也

空空如也

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

TA关注的人

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