自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 新手学习MAML的基础解析

通俗的来讲,对于人来说,给几张橘猫的图片让看一下,再给你几张没见过的英短猫图片,你一定能很快识别出来都是猫。但是对于神经网络来说,并非如此。假设有一个模型从task1的数据中训练出来了一组权重,我们记为θ1\theta1θ1,这个θ1\theta1θ1是图中深绿色的点,可以看到,在task1下,他已经达到了全局最优。而MAML作为其中一种实现方式,它先对一个batch中的每个任务都训练一遍,然后回到这个原始的位置,对这些任务的loss进行一个综合的判断,再选择一个适合所有任务的方向。

2025-01-19 10:16:49 749

原创 JVM之内存泄漏的详细解析

通过 readFromNet 方法把接收消息保存在 msg 中,然后调用 saveDB 方法把内容保存到数据库中,此时 msg 已经可以被回收,但是 msg 的生命周期与对象的生命周期相同,造成 msg 不能回收,产生内存泄漏。内部类持有外部类的情况,如果一个外部类的实例对象调用方法返回了一个内部类的实例对象,即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象也不会被回收,造成内存泄漏。,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。

2025-01-16 20:02:00 980

原创 JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

Serial GC、Parallel GC、Concurrent Mark Sweep GC 这三个 GC 不同:最小化地使用内存和并行开销,选 Serial GC最大化应用程序的吞吐量,选 Parallel GC最小化 GC 的中断或停顿时间,选 CMS GC。

2025-01-14 21:16:03 864

原创 JVM之垃圾回收器G1概述的详细解析

卡表(Card Table)在老年代中,是一种对记忆集的具体实现,主要定义了记忆集的记录精度、与堆内存的映射关系等,卡表中的每一个元素都对应着一块特定大小的内存块,这个内存块称之为卡页(card page),当存在跨代引用时,会将卡页标记为 dirty,JVM 对于卡页的维护也是通过写屏障的方式。:当很多对象晋升到老年代时,为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即 Mixed GC,除了回收整个 young region,还会回收一部分的 old region,过程同 YGC。

2025-01-13 19:49:05 1460

原创 JVM之垃圾回收器CMS概述(续)的详细解析

重新标记:修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象,比初始标记时间长但远比并发标记时间短,需要 STW(不停顿就会一直变化,采用写屏障 + 增量更新来避免漏标情况):用于指定在执行完 Full GC 后对内存空间进行压缩整理,以此避免内存碎片的产生,由于内存压缩整理过程无法并发执行,所带来的问题就是停顿时间变得更长。并发标记:进行 GC Roots 开始遍历整个对象图,在整个回收过程中耗时最长,不需要 STW,可以与用户线程并发运行。,所以这个阶段可以与用户线程同时并发的。

2025-01-12 18:45:15 513

原创 JVM之垃圾回收器概述(续)的详细解析

在这种模式下,年轻代的大小、Eden 和 Survivor 的比例、晋升老年代的对象年龄等参数会被自动调整,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。在注重吞吐量及 CPU 资源敏感的场合,都可以优先考虑 Parallel Scavenge + Parallel Old 收集器,在 Server 模式下的内存回收性能很好,对于老年代,回收次数少,使用串行方式节省资源(CPU 并行需要切换线程,串行可以省去切换线程的资源)

2025-01-11 18:48:17 1153

原创 JVM之垃圾回收器概述的详细解析

垃圾收集器分类:按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式执行按照工作模式分,可以分为并发式垃圾回收器和独占式垃圾回收器并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间独占式垃圾回收器(Stop the world)一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束按碎片处理方式分,可分为压缩式垃圾回收器和非压缩式垃圾回收器。

2025-01-02 21:34:29 933

原创 JVM之回收算法的详细解析

如果找到的块大于 size,会将块分割成大小为 size 与 block - size 的两部分,返回大小为 size 的分块,并把大小为 block - size 的块返回给空闲列表。标记阶段和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的直接清理可回收对象,而是。,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清理,交换两个内存的角色,完成垃圾的回收。会产生大量不连续的内存碎片,导致无法给大对象分配内存,需要维护一个空闲链表。

2024-10-08 20:45:58 508 1

原创 JVM之标记算法的详细解析

保留 GC 开始时的对象图,即原始快照 SATB,当 GC Roots 确定后,对象图就已经确定,那后续的标记也应该是按照这个时刻的对象图走,如果期间对白色对象有了新的引用会记录下来,并且将白色对象变灰(说明可达了,并且原始快照中本来就应该是灰色对象),最后重新扫描该对象的引用关系。finalize() 方法的执行时间是没有保障的,完全由 GC 线程决定,极端情况下,若不发生 GC,则 finalize() 方法将没有执行机会,因为优先级比较低,即使主动调用该方法,也不会因此就直接进行回收。

2024-06-07 16:48:10 1122 1

原创 JVM之垃圾判断的详细解析

如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾作用:释放没用的对象,清除内存里的记录碎片,碎片整理将所占用的堆内存移到堆的一端,以便 JVM 将整理出的内存分配给新的对象垃圾收集主要是针对堆和方法区进行,程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。引用计数算法。

2024-05-29 17:33:15 1093

原创 JVM之回收策略的详细解析

Concurrent Mode Failure:执行 CMS GC 的过程中同时有对象要放入老年代,而此时老年代空间不足(可能是 GC 过程中浮动垃圾过多导致暂时性的空间不足),便会报 Concurrent Mode Failure 错误,并触发 Full GC。在默认情况下,通过 System.gc() 或 Runtime.getRuntime().gc() 的调用,会显式触发 FullGC,同时对老年代和新生代进行回收,但是虚拟机不一定真正去执行,无法保证对垃圾收集器的调用。

2024-05-18 23:04:22 389

原创 JVM之分代思想的详细解析

Java8 时,堆被分为了两份:新生代和老年代(1:2),在 Java7 时,还存在一个永久代新生代使用:复制算法老年代使用:标记 - 清除 或者 标记 - 整理 算法Minor GC 和 Full GCMinor GC:回收新生代,新生代对象存活时间很短,所以 Minor GC 会频繁执行,执行的速度比较快Full GC:回收老年代和新生代,老年代对象其存活时间长,所以 Full GC 很少执行,执行速度会比 Minor GC 慢很多Eden 和 Survivor 大小比例默认为 8:1:1。

2024-05-17 08:38:06 587

原创 JVM之内存分配的详细解析

已使用的内存和未使用的内存相互交错,虚拟机维护了一个列表,记录上哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。逃逸分析并不是直接的优化手段,而是一个代码分析方式,通过动态分析对象的作用域,为优化手段如栈上分配、标量替换和同步消除等提供依据,发生逃逸行为的情况有两种:方法逃逸和线程逃逸。User 对象的作用域局限在方法 fn 中,可以使用标量替换的优化手段在栈上分配对象的成员变量,这样就不会生成 User 对象,大大减轻 GC 的压力。

2024-05-06 21:43:30 1206

原创 刷题之Leetcode349题(超级详细)

直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。那有兄弟可能问了,遇到哈希问题我直接都用set不就得了,用什么数组啊。输出结果中的每个元素一定是唯一的。所以就可以 使用数组来做哈希表了, 因为数组都是 1000以内的。而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。不要小瞧这个耗时,在数据量大的情况,差距是很明显的。题意:给定两个数组,编写一个函数来计算它们的交集。

2024-04-28 09:11:21 443

原创 刷题之Leetcode242题(超级详细)

需要定义一个多大的数组呢,定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。这样就将字符串s中字符出现的次数,统计出来了。

2024-04-23 22:36:57 702

原创 刷题之Leetcode142题(超级详细)

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢。

2024-04-23 15:56:43 785

原创 刷题之Leetcode160题(超级详细)

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。这里兄弟们要注意,交点不是数值相等,而是指针相等。为了方便举例,假设节点元素数值相等,则节点指针相等。注意,函数返回结果后,链表必须 保持其原始结构。力扣题目链接(opens new window)简单来说,就是求两个链表交点节点的。

2024-04-22 09:06:07 486

原创 JVM之本地内存以及元空间,直接内存的详细解析

虚拟机内存:Java 虚拟机在执行的时候会把管理的内存分配成不同的区域,受虚拟机内存大小的参数控制,当大小超过参数设置的大小时就会报 OOM又叫做堆外内存,线程共享的区域,本地内存这块区域是不会受到 JVM 的控制的,不会发生 GC;因此对于整个 Java 的执行效率是提升非常大,但是如果内存的占用超出物理内存的大小,同样也会报 OOM。

2024-04-18 23:46:54 834

原创 JVM之方法区的详细解析

2.运行时常量池(Java6之前常量池存放在方法区(永久代中),Java7中将常量池存放在了堆中,Java8之后将运行时常量池和静态常量池存放在元空间中,字符串常量池依然存放在堆中)1.8将这个字符串尝试放入串池,如果有则不会放入,如果没有则放入串池,会把串池中的对象返回(无论有没有都会返回),这个放入是创建一个引用,引用的地址就是这个对象的地址。常量池(编译器生成的字面量和符号引用)中的数据会在类加载的加载阶段放入运行时常量池。运行时常量池是方法区的一部分(一般所说的常量池实际上就是指运行时常量池)

2024-04-17 23:05:33 793

原创 刷题之Leetcode19题(超级详细)

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。首先这里我推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑,如果虚拟头结点不清楚,可以先去看一看这一篇。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head = [1,2], n = 1 输出:[1]力扣题目链接(opens new window)进阶:你能尝试使用一趟扫描实现吗?思路是这样的,但要注意一些细节。

2024-04-17 15:41:02 910

原创 JVM之本地方法栈和程序计数器和堆

在 Eden 区变满的时候,GC 就会将存活的对象移到空闲的 Survivor 区间中,根据 JVM 的策略,在经过几次垃圾回收后,仍然存活于 Survivor 的对象将被移动到 Tenured 区间。Tenured 区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在 Young 复制转移一定的次数以后,对象就会被转移到 Tenured 区。分代原因:不同对象的生命周期不同,70%-99% 的对象都是临时对象,优化 GC 性能。jconsole:图形界面的,多功能的监测工具,可以连续监测。

2024-04-16 23:13:42 949

原创 JVM之JVM栈的详细解析

基于栈式架构的虚拟机使用的零地址指令更加紧凑,完成一项操作需要使用很多入栈和出栈指令,所以需要更多的指令分派(instruction dispatch)次数和内存读/写次数,由于操作数是存储在内存中的,因此频繁地执行内存读/写操作必然会影响执行速度,所以需要栈顶缓存技术。的,如果一个局部变量过了其作用域,那么之后申明的新的局部变量就可能会复用过期局部变量的槽位,从而达到节省资源的目的。操作数栈:在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)或出栈(pop)

2024-04-15 23:33:15 1194

原创 刷题之Leetcode24题(超级详细)

建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。力扣题目链接(opens new window)对虚拟头结点的操作,还不熟悉的话,可以看这篇。接下来就是交换相邻两个元素了,这道题目正常模拟就可以了。

2024-04-15 09:23:52 493

原创 刷题之Leetcode206题(超级详细)

关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。

2024-04-14 22:59:41 651

原创 JVM之JVM的基本介绍

JVM:全称 Java Virtual Machine,即 Java 虚拟机,一种规范,本身是一个虚拟计算机,直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作特点:Java 虚拟机基于二进制字节码执行,由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆、一个方法区等组成JVM 屏蔽了与操作系统平台相关的信息,从而能够让 Java 程序只需要生成能够在 JVM 上运行的字节码文件,通过该机制实现的跨平台性。

2024-04-13 22:50:45 996

原创 刷题之Leetcode707题(超级详细)

可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目。下面采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)。力扣题目链接(opens new window)

2024-04-10 15:29:40 626

原创 刷题之Leetcode203题(超级详细)

这样移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。那么因为单链表的特殊性,只能指向下一个节点,刚刚删除的是链表的中第二个,和第四个节点,那么如果删除的是头结点又该怎么办呢?移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。来看一下,如何移除元素1 呢,还是熟悉的方式,然后从内存中删除元素1。依然还是在这个链表中,移除元素1。

2024-04-10 14:44:37 1152

原创 刷题之Leetcode54题(超级详细)

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]相同的地方是:从右向左遍历行和从下向上遍历列的终止条件都是大于遍历起点start。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]中间行或中间列的位置mid = 行和列中的最小值除以二的值。输出:[1,2,3,6,9,8,7,4,5]

2024-04-08 15:47:35 745

原创 刷题之Leetcode59题(超级详细)

这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开。可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是。就是因为在画每一条边的时候,一会左开右闭,一会左闭右闭,一会又来左闭右开,岂能不乱。这道题目可以说在面试中出现频率较高的题目,由外向内一圈一圈这么画下去。

2024-04-08 09:50:26 1209

原创 java流式计算Stream

下面的代码中,需求是要把list集合中的元素全部变成乘以2,就需要使用map的stream流式计算方法,map接受的是一个JDK提供的,Function接口,所以lambda实现方法时需要一个返回值,一个参数。是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。相反,他们会返回一个持有结果的新Stream。Stream操作是延迟执行的。偶数工D且年龄大于24且用户名转为大写且用户名字母倒排序。map----映射(将元素映射成另外的元素)collect----stream转list。

2024-04-07 23:03:36 306

原创 刷题之Leetcode844题(超级详细)

844. 比较含退格的字符串https://leetcode.cn/problems/backspace-string-compare/给定 和 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 。 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。示例 1:输入:s = "ab#c", t = "ad#c"输出:true解释:s 和 t 都会变成 "ac"。示例 2:输入:s = "ab

2024-04-06 22:08:21 802

原创 刷题之Leetcode283题(超级详细)

这道题目,使用暴力的解法,可以两层for循环,模拟数组删除元素(也就是向前覆盖)的过程。双指针法在数组移除元素中,可以达到O(n)的时间复杂度,里已经详细讲解了,那么本题和移除元素其实是一个套路。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。做这道题目之前,大家可以做一做。,编写一个函数将所有。

2024-04-06 22:02:47 504

原创 刷题之Leetcode209题(超级详细)

不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。所以 只用一个for循环,那么这个循环的索引,一定是表示 滑动窗口的终止位置。

2024-04-06 21:55:58 1253

原创 刷题之Leetcode977题(超级详细)

做题的时候自己能分析出来时间复杂度就可以了,至于leetcode上执行用时,大概看一下就行,只要达到最优的时间复杂度就可以了,给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。此时的时间复杂度为O(n),相对于暴力排序的解法O(n + nlog n)还是提升不少的。定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

2024-04-05 22:59:27 366 1

原创 刷题之Leetcode27题(超级详细)

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。很多兄弟这道题目做的很懵,就是不理解 快慢指针究竟都是什么含义,所以一定要明确含义,后面的思路就更容易理解了。元素的顺序可以改变。有的同学可能说了,多余的元素,删掉不就得了。

2024-04-05 21:23:38 882

原创 刷题之Leetcode34题(超级详细)

力扣链接(opens new window)给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]

2024-04-04 22:47:17 1044

原创 刷题之Leetcode35题(超级详细)

希望通过这道题目,大家会发现平时写二分法,为什么总写不好,就是因为对区间定义不清楚。确定要查找的区间到底是左闭右开[left, right),还是左闭又闭[left, right],这就是不变量。然后在二分查找的循环中,坚持循环不变量的原则,很多细节问题,自然会知道如何处理了。t=N7T8力扣题目链接(opens new window)https://leetcode.cn/problems/search-insert-position/

2024-04-04 21:36:07 1460

原创 刷题之Leetcode704题(超级详细)

二分法是非常重要的基础算法,为什么很多同学对于二分法都是一看就会,一写就废?其实主要就是对区间的定义没有理解清楚,在循环中没有始终坚持根据查找区间的定义来做边界处理。区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。本篇根据两种常见的区间定义,给出了两种二分法的写法,每一个边界为什么这么处理,都根据区间的定义做了详细介绍。相信看完本篇应该对二分法有更深刻的理解了。

2024-04-04 21:18:18 1161

原创 并发编程之线程池的应用以及一些小细节的详细解析

可以给出一些关键的参数来自定义。在下面的代码中可以看到,该线程池的最大并行线程数是5,线程等候区(阻塞队列)是3,即该线程池最多接受8个线程任务的同时提交。一旦超过了8这个任务数,就会抛出java.util.concurrent.RejectedExecutionException。

2024-04-03 23:02:57 521

原创 并发编程之线程池的底层原理的详细解析

2.3如果这个时候队列满了且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非核心线程立刻运行这个任 务;2.4如果队列满了且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行。如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。2.1如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;2.2如果正在运行的线程数量大于或等corePoolSize,那么将这个任务放入队列;

2024-04-02 23:06:41 547

如何训练MAML模型的原论文

元学习 MAML 小样本学习

2025-01-19

面试必会Java基础篇

这是Java面试的一些基础必会的内容,适合想找工作的基础不太好的人来看.这份Java面试复习体系总结包含了Java基础篇必须掌握的内容,内容十分真实,所有的面试题目都不是一成不变的,特别是像一线大厂,面试题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。行业浮浮沉沉,希望能帮助大家提升面试复习效率找到一个更好的工作!

2023-09-08

空空如也

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

TA关注的人

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