【JVM基础篇】Java垃圾回收器介绍
垃圾回收器(垃圾回收算法实现)
垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代,除了G1(既能管控新生代,也可以管控老年代)之外,新生代、老年代的垃圾回收器必须按照hotspot的要求成对组合进行使用(需要根据JDK的版本来选择相应的组合)
具体的组合关系如下:
JVM底层源码中,在某些特殊情况,CMS回收器会调用Serial Old回收器
Arthas查看所使用的垃圾回收器
不能直接看到使用了什么垃圾回收器,只能根据算法来推断
年轻代-Serial垃圾回收器
Serial是一种单线程串行回收年轻代的垃圾回收器。
回收年代和算法
- 年轻代
- 复制算法
优点
单CPU处理器下吞吐量非常出色
缺点
多CPU下吞吐量不如其他垃圾回收器(单线程,只使用了一个CPU),堆如果偏大会让用户线程处于长时间的等待
适用场景
Java编写的客户端程序或者硬件配置有限(CPU核数不多)的场景
如何使用
-XX:+UseSerialGC
:新生代、老年代都使用串行回收器。
老年代-SerialOld垃圾回收器
SerialOld是Serial垃圾回收器的老年代版本,采用单线程串行回收
回收年代和算法
- 老年代
- 标记-整理算法
优点
单CPU处理器下吞吐量非常出色
缺点
多CPU下吞吐量不如其他垃圾回收器,堆如果偏大会让用户线程处于长时间的等待
适用场景
与Serial垃圾回收器搭配使用,或者在CMS特殊情况下使用
如何使用
-XX:+UseSerialGC
:新生代、老年代都使用串行回收器。
年轻代-ParNew垃圾回收器
ParNew垃圾回收器本质上是对Serial在多CPU下的优化,使用多线程进行垃圾回收
回收年代和算法:
- 年轻代
- 复制算法
优点
- 多CPU处理器下停顿时间较短
缺点
- 吞吐量和停顿时间不如G1,所以在JDK9之后不建议使用
适用场景
- JDK8及之前的版本中,与CMS老年代垃圾回收器搭配使用
如何使用
-XX:+UseParNewGC
:新生代使用ParNew回收器, 老年代使用串行回收器
老年代-CMS(Concurrent Mark Sweep)垃圾回收器
CMS垃圾回收器关注的是系统的暂停时间(尽量减少STW,优化用户体验),允许用户线程和垃圾回收线程在某些步骤中同时执行,减少了用户线程的等待时间。
回收年代和算法
- 老年代
- 标记清除算法
优点
- 系统由于垃圾回收出现的停顿时间较短,用户体验好
缺点
1、内存碎片问题
2、退化问题(在某些特定情况,会退化为SerialOld这种单线程回收器)
3、浮动垃圾问题(回收过程,有的垃圾回收不掉)
适用场景
大型的互联网系统中用户请求数据量大、频率高的场景,比如订单接口、商品接口等
使用
XX:+UseConcMarkSweepGC
,可以分别设置年轻代和老年代的回收器
CMS执行步骤
- 初始标记,用极短的时间标记出GC Roots能直接关联到的对象。
- 并发标记, 标记所有的对象,用户线程不需要暂停。(虽然并发标记是和用户线程一起执行,但是如果并发标记占用的资源较高,也会影响用户线程)
- 重新标记(并发),由于并发标记阶段有些对象会发生了变化,存在错标(用的对象本来是存活的,标记之后,用户线程把它变得不存活了,导致错标)、漏标(因为是并发的,可能有的对象是用户线程刚刚创建出来的,就会导致漏标)等情况,需要重新标记。
- 并发清理,清理死亡的对象,用户线程不需要暂停。
注:只有初始标记、重新标记阶段会出现STW
缺点:
1、CMS使用了标记-清除算法,在垃圾收集结束之后会出现大量的内存碎片,为了不影响对象的分配,CMS会在Full GC时进行碎片的整理。这样会导致用户线程暂停,可以使用-XX:CMSFullGCsBeforeCompaction=N 参数(默认0)调整N次Full GC之后再整理。
2.、无法处理在并发清理过程中产生的“浮动垃圾”,不能做到完全的垃圾回收(在本次清理的过程中,用户线程并发创建了一些对象,但是很快没有再使用,这些对象在这次清理中没有得到回收,需要等到下一次清理,所以称这些为浮动垃圾)。
3、如果老年代内存不足无法分配对象,CMS就会退化成Serial Old单线程回收老年代。
并发线程数:
在CMS中并发阶段运行时的线程数可以通过-XX:ConcGCThreads
参数设置,由系统计算得出,计算公式为(-XX:ParallelGCThreads定义的线程数 + 3) / 4
, ParallelGCThreads是STW停顿之后的并行线程数
ParallelGCThreads是由处理器核数决定的:
1、当cpu核数小于8时,ParallelGCThreads = CPU核数
2、否则 ParallelGCThreads = 8 + (CPU核数 – 8 )*5/8
我的电脑上逻辑处理器有12个,所以ParallelGCThreads = 8 + (12 - 8)* 5/8 = 10,ConcGCThreads = (-XX:ParallelGCThreads定义的线程数 + 3) / 4 = (10 + 3) / 4 = 3
最终可以得到这张图:
并发标记和并发清理阶段,会使用3个线程并行处理。重新标记阶段会使用10个线程处理。由于CPU的核心数有限,并发阶段会影响用户线程执行的性能。
年轻代-Parallel Scavenge垃圾回收器
Parallel Scavenge是JDK8默认的年轻代垃圾回收器,多线程并行回收,关注的是系统的吞吐量。为了拉高吞吐量,PS会自动调整堆内存大小(调整新生代、老年代内存大小、晋升的阈值)。
回收年代和算法
- 年轻代
- 复制算法
优点
- 吞吐量高,而且支持手动设置参数控制吞吐量。为了提高吞吐量,虚拟机会动态调整堆的参数(用户只需要设置吞吐量,不需要设置内存大小等其他参数)
缺点
- 不能保证单次的停顿时间,但是支持设置STW时间
适用场景
- 后台任务,不需要与用户交互,并且容易产生大量的对象。比如:大数据的处理,大文件导出
常用参数
Parallel Scavenge允许手动设置最大暂停时间和吞吐量。Oracle官方建议在使用这个组合时,不要设置堆内存的最大值,垃圾回收器会根据最大暂停时间和吞吐量自动调整内存大小。
- 最大暂停时间,
-XX:MaxGCPauseMillis=n
设置每次垃圾回收时的最大停顿毫秒数 - 吞吐量,
-XX:GCTimeRatio=n
设置吞吐量为n(用户线程执行时间 = n/(n + 1)) - 自动调整内存大小,
-XX:+UseAdaptiveSizePolicy
设置可以让垃圾回收器根据吞吐量和最大停顿的毫秒数自动调整内存大小,这个参数默认是开启的(Oracle建议使用PS组合的时候,不要设置堆内存的最大值,让垃圾回收器自动调整)
注:最大暂停时间和吞吐量这两个指标是冲突的,垃圾回收器会尽量满足最大暂停时间(有时候设置得太小,是没办法满足的,会超出所设置得最大暂停时间),牺牲吞吐量。如果要同时设置最大暂停时间和吞吐量,要多做测试,让它们比较协调
老年代-Parallel Old垃圾回收器
Parallel Old是为Parallel Scavenge收集器设计的老年代版本,利用多线程并发收集。
回收年代和算法
- 老年代
- 标记-整理算法(其实是标记+清除+整理)
优点
- 并发收集,在多核CPU下效率较高
缺点
- 暂停时间会比较长
适用场景
- 与Parallel Scavenge配套使用
如何使用
JDK8设置参数,就是默认使用该回收器
参数:-XX:+UseParallelGC
或 -XX:+UseParallelOldGC
可以使用Parallel Scavenge + Parallel Old这种组合。
测试
-XX:+PrintFlagsFinal
:可以在程序启动的时候打印所有配置项的最终值,可以看看自动调整功能有没有开启
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 垃圾回收器案例3*/
//-XX:+UseSerialGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8 -XX:+PrintGCDetails -verbose:gc -XX:+PrintFlagsFinal
//-XX:+UseParNewGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8 -XX:+PrintGCDetails -verbose:gc
//-XX:+UseConcMarkSweepGC
//-XX:+UseG1GC -Xmn8g -Xmx16g -XX:SurvivorRatio=8 -XX:+PrintGCDetails -verbose:gc MaxGCPauseMillis
//-XX:+PrintFlagsFinal -XX:GCTimeRatio = 19 -XX:MaxGCPauseMillis=10 -XX:+UseAdaptiveSizePolicy
public class GcDemo2 {public static void main(String[] args) throws IOException {int count = 0;List<Object> list = new ArrayList<>();while (true){//System.out.println(++count);if(count++ % 10240 == 0){list.clear();}
// byte[] bytes = new byte[1024 * 1024 * 1];list.add(new byte[1024 * 1024 * 1 / 2]);
// System.gc();}}
}
【测试最大暂停时间=10】
内存大小如下:
【测试最大暂停时间=1】
结论:堆内存越小,垃圾回收暂停时间越短
G1(Garbage First)垃圾回收器(极力推荐)
JDK9之后默认的垃圾回收器是G1(Garbage First)垃圾回收器。
- Parallel Scavenge关注吞吐量,允许用户设置最大暂停时间 ,但是会减少年轻代可用空间的大小。
- CMS关注暂停时间,但是吞吐量方面会下降。
- 而G1设计目标就是将上述两种垃圾回收器的优点融合:
JDK9之后强烈建议使用G1垃圾回收器。(在JDK7、8上,G1可能不是很成熟,要慎重考虑)
G1出现之前的垃圾回收器,年轻代和老年代一般是连续的,如下图:
G1内存结构发生了变化:G1的整个堆会被划分成多个大小相等的区域,称之为区Region,区域不要求是连续的。分为Eden、Survivor、Old区。Region的大小通过堆空间大小/2048计算得到,也可以通过参数-XX:G1HeapRegionSize=32m
指定(其中32m指定region大小为32M),Region size必须是2的指数幂,取值范围从1M到32M。
G1垃圾回收有两种方式
1、年轻代回收(Young GC)
2、混合回收(Mixed GC)
年轻代回收(Young GC)
只回收年轻代,回收Eden区和Survivor区中不用的对象。会导致STW,G1中可以通过参数
-XX:MaxGCPauseMillis=n
(默认200) 设置每次垃圾回收时的最大暂停时间毫秒数,G1垃圾回收器会尽可能地保证暂停时间。
【Young GC步骤】
1、新创建的对象会存放在Eden区。当G1判断年轻代区不足(max默认60%,如果年轻代的内存占了总堆的60%以上,就要Young GC),无法分配对象时需要回收时会执行Young GC。
2、标记出Eden和Survivor区域中的存活对象,
3、根据配置的**最大暂停时间选择某些区域(和其他回收器的区别:其他回收器会回收负责的所有区域)**将存活对象复制到一个新的Survivor区中(年龄+1)(使用复制算法,不会产生内存碎片),清空这些区域。
G1在进行Young GC的过程中会去记录每次垃圾回收时每个Eden区和Survivor区的平均耗时,以作为下次回收时的参考依据。这样就可以根据配置的最大暂停时间计算出本次回收时最多能回收多少个Region区域了。比如-XX:MaxGCPauseMillis=n
(默认200),每个Region回收耗时40ms,那么这次回收最多只能回收4个Region。
4、后续Young GC时与之前相同,只不过Survivor区中存活对象会被搬运到另一个Survivor区。
5、当某个存活对象的年龄到达阈值(默认15),将被放入老年代。原来的Survivor中年龄没有到达15的对象,还是会迁移到新的Survivor中。
6、部分对象如果大小超过Region的一半,会直接放入老年代,这类老年代被称为Humongous(翻译:巨大的)区。比如堆内存是4G,每个Region是2M,只要一个大对象超过了1M就被放入Humongous区,如果对象过大会横跨多个Region(一个Region放不完)。
7、多次回收之后,会出现很多Old老年代区,此时总堆占有率达到阈值时
(-XX:InitiatingHeapOccupancyPercent
默认45%)会触发混合回收Mixed GC,回收所有年轻代和部分老年代的对象以及大对象区。采用复制算法来完成。
混合回收(Mixed GC)
混合回收分为如下步骤,看起来和CMS差不多,但是步骤里面都是有区别的:
- 初始标记(initial mark)
- 并发标记(concurrent mark)
- 最终标记(remark或者Finalize Marking):只管漏标,不管新创建、不再关联的对象。这里使用的算法远比CMS的快
- 并发清理(cleanup):G1对老年代的清理会选择存活度最低的区域来进行回收(A区:100个对象只存活1个;B区:100个对象存活99个;G1选择回收A区),这样可以保证回收效率最高,这也是G1(Garbage first)名称的由来。最后清理阶段使用复制算法,不会产生内存碎片。
注意:**如果清理过程中发现没有足够的空Region存放转移的对象,会出现Full GC,**单线程执行标记-整理算法,此时会导致用户线程的暂停,影响用户的正常使用。所以尽量保证应该用的堆内存有一定多余的空间,如果堆内存的占用比较高,就要考虑优化。
如何使用G1垃圾回收器
参数1: -XX:+UseG1GC
打开G1的开关,JDK9之后默认不需要打开
参数2:-XX:MaxGCPauseMillis=毫秒值
最大暂停的时
回收年代和算法
- 年轻代+老年代
- 复制算法
优点
- 支持巨大的堆空间回收,并有较高的吞吐量。对比较大的堆延迟可控,如超过6G的堆回收时
- 不会产生内存碎片
- 并发标记的SATB算法效率高,比CMS的算法效率高
- 支持多CPU并行垃圾回收
- 允许用户设置最大暂停时间
缺点
- JDK8的早期版本还不够成熟
适用场景
- JDK8最新版本、JDK9之后建议默认使用
测试
使用以下代码测试g1垃圾回收器,打印出每个阶段的时间:
package chapter04.gc;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 垃圾回收器案例3*/
//-XX:+UseG1GC -Xmn8g -Xmx16g -XX:SurvivorRatio=8 -XX:+PrintGCDetails -verbose:gc
public class GcDemo2 {public static void main(String[] args) throws IOException {int count = 0;List<Object> list = new ArrayList<>();while (true){//System.out.println(++count);if(count++ % 10240 == 0){list.clear();}
// byte[] bytes = new byte[1024 * 1024 * 1];list.add(new byte[1024 * 1024 * 1 / 2]);
// System.gc();}}
}
每个region大小为2m,一共有84个young区,26个幸存者区。
初始标记花了0.0478秒,初始标记是伴随着年轻代回收的,0.0478秒是两个操作的总时间
并发标记总共耗时10ms,不会产生STW。
最终标记,效率较高
清理阶段
垃圾回收器总结
垃圾回收器的组合关系虽然很多,但是针对几个特定的版本,比较好的组合选择如下:
- JDK8及之前:
- ParNew + CMS(关注暂停时间)
- Parallel Scavenge + Parallel Old (关注吞吐量)
- G1(JDK8之前不建议,较大堆并且关注暂停时间)
- JDK9之后:G1(默认)。从JDK9之后,由于G1日趋成熟,JDK默认的垃圾回收器已经修改为G1,所以强烈建议在生产环境上使用G1。G1的实现原理将在《原理篇》中介绍,更多前沿技术ZGC(最新的垃圾回收器)、GraalVM将在《高级篇》中介绍。
几个问题
Java中有哪几块内存需要垃圾回收?
方法区回收,Java程序员少关注
有哪几种常见的引用类型?
- 强引用,最常见的引用方式,由可达性分析算法来判断
- 软引用,对象在没有强引用情况下,内存不定时会回收
- 弱引用,对象在没有强引用情况下,会直接回收
- 虚引用,通过虚引用知道对象被回收了
- 终结器引用,对象回收时可以自救,不建议使用
有哪几种常见的垃圾回收算法?
常见的垃圾回收器有哪些?
Serial+Serial Old
:单线程回收,适用于单核CPU场景ParNew+CMS
:暂停时间较短,适用于大型互联网应用中与用户交互的部分Paraller Scavenge+Parallel Old
:吞吐量高,适用于后台进行大量数据操作G1
:适用于较大堆,具有可控暂停时间
文章说明
该文章是本人学习 黑马程序员 的学习笔记,文章中大部分内容来源于 黑马程序员 的视频黑马程序员JVM虚拟机入门到实战全套视频教程,java大厂面试必会的jvm一套搞定(丰富的实战案例及最热面试题),也有部分内容来自于自己的思考,发布文章是想帮助其他学习的人更方便地整理自己的笔记或者直接通过文章学习相关知识,如有侵权请联系删除,最后对 黑马程序员 的优质课程表示感谢。
相关文章:
【JVM基础篇】Java垃圾回收器介绍
垃圾回收器(垃圾回收算法实现) 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代,除了G1(既能管控新生代,也可以管控老年代)之外,新生代、老年代的垃圾回收器必须按照ho…...
java通过poi-tl导出word实战详细步骤
文章目录 与其他模版引擎对比1.引入maven依赖包2.新建Word文档exportWprd.docx模版3.编写导出word接口代码4.导出成果 poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让…...
将自签证书添加到Java的可信任证书列表中
文章目录 前言将自签证书添加到Java的可信任证书列表中添加到Java的可信任证书列表中 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞的人每天的运气都不会太差,实…...
一文清晰了解CSS——简单实例
首先一个小技巧: 一定要学会的vsCode格式化整理代码的快捷键,再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括: 类选择器:以.开头,用于选择具…...
工程师 - 什么是XML文件
XML(eXtensible Markup Language,扩展标记语言)文件是一种使用自定义标签来定义对象及其内部数据的纯文本文件。XML设计的目的是既易于人类阅读又易于机器解析,因此它在不同系统和应用之间传输和存储数据时非常有用。 XML的主要特…...
[AI 大模型] 阿里巴巴 通义千问
文章目录 [AI 大模型] 阿里巴巴 通义千问简介模型架构发展新技术和优势示例 [AI 大模型] 阿里巴巴 通义千问 简介 阿里巴巴的 通义千问 是由阿里云开发的一款大型语言模型,旨在为用户提供高效、智能的自然语言处理服务。 通义千问能够处理多种语言输入,…...
关于无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上 解决方法
文章目录 1. ERNEL32.dll 下载2. 解决方法 👍 个人网站:【 洛秋小站】 1. ERNEL32.dll 下载 Windows 7 在安装postman时报错缺少动态链接库,提示缺少.NET Framework,这是因为本地缺少相应的dll文件导致的,这时就需要下载ERNEL32.dll文件,在解…...
轻松创建对象——简单工厂模式(Java实现)
1. 引言 大家好,又见面了!在上一篇文章中,我们通过Python示例介绍了简单工厂模式,今天,我们继续深入这个话题,用Java来实现简单工厂模式。 2. 什么是简单工厂模式 简单工厂模式(Simple Facto…...
Docker Dockerfile:构建与优化
Docker Dockerfile:构建与优化 简介 Docker 是一种广泛使用的容器化技术,它允许开发人员将应用程序及其依赖环境打包到一个可移植的容器中。Dockerfile 是 Docker 中用于自动化容器镜像构建的脚本文件。本文将详细介绍 Dockerfile 的基本结构、指令使用…...
开源项目有哪些机遇与挑战?
随着全球经济和科技环境的快速变化,开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目,以推动技术创新和实现协作共赢。本文将从开源项目的发展趋势、参与开源的经验分享以及开源项目的挑战三个方面进行探讨。…...
利用【Python】【线性规划】优化工厂生产:实现智能资源配置与利润最大化的现代解决方案
目录 1. 问题背景和描述 1.1 问题背景 1.2 问题描述 2. 数学模型的建立 2.1决策变量 2.2 目标函数 2.3 约束条件 2.4 数学模型总结 3. 使用Python解决线性规划问题 3.1 导入必要的库 3.2 定义目标函数系数 3.3 定义不等式约束矩阵和向量 3.4 定义变量的边界 非负…...
【spark】Exception in thread “main“ ExitCodeException exitCode=-1073741701
在window上运行spark程序写到本地文件的时候报错。 val rdd sc.sparkContext.parallelize(list)val arr rdd.collect()arr.foreach(println)rdd.saveAsTextFile("test1")sc.close()错误信息: zhangsan lisi wangwu Exception in thread "main" ExitCode…...
数学建模美赛经验小结
图片资料来自网络所听讲座,感谢分享!...
206. 反转链表 (Swift 版本)
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 解题 /*** Definition for singly-linked list.* public class ListNode {* public var val: Int* public var next: ListNode?* public init() { self.val 0; self.…...
海狐外卖O2O商城系统:技术架构与运营模式的深度解析
摘要: 本文深入探讨了海狐外卖O2O商城系统的技术架构、功能特性以及运营模式。海狐外卖作为一款专注于细分市场领域的外卖餐饮解决方案,不仅拥有先进的技术栈支持,还通过丰富的系统插件和灵活的运营模式,为商户和用户提供高效、便…...
14-31 剑和诗人5 - 使用 AirLLM 和分层推理在单个 4GB GPU 上运行 LLama 3 70B
利用分层推理实现大模型语言(LLM) 大型语言模型 (LLM) 领域最近取得了显著进展,LLaMa 3 70B 等模型突破了之前认为可能实现的极限。然而,这些模型的庞大规模给其部署和实际使用带来了巨大挑战,尤其是在资源受限的设备上,例如内存…...
风景园林工程设计乙级资质业绩要求案例分析
项目数量与规模 数量要求:企业需要提供一定数量的已完成风景园林设计项目案例,这个数量可能依据具体政策而有所不同,但通常需要完成多个项目以展示设计团队的综合能力。 规模要求:项目规模需达到乙级资质标准所规定的级别&#…...
无人机之飞行规划与管理篇
无人机飞行规划与管理是确保无人机安全、高效且符合法规的运行的关键步骤。这一过程包括了对飞行任务的详细安排、航线的设定以及风险的评估和管理。下面简述这一过程的主要环节: 一、飞行目的和任务确定 在规划之初,必须明确无人机的飞行目的…...
realsense D435l+mid360标定
目录 一、安装realsense环境 二、获取realsense D450L相机内参 三、标定雷达和相机 1.下载livox_camera_calib 2.修改配置参数 3.使用fastlio生成点云 4.标定 一、安装realsense环境 git clone https://github.com/IntelRealSense/librealsense.git cd librealsense //更…...
深度学习中的正则化技术 - 数据集增强篇
序言 在机器学习与深度学习的广阔领域中,数据集的质量与规模往往是决定模型性能的关键因素之一。然而,现实世界中高质量、标注完善的数据集往往稀缺且获取成本高昂,这成为了制约算法进步的一大瓶颈。为了缓解这一问题,数据集增强…...
【Docker系列】Docker 镜像源:优化你的容器化开发流程
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【Linux】Windows环境下配置虚拟机静态IP
当前我们虚拟机的Linux操作系统,其IP地址是通过DHCP服务获取的。 DHCP:动态获取IP地址,即每闪重启设备后都会获取一次,可能导致IP地址频繁变更 原因1:办公电脑IP地址变化无所谓,但是我们要远程连接到Linux系统&#x…...
完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法,亲测有效!!!
完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法,亲测有效!!! 亲测有效 完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法,亲测有效࿰…...
链接服务器“XX”的OLEDB访问接口“MSOLEDBSQL”返回了消息“登录超时已过期” 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 出现如下问题: 与链接服务器的测试连接失败。执行Transact-SQL 语句或批处理时发生了异常。命名管道提供程序:无法打开与SQL SERVER的链接[53]链接服务器“XX”的OLEDB访问接口“MSOLEDBSQL”返回了消息“登录超时已过期…...
【AI伦理与社会责任】讨论人工智能在隐私保护、偏见消除、自动化对就业的影响等伦理和社会问题。
人工智能(AI)作为第四次产业革命的核心技术,在推动社会进步和经济发展的同时,也引发了一系列伦理和社会问题。以下从隐私保护、偏见消除以及自动化对就业的影响三个方面进行详细讨论。 一、隐私保护 人工智能技术的广泛应用涉及…...
Qt编程技巧小知识点(1)TCP缓存区数据读取
文章目录 Qt编程技巧小知识点(1)TCP缓存区数据读取小结 Qt编程技巧小知识点(1)TCP缓存区数据读取 TCP的socket对内存进行读取(使用socket->readall())的时候输出的内容有时会进行局部倒置,其…...
vue 搭建 pinia
文章目录 环境设置存储读取数据【 storeToRefs】借助storeToRefs将store中的数据转为ref对象,方便在模板中使用【getters】当state中的数据,需要经过处理后再使用时,可以使用getters配置【$subscribe】通过 store 的 $subscribe() 方法侦听 s…...
什么是CLR
CLR,全称为Common Language Runtime,即公共语言运行时,是微软为.NET产品构建的运行环境,与Java的JVM(Java虚拟机)类似,可以看作是.NET的虚拟机。CLR的主要作用和特点如下: 主要作用…...
Spring MVC -01
Spring 的 MVC 框架 Spring的MVC框架是Spring框架的一部分,它提供了用于开发Web应用程序的一组组件和设计模式。MVC是Model-View-Controller的缩写,是一种设计模式,用于将应用程序的逻辑与用户界面分离。 在Spring的MVC框架中,Mo…...
山海鲸可视化——天地图画面和热力图
山海鲸引入天地图目前只有 iframe 的方式引入 首先我们创建一个文件夹 ——index.html ——index.js ——data.js 大家都是大佬,我就不详细介绍了,上代码都能看得懂 首先是index.html <!DOCTYPE html> <html lang"zh-CN"> <…...
深圳高端品牌网站设计/北京做网站推广
DataGrid使用心得 原文地址:http://dotnet.chinaitlab.com/ADONET/398553.html1.为DataGrid控件设计样式 在<asp:datagridid"DataGrid1"runat"server">之后添加如下代码<FooterStyleForeColor"Black"BackColor"#CCCC…...
做网站哪个部分/新闻稿件代发平台
前言仅看 cb 和 optimizeCb 两个函数的名字,你可能想不到这是用来做什么的,尽管你可能想到 cb 是 callback 的缩写。 如果直接讲解源码,你可能想不明白为什么要这么写,所以我们从 _.map 函数开始讲起。 _.map_.map 类似于 Array.p…...
濮阳市城乡一体化示范区西湖医院/seo关键词推广方式
今天我们继续对数据库进行了优化,将原来的用户进行了分类。 转载于:https://www.cnblogs.com/CkmIT/p/6843865.html...
网站开发报价单模板/谷歌搜索为什么用不了
9.1 类(class) 面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板以Student类为例,在Python中,定义类是通过class关键字class后面紧接着是类名&#x…...
html网站建设方案/媒介平台
查找(Searching),也称检索,查表,就是在大量的信息集中寻找一个特定的信息元素。 查找就是根据给定的关键字值,在查找表中确定一个关键字等于给定的记录或数据元素。若存在这样的数据元素,则称查…...
找活做的网站/专业搜索引擎seo合作
1.这些符号在不同的系统下意义不同: //双斜线:协议和主机名之间的分隔符 (比如http://localhost:8080)/单斜线:windows里或者WEB上或者Unix内核的目录架构分隔符 \反斜线:windows 里的目录结构的分隔符&…...