自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调 用哪一个方法),暂时不涉及方法内部的具体执行过程。

2022-11-09 11:36:29 1613

原创 Java字节码执行引擎——运行时栈帧结构

虚拟机的执行引擎不是直接建立在处理器、硬件、指令集和操作系统层面的,而是由自己实 现的,因此可以自行制定指令集与执行引擎的结构体系,并能够执行哪些不被硬件直接支持 的指令集格式。在不同的虚拟机实现里面,执行引擎在执行 Java 代码的时候可能会有解释执行和编译执行 (通过即时编译器产生本地代码)两种选择,也可能两者兼备。但从外观上看起来,所有的 Java 虚拟机都是一样的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出 的是执行过程。

2022-11-05 15:55:08 599

原创 Java类加载器(双亲委派模型)

类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为类加载器。

2022-11-03 11:34:32 215

原创 Java类加载的过程

开发人员可以通过定义自己的类加载器去控制字节流的获取方式(重写一个类加载器的findClass()或loadClass()方法),实现根据自己的想法来赋予应用程序获取运行代码的动态性。对于数组而言,数组类本身不通过类加载器创建,它是由Java虚拟机直接在内存中动态构造出来的。

2022-11-02 17:11:53 133

原创 类加载机制

虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化, 最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。与那些编译时需要进行连接的语言不同,Java 语言里面,类型的加载、连接和初始化都是在程序运行期间完成的,这种策略虽然会令类加载时增加一些性能开销,但是是为 Java 应 用程序提供高度的灵活性,Java 里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。

2022-11-02 15:09:13 53

原创 Java IO基本介绍

Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出 的新特性,被统称为 NIO(即 New IO),是同步非阻塞的;NIO 相关类都被放在java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写;Channel(通道),Buffer(缓冲区), Selector(选择器);NIO是 面向缓冲区 ,或者面向块编程的。

2022-11-01 15:54:47 135

原创 八种基本排序算法(Java)

又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置 的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小, 则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。

2022-11-01 13:28:13 86

原创 经典垃圾收集器(三)

虽然Shenandoah也是基于Region的堆内存布局,同样有着用于存放大对象的Humongous Region,默认策略也是优先处理回收价值最大的Region,但是在堆内存管理上,它与G1至少有着三个明显的不同之处,最重要的是支持并发的整理算法,G1的回收阶段是可以多线程并行的,但却不能与用户线程并发。ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。

2022-10-27 14:33:42 350

原创 经典垃圾收集器(二)

它⾮常符合在注重⽤户体验的应⽤上使⽤。从名字中的这两个词可以看出,CMS 收集器是⼀种 “”算法实现的,它的 运作过程相⽐于前⾯⼏种垃圾收集器来说更加复杂⼀些。初始标记(CMS initial mark)和重新标记(CMS remark)仍然需要“Stop The World”。从整体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

2022-10-26 17:24:58 125

原创 经典的垃圾收集器(一)

如果说收集算法是内存回收的⽅法论,那么垃圾收集器就是内存回收的具体实现。

2022-10-26 15:08:03 100

原创 HoptSpot的算法细节实现(三)

写屏障可以看作在虚拟机层面对“引用类型字段赋值”这个动作的AOP切面,在引用对象赋值时会产生一个环形(Around)通知,供程序执行额外的动作,即赋值的前后都在写屏障的覆盖范围内。应用写屏障后,虚拟机就会为所有赋值操作生成相应的指令,一旦收集器在写屏障中增加了更新卡表操作,无论更新的是不是老年代对新生代对象的引用,每次只要只要对引用进行更新,就会产生额外的开销,不过这个开销与Minor GC时扫描整个老年代的代价相比还是低很多。除了写屏障的开销外,卡表在高并发场景下还面临着。

2022-10-24 16:20:13 248

原创 HoptSpot的算法细节实现(二)

(上面代码使用的卡页是2的9次方幂),如果CARD_TABLE的第0、1、2号元素分别对应地址范围为0x000-0x01FF、0x0200-0x03FF、0x0400-0x05FF的卡页内存块。一个卡页的内存中通常包含不止一个对象,只要卡页内有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素值标识为1,称这个元素变脏(Dirty),没有则0.在垃圾收集发生时,只要帅选出卡表中变脏的元素,就能轻易得出哪些卡页内存中包含跨代指针,把它们加入GC Roots中一并扫描。

2022-10-23 16:42:33 179

原创 HotSpot的算法细节实现(一)

不需要线程的执行代码主动去配合,在垃圾收集发生时,系统首先把所有用户线程全部中断,如果发现用户线程中断的位置不在安全点上,就恢复这条线程执行,让他一会再重新中断,直到跑到安全点上。当垃圾收集需要中断线程的时候 ,不直接对线程操作,仅仅简单设置一个标志位,各个线程执行过程时会不停的主动轮询这个标志,一旦发现中断标志位真时就自己在最近的安全点上主动中断挂起。迄今为止,所有的收集器在根节点枚举这一步骤时都必须暂停用户线程的,因此根节点枚举与整理内存碎片一样都会面临相似的“StopThe World”的困恼。

2022-10-23 15:26:29 241

原创 剑指 Offer 31. 栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。题解:采用HashMap保存出栈入栈顺序,之后取出出栈顺序,判断每个位置的合法性。1 不能在 2 之前弹出。

2022-10-23 10:49:30 46

原创 JVM垃圾回收算法

针对 HotSpot VM 的实现,它⾥⾯的 GC 其实准确分类只有两⼤种:部分收集 (Partial GC):目标不是完整的收集整个Java堆的收集。新⽣代收集(Minor GC / Young GC):只对新⽣代进⾏垃圾收集;⽼年代收集(Major GC / Old GC):只对⽼年代进⾏垃圾收集。需要注意的是 Major GC 在 有的语境中也⽤于指代整堆收集;混合收集(Mixed GC):对整个新⽣代和部分⽼年代进⾏垃圾收集。整堆收集 (Full GC):收集整个 Java 堆和⽅法区。

2022-10-21 15:05:03 103

原创 JVM判断对象是否存活

Java邻域,至少在主流的Java虚拟机里面都没有选用引用技术法来管理内存,主要原因是:这个看似简单的算法有很多例外的情况需要考虑,必须要大量配合额外的处理才能保证正确的工作。如单纯的引用很难解决对象之间循环引用的问题。

2022-10-19 14:54:33 169

原创 对象的内存布局以及访问定位

此外,如果对象是一个Java数组,那对象头中氦必须有一块用于记录数组长度的数据,因为数据的长度是不确定的,将无法通过元数据中的信息判断出数组的大小。对象需要存储的运行时数据很多,其实已经超过了32、64位Bitmap结构所能记录的最大限度,但对象头里的信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个有着动态定义的数据结构,以便在极小的空间存储尽可能多的数据,根据对象的状态复用自己的存储空间。对象的访问⽅式有虚拟机实现⽽定,⽬前主流的访问⽅式有。

2022-10-18 17:40:21 180

原创 剑指offer19或力扣10(困难)正则表达式匹配

那么就表示我们可以对 p 的第 j−1 个字符匹配任意自然数次。在 匹配0 次的情况下,我们有:f[i][j]=f[i][j−2]因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。3. 在任意情况下,只要 p[j]p[j]p[j] 是。,那么 p[j] 一定成功匹配 s 中的任意一个小写字母。"a" 无法匹配 "aa" 整个字符串。的,而不是部分字符串。如:匹配1,2,3次。

2022-10-18 08:48:42 65

原创 Java对象创建过程

Java是一门面向对象语言,Java程序运行过程中无时无刻都有对象被创建出来。**类加载检** 1. 当Java虚拟机遇到一条字节码new指令时,首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。(类加载过程?待更新)

2022-10-17 10:59:36 205

原创 Java运行时数据区域

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来。------------------------------------------------------------摘自《深入理解Java虚拟机》周志明Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。

2022-10-16 20:14:33 177

原创 RabbitMQ 安装web插件时无法连接RabbitMQ

rabbitMQ 安装web插件时需要新增一条主机名映射。

2022-10-15 16:37:29 504

原创 RabbitMQ启动报错解决

报错信息:Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.

2022-10-15 16:33:23 860

原创 二叉树的几种遍历方法(前序、中序、后序)

递归可以说是二叉树相对来说最简单的掌握方式,前序、中序、后序遍历主要体现在以下代码上,如果 res.add(root.val);在中间即中序遍历,在首位即前序遍历、在末尾即后序遍历。利用栈遍历二叉树时间复杂度和空间复杂度一般都为O(n);且前序、中序、后续遍历的代码类似,区别主要体现在一下代码段上。利用栈的先进后出的特性,首先让二叉树遍历到最左边的位置,然后再一个节点一个节点弹出。在中间就是中序遍历;二叉树的遍历一般有前序、中序、后序。5. Morris 前序遍历。4.Morris 中序遍历。

2022-10-07 16:19:49 720

原创 力扣(51困难) N皇后问题

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。该解法基本为傻瓜式解法,还有许多可以优化的地方,现代码如下,附上注释。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

2022-09-24 09:41:01 312

原创 解数独回溯算法详解(leetCode 37)(困难)

链接:https://leetcode.cn/problems/sudoku-solver。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字,空白格用 '.' 表示。这篇文章主要讲解下leetCode官方的回溯解法。编写一个程序,通过填充空格来解决数独问题。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。来源:力扣(LeetCode)

2022-09-19 09:24:28 188

空空如也

空空如也

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

TA关注的人

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