JVM学习纪要(一)
JVM学习纪要
- 一、内存区域的划分
- 程序计数器
- 虚拟机栈
- 局部变量表
- 本地方法栈
- Java堆
- 方法区
- 二、对象创建
- 过程
- 内存布局
- 对象头
- 实例数据
- 对齐填充
- 对象访问
- 三、垃圾与垃圾回收
- 引用
- 对象的死亡判定
- 引用计数
- 引用可达
- 死亡与清理
- 方法区的回收
- 类的回收
- 垃圾收集器理论与实现
- 理论
- 三种实现思路
- 实现
- 根节点枚举
- 安全点
- 安全区
- 记忆集和卡表
- 记忆集
- 卡表
- 写屏障
- 并发的可达性分析
- 目前常见的垃圾收集器
- serial
- parnew
- G1
- parallel scavenge
- serial old / parallel old
- CMS详述
- G1详述
- 具体实现
- 仍待优化的问题
- 实验期垃圾收集器
- shenandoah收集器
- ZGC
一、内存区域的划分
如果只是粗略地理解,大致可以分为堆和栈。但是这样的划分是不足以全面地理解JVM的。更详细的划分应该是:
- 堆
- 方法区
- 虚拟机栈
- 程序计数器
- 本地方法栈
程序计数器
程序计数器是一个不起眼但很重要的部分,字节码解释器会根据这个部分选取下一条需要执行的指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器。
由于虚拟机的多线程本质上是时分复用CPU内核的时间片实现的,任何一个内核在指定时间点都只会执行一条线程指令,所以每条线程都必须有自己独立的程序计数器以保证线程获得时间片时处在正确的上下文中。
换言之,程序计数器线程私有
虚拟机栈
生命周期与其所在的线程完全相同。它描述了Java方法执行的内存模型:
- JVM创建一个栈帧(stack frame),存储着局部变量表,操作数栈,动态链接,方法出口等信息
- 每一个方法被调用至执行结束,就是一个栈帧在虚拟机栈入栈->出栈的过程。
虚拟机栈显然是线程私有的,否则不同参数进入同一个方法必然内存污染。
局部变量表
存放编译期间可知的各种Java虚拟机基本数据类型,对象引用,和returnAddress。
这些数据类型在虚拟机用局部变量槽(slot)实现,64位机long和double需要两个slot,其余数据类型1个。
因此,局部变量表需要的内存空间在编译期间就决定了
不同的虚拟机给不同的槽分配多大的物理内存是不同的,但槽位相同。
本地方法栈
不重要,可以理解为调外部程序运行,实际用的不太多
Java堆
GC的主要目标。几乎所有的对象实例都在这里分配内存。但随着栈上分配技术的进步发展,对象也不一定都在堆里,也可能经由标量替换后直接放在栈里。
java堆可以物理不连续,但必须逻辑连续。它的大小可以固定,也可动态扩展。当前主流的虚拟机都是动态扩展的。
Java堆是线程公有的,因为实际上这个部分可以理解为公共仓库,存储各个线程的不能在编译期间分配空间的实例。
方法区
也是线程共享的。用于存储已经被虚拟机加载的类型信息,常量,静态变量,即时编译后的代码缓存等数据。
运行时常量池也在其中。
二、对象创建
过程
- 虚拟机遇到字节码指令new时,先检查能否在常量池找到这个类的符号引用,并检查是否被加载、解析、初始化。如果没有则先执行类加载。
- 虚拟机将为即将创建的实例分配内存。类加载完成后,所需的内存大小即完全确定。为其分配内存实际上就是从堆中划出一块指定大小的空间给新实例。
- 分配新实例的过程可能是指针碰撞(形象的理解为实例一个接着一个,完全杜绝散碎内存),也可能是空闲列表(由虚拟机挑一块足够大的内存给这个对象)。究竟是哪一种,要看具体的虚拟机实现。
- 内存修改的安全问题(A线程申请到了内存区x1,还没锁定,B也申请了这里),有两种方案:一,CAS+失败重试;二,本地线程分配缓冲(TLAB)。
- 将对象头以外的内存空间初始化为0,设置其所属的类,类的元数据信息,哈希码(可能是懒加载,hashCode()被调用时才计算),GC年龄,是否启用偏向锁等。这些信息放在对象头中。
- init(),根据构造器中的各种代码真正把程序员指定的实例构造出来。
内存布局
对象在堆内存中的布局:
- 对象头
- 实例数据
- 对齐填充
对象头
存储对象自身的运行时数据。包括哈希码,gc分代,锁状态,线程持有的锁,偏向线程id,偏向时间戳等,这部分数据在32、64位机中长度不同,分别为32bit和64bit,官方称之为mark word。
对象头除了markword还有一个部分是类型指针,指向实例所属的类。如果实例是数组,还有一块记录数组长度。
实例数据
真正存储信息的地方。
对齐填充
补齐实例长度,不重要
对象访问
两种:
- 句柄
- 指针
句柄好处是句柄地址稳定,无论实例怎么移动,引用只需要找到句柄,不需要关心实例的真正位置。但代价是额外的内存开销和定位搜索时间开销;指针的好处是速度快,直达,但一旦实例移动,指针就要变化,需要额外的操作维护指针状态。
三、垃圾与垃圾回收
引用
- 强引用,最常见的引用赋值:A a = new A();
- 软引用,还有用但非必须的对象
- 弱引用,只能生存到下一次GC前
- 虚引用,其实根本不指向实例,只是为了在这块内存区被清理时收到虚拟机的通知
这些引用本质上都是类,可以向泛型一样使用
对象的死亡判定
引用计数
由于不能解决循环引用的问题,实际上没啥用
引用可达
整体思想:从某些GC ROOT开始遍历堆内存实例,没走到的实例、实例组就被判断为垃圾。
可以作为GC ROOT的对象:
- 虚拟机栈中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象,如字符串常量池
- 本地方法栈中JNI引用的对象
- JVM内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象,还有系统类加载器
- 所有被同步锁持有的对象
- 反映JVM内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等
引用可达法的本质,就是图论的遍历算法,从上述节点开始,遍历这个图结构,没被走到的地方,就是垃圾
死亡与清理
一个对象在可达性分析后被判为不可达,也并非立即就要被回收。
引用可达性分析是第一次标记,只有在第二次标记后,基本就确定要回收了。
第二次标记:
第一次标记后会进行一次筛选,条件是这个对象是否要执行finalize方法。假如对象没有覆盖finalize方法或这个方法已经被虚拟机调用过,则判断为“无需执行”。如果有必要执行,则这个对象会被放在F-Queue中,排队被虚拟机的Finalizer执行销毁。
需要注意,虚拟机并不承诺这个执行一定会完成,因为如果某个对象的执行卡住了,可能会导致阻塞,使得整个垃圾回收系统崩溃。
fianlize()方法是对象拯救自己的最后一次机会,只要对象可以在这里重新挂靠到某个引用链,则可以逃脱被回收的命运。
如果不能,则会被二次标记。
finalize只会执行一次,即使类在这里有拯救自己的操作,但也只有这一次机会。
方法区的回收
实际上方法区的回收不是每一款虚拟机都实现了的,JVM规范声明方法区的回收“非必须”,JDK11中的ZGC就不支持类卸载。
回收方法区主要是回收常量和类。
回收常量比较简单,如果没有任何一个字符串对象的值和待判断的值相同,且虚拟机任何其他地方也没有引用这个字面量,则这个常量就可以回收。
类的回收则比较复杂。
类的回收
类的回收需要满足:
- 所有实例和子类实例都被回收
- 类加载器已经被回收(极难达成)
- 该类的的Class对象没有被引用,无法通过反射访问这个类
即使满足这三个很难达成的条件,类也只是“允许被回收”,而不是像实例一样没有引用一定回收。
垃圾收集器理论与实现
理论
- 弱分代假说:大多数对象都是迅速消亡的
- 强分代假说:熬过越多次垃圾收集的对象越难以消亡
- 跨代引用假说:跨代引用对于同代引用仅占极少数
这两个假说奠定了垃圾收集器的一致设计原则:
应当对Java堆分代,将不同年龄(熬过垃圾收集的次数)的对象放入不同的时间代,进行不同的处理。
新生代收集:youngGC/minorGC
老年代收集:oldGC/majorGC
整堆收集:fullGC
G1收集器特有的:mixedGC
三种实现思路
- 标记清除
- 标记复制
- 标记整理
标记清除法:
标记所有需要回收的对象,在标记完成后,统一回收所有被标记的对象。
缺陷:
- 执行效率不稳定,随着堆上实例越来越多,需要标记和清理的对象也越来越多,执行效率会迅速下降;
- 清理后的空间会碎片化,堆上会形成众多的内存碎片,这会导致系统需要分配大对象时找不到合适的空间,进而提前触发新的GC
标记复制:
第一阶段:
半区复制。首先把内存分为两块;其次每次为对象分配空间时只使用其中的一块;再次当这一块内存满时,直接把还存活的对象按顺序复制到另一半。
这样一来,计算效率大大提高,且不再有内存碎片问题
第二阶段:
分代复制。由于能够快速收集的对象比例非常高,甚至达到98%,所以完全没有必要给一半内存这么大的空间。Hotspot的虚拟机策略是按照8:1:1来设计年轻代和老年代。在初始分配对象时只使用年轻代和第一个老年代。发生垃圾收集时,直接把存活的放到第二个老年代。
缺陷:
空间浪费太多
标记整理
第一步:标记
第二步:把所有存活的对象集中起来(移动存活的对象)
实现
根节点枚举
从GC ROOT开始排查所有的堆上实例固然可以精确地找出垃圾,但问题是这样耗费大量的计算资源。根节点枚举必然需要一个相对稳态的环境来分析所有的堆内存对象,这就会导致一个非常致命的问题:Stop The World,世界停顿。
如果代码的性能又没有优化到一定的水平,这个时停就会频繁且漫长——基本等于服务器挂了。
这种情况下,OOPMAP出现了。
这里要先介绍两个概念:
- 保守GC:从一些已知位置开始扫描内存,扫描到一个数字就大致判断它是不是可能指向GC堆中的一个指针。这种大致判断可能是通过对齐检查的方式进行的,也可能是其它什么方式,总之不是精确地判断出一个指针。这种方式很快,但可能误诊,也不能改动指针(不知道是不是真的是指针)
- 准确GC:何为准确式GC?就是我们准确的知道,某个位置上面是否是指针,对于java来说,就是知道对于某个位置上的数据是什么类型的,这样就可以判断出所有的位置上的数据是不是指向GC堆的引用,包括栈和寄存器里的数据。在java中实现的方式是:从外部记录下类型信息,存成映射表,在HotSpot中把这种映射表称之为OopMap,不同的虚拟机名称可能不一样。实现这种功能,需要虚拟机的解释器和JIT编译器支持,由他们来生成OopMap。生成这样的映射表一般有两种方式:
A. 每次都遍历原始的映射表,循环的一个个偏移量扫描过去;这种用法也叫“解释式”;
B. 为每个映射表生成一块定制的扫描代码(想像扫描映射表的循环被展开的样子),以后每次要用映射表就直接执行生成的扫描代码;这种用法也叫“编译式”。
总而言之,GC开始的时候,就通过OopMap这样的一个映射表知道,在对象内的什么偏移量上是什么类型的数据,而且特定的位置记录下栈和寄存器中哪些位置是引用。
安全点
在方法执行的过程中, 可能会导致引用关系发生变化,那么保存的OopMap就要随着变化。如果每次引用关系发生了变化都要去修改OopMap的话,这又是一件成本很高的事情。所以这里就引入了安全点的概念。
- 什么是安全点?:OopMap的作用是为了在GC的时候,快速进行可达性分析,所以OopMap并不需要一发生改变就去更新这个映射表。只要这个更新在GC发生之前就可以了。所以OopMap只需要在预先选定的一些位置上记录变化的OopMap就行了。这些特定的点就是SafePoint(安全点)。由此也可以知道,程序并不是在所有的位置上都可以进行GC的,只有在达到这样的安全点才能暂停下来进行GC。
- 安全点太多或者太少都不好;太多会浪费性能,太少会让GC长时间等待。如何选择安全点?
- 0循环的末尾;1方法返回前、调用方法的call指令后;2可能抛异常的位置
- 如何让程序在安全点前停下?:主动式中断,在GC的时候,不会主动去中断线程,仅仅是设置一个标志,当程序运行到安全点时就去轮询该位置,发现该位置被设置为真时就自己中断挂起。所以轮训标志的地方是和安全点重合的,另外创建对象需要分配内存的地方也需要轮询该位置。
安全区
确保在某一段代码中引用关系不会发生变化,因此在这个区域中任意地点收集垃圾都是安全的。用户线程执行到安全区域中的代码时,会标识自己进入了安全区域。如果此时虚拟机要发起垃圾收集,就不用去管那些已经声明自己在安全区域内的线程。当线程要离开时,会检查虚拟机是否正在进行某些需要线程停顿的垃圾收集操作,如果没有则无事发生继续执行,如果有则必须等着。
记忆集和卡表
本质上是为了解决新生代中某个对象存在老年代的对象的引用,进而使得年轻代对象无法回收的问题。
记忆集
记忆集是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。如果我们不考虑 效率和成本的话,最简单的实现可以用非收集区域中所有含跨代引用的对象数组来实现这个数据结构。
Class RememberedSet {Object[] set[OBJECT_INTERGENERATIONAL_REFERENCE_SIZE];
}
这种记录全部含跨代引用对象的实现方案,无论是空间占用还是维护成本都相当高昂。而在垃圾收集的场景中,收集器只需要通过记忆集判断出某一块非收集区域是否存在有指向了收集区域的指针就可以了,并不需要了解这些跨代指针的全部细节。那设计者在实现记忆集的时候,便可以选择更为粗犷的记录粒度来节省记忆集的存储和维护成本,下面列举了一些可供选择(当然也可以选择这个范围以外的)的记录精度:
- 字长精度:精确到一个机器字长,该字包含跨代指针
- 对象精度:每个记录精确到一个对象,该对象里有字段含有跨代指针
- 卡精度:每个记录精确到一块内存区域,该区域内有对象含有跨代指针
第三种“卡精度”所指的是用一种称为“卡表”(Card Table)的方式去实现记忆集,这也是目前最常用的一种记忆集实现形式。
卡表
卡表就是记忆集的一种具体实现,它定义了记忆集的记录精度、与堆内存的映射关系等。 关于卡表与记忆集的关系,不妨按照Java语言中HashMap与Map的关系来类比理解。
卡表最简单的形式可以只是一个字节数组,而HotSpot虚拟机确实也是这样做的。以下这行代码是HotSpot默认的卡表标记逻辑:
CARD_TABLE [this address >> 9] = 0;
字节数组CARD_TABLE的每一个元素都对应着其标识的内存区域中一块特定大小的内存块,这个内存块被称作“卡页”(Card Page)。一般来说,卡页大小都是以2的N次幂的字节数,通过上面代码可以看出HotSpot中使用的卡页是2的9次幂,即512字节(地址右移9位,相当于用地址除以512)。那如果卡表标识内存区域的起始地址是0x0000的话,数组CARD_TABLE的第0、1、2号元素,分别对应了地址范围为0x0000~0x01FF、0x0200~0x03FF、0x0400~0x05FF的卡页内存块
分析:卡表就是一个地址表,每一个地址都是一个内存区域;如果某一个区域发生了跨代引用,则标记为1,称为dirty,在GC的时候就可以将之加入GC遍历,否则直接略过即可。
那么,如何判断一个内存区域是否dirty,又如何改写响应的状态呢?
写屏障
就是给对象的引用实际赋值这个动作的AOP,本质上实现了在给对象赋值时进行卡表状态的维护
并发的可达性分析
由于堆内存和方法区(及其中的常量池)是线程共享的,那势必在GC的时候面临并发问题。在此处称为“对象消失问题”
以三色标记来推导:
黑球:已经被扫过
灰球:正在被扫(有的引用被扫过,有的引用没扫过)
白球:待扫
第一种情况:
先扫描了黑球1号,然后扫描黑球2号时,黑球2和白球1的引用关系被另一个线程切断了;此时黑球1又和白球1产生了关联,按理说白球1不该被回收,但此时扫描不可能回头再来一次,白球1号就可怜的消失了
第二种情况:
开始扫描时,某白球和黑球的关联被切断了;当扫描经过后,这种关联又被另一个线程加上了,但扫描仍旧不可重来,就会出现多个消失的对象。
理论总结:
- 赋值器插入了一条或多条从黑球到白球的引用
- 赋值器删除了从某个灰球(正在扫描的球)到某个白球的全部引用(直接或者间接)
针对这两个问题产生了两种解决措施:
增量更新:黑球如果发生了新增的引用关系,就重新变灰,待一轮扫描结束,从扫过但不是黑球的球开始重扫;
原始快照:当扫描开始后发生任何引用删除时,记录一个快照,这一次扫描,只按照这个快照走
目前常见的垃圾收集器
serial
最基础、历史最悠久。
这是一个单线程工作的收集器,最大的缺陷在于:一定会导致或长或短时间的stop the world.
优点:简单高效,仍旧是hotspot虚拟机的默认垃圾收集器。
parnew
serial的并行版本,其他性能与serial完全一致。
parnew可以和另外一款收集器——CMS同时工作,真正实现用户线程和收集线程并发运行。
G1
但随着CMS的替代产品G1出炉后,parnew合并入CMS,推出了历史舞台。
G1是面向全堆的垃圾收集器,根本不需要和其它收集器协同工作,所以以前parnew-CMS的模式也已完全消失。
parallel scavenge
这款收集器非常特别,它关注的是降低:
运行业务代码的时间/(运行业务代码的时间 + 垃圾收集的时间)
serial old / parallel old
分别是对应收集器的老年代版本。
CMS详述
Concurrent Mark sweep收集器是一款专注“最短回收停顿时间”的收集器。
四个阶段:
- 初始标记(停顿)
- 并发标记
- 重新标记(停顿)
- 并发清除
初始标记的时停很短,因为它只是标记一下GC Root能直接关联到的对象;
并发标记耗时很长,这个阶段是真正的遍历图结构,所以需要很长时间,但它可以和用户线程并发运行,所以没有停顿,这里使用了原始快照;
重新标记对应增量更新,在扫描中如果出现了新的引用关系,则需要从新的被引用的内存开始重新扫描;
并发清除,真正地回收掉内存。这一步也很慢,但它也可以和用户线程同步运行,所以也不需要停顿。
CMS是一款非常优秀的收集器,官方描述是:并发低停顿收集器。这是Hotspot第一次成功的完成低停顿收集器的目标。
但受制于时代局限,他还不算完美,至少有以下缺点:
- 对处理器资源敏感,由于需要一定的并发资源,所以会导致在某些场合减缓用户业务线程的运行。如果用户机处理器数量不够多(四个以下),会对应用程序造成巨大的负担,回收线程甚至可能占用25%以上的资源;
- 无法处理浮动垃圾。所谓浮动垃圾,是指在本次垃圾收集的过程中产生的垃圾。由于本次收集只针对开始时的快照,所以开始后产生的垃圾一概不能处理,只能留待下次垃圾收集。这就导致CMS不敢像其它收集器那样等着老年代几乎耗尽再开始收集,它必须预留一部分空间给用户线程。这进一步收窄了可用内存空间,事实上提高了垃圾回收的频率。如果预留的这部分空间不足够大,还会导致“并发失败”错误,触发一次full gc,这就会耗费更多的资源;
- 它基于标记清除法实现,就必然有标记清除法的固有弊端:内存碎片化,总会在某一时刻,需要移动内存来保证内存空间是整齐的。
所以CMS也终将被淘汰。
G1详述
oracle花费了数年时间打造了这一款面向全堆的垃圾收集器。官方称之为:“全功能垃圾收集器”。开发团队的期望是用g1完全代替CMS。
g1的目标是:在指定的M毫秒内,垃圾收集的时长大概率不超过N秒。也就是“停顿时间模型”。
在这个目标下,g1的整体设计思路发生了根本转变。在他之前,所有收集器的目标要么是新生代收集(minor gc),要么是老年代收集(major gc),要么是全堆收集(full gc)。
而g1的目标是,对任意一个内存区域,如果它的回收收益高,就收集,几乎完全剥离了分代理论。
具体实现
- 将内存区域划分为数个region,大小范围1-32mb之间2的N次幂。
- 每个region根据需要在不同时刻成为eden或survivor或old。
- 这种思路有效避免了整个java堆full gc,它维护了一张价值(回收获得的空间和回收所需的时间的综合评价)表,用于记录每个区域回收所能得到的收益,每次回收,优先回收价值更大的部分
仍待优化的问题
- 划分多个region后需要更多的资源来维护更为复杂的双向卡表结构
- 并发情况下,仍有可能出现CMS中回收速度赶不上收集速度而导致的full gc
- 每个步骤都有时停:初始标记,并发标记,最终标记,筛选回收
实验期垃圾收集器
shenandoah收集器
只有openjdk有,oracle商业版不提供这个功能。它有点像升级的G1。由于连源码都被oracle排除在外,这里暂且不讨论。
ZGC
这是oracle主推的正统低延迟垃圾收集器。目前仍有一定的实验性质,它可以做到:无论堆内存大小,
只要堆内存可管理,就可以保证毫秒级垃圾收集速度。
ZGC也存在region,但是它的region是动态的——动态创建,动态销毁。ZGC还为region提供了预分类,将其分为大中小三种。小型固定2mb,中型固定32mb,大型不固定,随需求变化,但必须是2mb的整数倍。
(未完待续)
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 搭建PXE服务及实现安装银河麒麟桌面操作系统
搭建PXE服务及实现安装银河麒麟桌面操作系统 一、安装PXE服务器前的准备 服务器操作系统:银河麒麟高级服务器操作系统V10 SP1 服务器IP地址:em1 172.17.31.163 用于连接外网,可以进行yum安装相关服务 em2 192.168.1.1 用于DHCP服务网段的配…...
2024/4/28 12:48:45 - 阿里2021年版十亿级并发系统设计+java性能优化实战文档
前言 快过年了,不知道大家回家了吗? 说也奇怪,快过年了疫情竟然严重了,又到了全民戴口罩做防护的时候。 好多人都是在隔离, 在待业,在家里面已经开始思索,为2021年的发展做计划,怎样才能让自…...
2024/4/28 1:59:18 - 【小白必备】IP编址的干货,你值得拥有!
【温馨提示】需要资料或者需要进群交流划到最底部 点分十进制 在学习编址之前,我们首先来了解一下IP地址。现在所使用的IP地址为版本4,一共32bit,二进制组成。 如果用二进制直接去表示IP地址,那么32个0和1对于人类来说识别起来过…...
2024/3/7 1:14:37 - 七大步骤、备战60天,4面拿下字节跳动offer:时间规划+知识点+画脑图+做笔记+看书+看视频+刷题刷题
前言 5年前,BAT冲到了风口浪尖,美国上市的阿里成为中国体量最大的互联网公司,腾讯借助微信成为移动互联网的霸主,外企开始撤离中国,国企的光环也慢慢褪去。 到了近年,应届毕业生心中最炙手可热的公司换成…...
2024/3/30 0:30:31 - 盘点一款好用的App免邀请码的渠道统计工具
1、Xinstall功能介绍 Xinstall是一款集智能传参、快速安装、一键拉起、多维数据统计等功能,帮住企业提高APP拉新转化率、安装率和多元化精确统计渠道效果的产品,同时免费提供Universal Link配置功能,提升应用转化效果。 传递智能参数&#…...
2024/4/28 6:04:38 - springcloud 学习记录-2020
参考文章: https://www.coder4.com/homs_online/ 从0到1实战微服务架构 https://www.iteye.com/blog/youyu4-2405976 分布式应用雪崩效应 springcloud 概念 微服务架构 优点:微服务低耦合、易维护、适合团队协作、测试起来成本更低,也更易于…...
2024/3/7 1:14:35 - 为什么黑客用“脚”都能黑进去的小网站,也开始用SSL证书了?
为什么黑客用“脚”都能黑进去的小网站,也开始用SSL证书了? 像蔚可云这样专业的云产品和服务提供平台,对数据安全有刻骨铭心的了解,因此在建站之初,就早早地启用了https站点。 但不知道从什么时候开始,一…...
2024/3/7 1:14:33 - Dependency ‘ commons-io: commons-io:2.6‘ not found
问题如下,使用idea2019配置maven3.6.0,第一次创建,使用maven导入jar提示如下 对比maven的setting.xml文件后,发现是jak配置写错了一个单词,这是修改后的,我在上传一份正常配置完的setting.xml文件 <?xm…...
2024/3/7 1:14:32 - 长虹电视安装第三方软件2021最新方法!
长虹电视安装第三方软件2021最新方法! 听说长虹电视装不了软件?教你隐藏小技巧,破解长虹电视不能安装u盘app...
2024/3/14 12:47:28 - vivo X60 Pro+观察:影像性能正成为vivo手机的核心竞争力
1月21日,X60系列中的超大杯X60 Pro正式亮相。作为同样注重成像素质的影像旗舰产品,vivo X60 Pro较X60、X60 Pro有全方位的提升。 X60 Pro在影像上都有怎样的提升?我们一起来看看。 01 从vivo X60系列强悍的影像性能说起 2020年12月29日&a…...
2024/3/6 17:53:14 - python爬虫原理和运营商SDK数据建模抓取的区别
当今是个不折不扣的大数据时代,大数据贯穿了我们的衣食住行,可以这么说,大数据是目前最宝贵的数据宝藏! 什么是Python爬虫? Python爬虫又叫网络爬虫 关于Python爬虫,我们需要知道的有: Python基…...
2024/3/6 17:53:11 - 半导体功率器件的发展及测试
近年来,全球半导体功率器件的制造环节以较快速度向我国转移。目前,我国已经成为全球最重要的半导体功率器件封测基地。如IDM类(吉林华微电子、华润微电子、杭州士兰微电子、比亚迪股份、株洲中车时代半导体、扬州杨杰等);模块类&a…...
2024/3/6 17:53:10 - Android程序员如何平稳度过35岁的坎?
一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: 二、一次又一次的伤害 某为很早就爆出来要裁员34岁以上员…...
2024/4/23 8:57:07 - 2021-01-25 vue中的scoped及穿透方法
scoped的由来 css一直有个令人困扰的作用域的问题:即使是模块化编程下,在对应的模块的js中import css进来,这个css仍然是全局的。为了避免css样式之间的污染,vue中引入了scoped这个概念。 在vue文件中的style标签上,有…...
2024/4/20 9:45:09 - IPFS矿机Filecoin挖矿火热进行中,Filecoin市场供需与流动性趋势分析!
自10月主网上线以来,Filecoin已经成为市场上最大的去中心化存储项目之一。Filecoin上线后,FIL代币解锁/释放主要来自投资者、官方、矿工。解锁/释放的FIL,可以但并不一定会立即进入2级市场流通,可能被长期持有、用于抵押挖矿&…...
2024/3/25 20:54:59 - DCDC电源PCB布局
DCDC电源PCB布局 虽然开关电源有高效率、宽动态范围等诸多优点,但同时带来了较为严重的开关干扰。这些干扰如果不采取一定的措施进行抑制、消除和屏蔽,就会严重地影响整机的正常工作。 像Maxim等一线厂商都提供了设计工具来帮助客户加快设计进程&#x…...
2024/4/9 6:44:18 - vue项目中使用sortablejs实现拖拽表格
1.首先install一下sortablejs npm install sortablejs --save 2.引入 import Sortable from "sortablejs"; 完整代码如下: HelloWorld.vue <template><div class"hello"><el-collapse v-model"activeNames">…...
2024/4/27 5:11:51 - web前端第二周总结
第二周总结 2021.1.18 网页布局的核心本质是:利用css样式摆放盒子;盒子模型四个组成部分:border边框,content内容,padding内边距,margin内边距边框border:注(边框会影响盒子的实际…...
2024/3/25 20:54:51 - API运营商无论从数据采集、数据处理、数据分析、数据访问和数据应用
运营商大数据建模抓取 在中国运营商拥有庞大且绝对真实的数据资源、与数据储备能力,关于对数据利用的心得与经验运营商有绝对的话语权,运营商大数据无论从抓取能力、数据管理、数据能力、标签能力、产品服务这几大块业务都有着出色的表现。 运营商大数据…...
2024/3/25 9:01:13 - 竟然可以用Python操作 Word 文档,这么多的骚操作!
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 本文主要讲解python中操作word的思路…...
2024/4/17 6:14:01
最新文章
- ChatGPT首批88个插件最全解读
以下是仅开通联网版本: 以下是插件商店: 先看看他们都长啥样: 再详细介绍ChatGPT 88个插件的具体功能 实际上我写完介绍之后已近有一百零几个插件了,关注我,后面持续更新 1.明智购买(BuyWisely…...
2024/4/28 19:06:56 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 关于搭建elk日志平台
我这边是使用docker compose进行的搭建 所以在使用的时候 需要自行提前安装docker以及dockercompose环境 或者从官网下载对应安装包也可以 具体文章看下一章节:【ELK】搭建elk日志平台(使用docker-compose),并接入springboot项目...
2024/4/27 6:58:40 - 星际门计划:微软与OpenAI联手打造未来AI超级计算机
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
2024/4/23 9:58:14 - 手搓 Docker Image Creator(DIC)工具(02):预备知识
此节主要简单介绍一下 Docker、Dockerfile 的基本概念,Dockerfile 对的基本语法,Windows 和 macOS 下 Docker 桌面的安装,Docker 镜像的创建和运行测试等。 1 关于 Docker Docker 是一个开源的应用容器引擎,它允许开发者打包应用…...
2024/4/26 16:52:01 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/28 4:04:40 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/28 12:01:04 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/28 16:34:55 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/28 18:31:47 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/28 12:01:03 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/28 12:01:03 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/28 12:01:03 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/28 16:07:14 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/27 21:08:20 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/28 9:00:42 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/27 18:40:35 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/28 4:14:21 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/27 13:52:15 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/27 13:38:13 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/28 12:00:58 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/28 12:00:58 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/27 22:51:49 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/28 7:31:46 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/28 8:32:05 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/27 20:28:35 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57