垃圾回收的概念与算法(第四章)
《实战Java虚拟机:JVM故障诊断与性能优化 (第2版)》
第4章 垃圾回收的概念与算法
目标:
- 了解什么是垃圾回收
- 学习几种常用的垃圾回收算法
- 掌握可触及性的概念
- 理解 Stop-The-World(STW)
4.1. 认识垃圾回收 - 内存管理清洁工
垃圾回收(Garbage Collection,简称 GC),GC 中的垃圾,特指存在于内存中的、不会再被使用的对象,如果大量不会被使用的对象一直占着空间,在需要内存空间时有可能导致内存溢出。
垃圾回收并不是 JVM 独创的,早在 20 世纪 60 年代,垃圾回收就已经被 Lisp 语言所使用。现在,除了 Java,C#、Python 等语言都运用了垃圾回收的思想。
4.2. 常用的垃圾回收算法 - 清洁工具大 PK
常用的垃圾回收算法包括:引用计数法、标记清除法、复制算法、标记压缩法、分代算法和分区算法。
4.2.1. 引用计数法(Reference Counting)
1.最经典、最古老的一种垃圾收集算法。
2.实现:对于一个对象 A,只要任何一个对象引用了 A,则 A 的引用计数器就加 1,当引用失效时,引用计数器就减 1。只要对象 A 的引用计数器的值为 0,则对象 A 就不可能再被使用。
3.引用计数器的实现:为每个对象配备一个整型的计数器即可。
4.问题:非常严重的两个问题:
(1) 无法处理循环引用。因此,在 Java 的垃圾回收器中没有使用这种算法。
(2) 引用计算器要求在每次引用产生和消除的时候,伴随一个加法操作和一个减法操作,对系统性能会有一定的影响。
(1)一个简单的循环引用问题描述如下:有对象 A 和对象 B,对象 A 中含有对对象 B 的引用, 对象 B 中含有对象 A 的引用。此时,对象 A 和对象 B 的引用计数器都不为 0。但是,在系统中却不存在任何第 3 个对象引用了对象 A 或对象 B。也就是说,对象 A 和对象 B 是应该被回收的垃圾对象,但由于垃圾对象间相互引用,使垃圾回收器无法识别,引起了内存泄漏。
4.2.2. 标记清除法(Mark-Sweep)
1.标记清除法是现代垃圾回收算法的思想基础;
2.标记清除法将垃圾回收分为两个阶段:标记阶段和清除阶段;
3.实现:在标记阶段,首先通过根节点标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。
4.问题:可能产生空间碎片;
5.注意:标记清除法先通过根节点标记所有的可达对象,然后清除所有的不可达对象,完成垃圾回收。
如图 4.2 所示,使用标记清除法对一块连续的内存空间进行回收。从根节点开始(这里显示了 2 个根节点),所有的有引用关系的对象均被标记为存活对象(箭头表示引用)。从根节点起,不可达对象均为垃圾对象。在标记操作完成后,系统回收所有不可达对象的空间。
如图 4.2 所示,回收后的空间是不连续的。在对象的堆空间分配过程中,尤其是大对象的内存分配,不连续内存空间的工作效率要低于连续空间。因此,这也是该算法的最大缺点。
4.2.3. 复制算法(Copying)
1.核心思想:将原有的内存空间分为两块,每次只使用其中一块,在进行垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收;
2.优点:
(1)效率高:如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量就会相对很少;
(2)没有碎片:对象是在垃圾回收过程中统一被复制到新的内存空间中的,可确保回收后的内存没有碎片;
3.缺点:复制算法的代价是将系统内存折半;
4.新生代:存放年轻对象的堆空间。年轻对象指刚刚创建的或者经历垃圾回收次数不多的对象;
5.老年代:存放老年对象的堆空间。老年对象指经历多次垃圾回收后依然存活的对象;
6.注意:复制算法比较适合新生代,因为在新生代垃圾对象通常会多于存活对象,复制算法的效果会比较好;
如图 4.3 所示,A、B 两块相同的内存空间,A 在进行垃圾回收时,将存活对象复制到 B 中,B 在复制后保持连续。复制完成后,情况 A,并将空间 B 设置为当前使用空间。
在 Java 的新生代串行垃圾回收器中,使用了复制算法的思想。新生代分为 eden 区、from 区和 to 区 3 个部分。其中 from 区和 to 区可以视为用于复制的两块大小相同、地位相等且可进行角色互换的空间。from 区和 to 区也称为 survivor 区,即幸存者空间,用于存放未被回收的对象。
在进行垃圾回收时,eden 区的存活对象会被复制到未使用的 survivor 区(假设是 to 区),正在使用的 survivor 区(假设是 from )的年轻对象也会被复制到 to 区(大对象或者老年对象会直接进入老年代,如果 to 区已满,则对象也会直接进入老年代)。此时,eden 区和 from 区的剩余对象就是垃圾对象,可以直接清空,to 区则存放此次回收后的存活对象。这种改进的复制算法,既保证了空间的连续性,又避免了大量的内存空间浪费,如图 4.4 所示,显示了复制算法的实际回收过程。当所有存活对象都复制到 survivor 区(图中为 to)后,简单地清空 eden 区和备用的 survivor 区(图中为 from)即可。
4.2.4. 标记压缩法(Mark-Compact)
复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在新生代经常发生,但是在老年代,更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活对象较多,复制的成本将很高。因此,基于老年代垃圾回收的特性,需要使用其他算法。
1.老年代的回收算法,是在标记清除法的基础上做了一些优化;
2.实现:首先需要从根节点开始,对所有可达对象做一次标记。之后,将所有的存活对象压缩到内存的一端。然后,清理边界外所有的空间。
3.优点:
(1)避免了碎片的产生;
(2)不需要两块相同的内存空间,性价比较高;
4.最终效果等同于标记清除法执行完后再进行一次内存碎片整理,因此,也可以称为标记清除压缩法;
如图 4.5 所示,在通过根节点标记出所有的可达对象后,沿虚线进行对象移动,将所有的可达对象都移动到一端,并保持它们之间的引用关系,最后清理边界外的空间,即可完成垃圾回收工作。
4.2.5. 分代算法(Generational Collecting)
在前面介绍的算法中,没有一种算法可以完全替代其他算法,它们都有自己的优势和特点。根据垃圾回收对象的特性,使用合适的算法,才是明智的选择。
1.分代算法将内存区间根据对象的特点分成几块,根据每块内存区间的特点使用不同的回收算法,以提高垃圾回收的效率;
2.新生代比较适合使用复制算法:新生代的特点是朝生夕灭;
一般来说,JVM 会将所有的新建对象都放入称为新生代的内存区域,新生代的特点是对象朝生夕灭,大约 90% 的新建对象会被很快回收,因此新生代比较适合使用复制算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年代的内存空间。在老年代中,几乎所有的对象都是经过几次垃圾回收依然得以存活的。因此,可以认为这些对象在一段时期内,甚至在应用程序的整个生命周期中,将是常驻内存的。
3.老年代使用标记压缩法或标记清除法:
在极端情况下,老年代对象的存活率可以达到 100%。如果依然使用复制算法回收老年代,将需要复制大量对象。再加上老年代的回收性价比也低于新生代,因此这种做法是不可取的。根据分代的思想,可以对老年代的回收使用与新生代不同的标记压缩法或标记清除法,以提高垃圾回收效率。如图4.6所示,显示了这种分代回收的思想。
4.新生代回收的频率很高,但是每次回收的耗时很短;老年代回收的频率比较低,但是会消耗更多的时间;
为了支持高频率的新生代回收,虚拟机可能使用一种叫作卡表(Card Table)的数据结构。卡表为一个比特位集合,每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有新生代对象的引用。这样在新生代GC时,可以不用花大量时间扫描所有的老年代对象来确定每一个对象的引用关 系,可以先扫描卡表,只有当卡表的标记位为 1 时,才需要扫描给定区域的老年代对象, 而卡表位为0的老年代对象,一定不含有新生代对象的引用。如图 4.7 所示,卡表中每一位 表示老年代 4KB 的空间,卡表记录为 0 的老年代区域没有任何对象指向新生代,只有卡表 位为1的区域才有对象包含新生代引用,因此,在新生代GC时只需要扫描卡表位为1的老 年代空间。使用这种方式,可以大大加快新生代的回收速度。
4.2.6. 分区算法(Region)
1.分区算法将整个堆空间划分成连续的不同小区间,每一个小区间都独立使用,独立回收;
2.优点:可以控制一次回收小区间的数量;
一般来说,在相同条件下,堆空间越大,一次 GC 所需要的时间就越长,从而产生的停顿也越长。为了更好地控制 GC 产生的停顿时间,将一 块大的内存区域分割成多个小块,根据目标停顿时间,每次合理地回收若干个小区间,而不是回收整个堆空间,从而减少一次GC所产生的停顿。
4.3. 判断可触及性 - 谁才是真正的垃圾
4.3.1. 对象的复活 - finalize() 函数
1.可触及性包含以下 3 种状态:
- 可触及的:从根节点开始,可以到达这个对象;
- 可复活的:对象的所有引用都被释放,但是对象有可能在 finalize() 函数中复活;
- 不可触及的(可被回收):对象的 finalize() 函数被调用,并且没有复活,就会进入不可触及状态,不可触及的对象不可能被复活,因为 finalize() 函数只会被调用一次;
垃圾回收的基本思想是考查每一个对象的可触及性,即从根节点开始是否可以访问这个对象,如果可以,则说明当前对象正在被使用,如果从所有的根节点开始都无法访问到某个对象,说明该对象已经不再使用了,一般来说,该对象需要被回收。但事实上,一个无法触及的对象有可能在某个条件下使自己“复活”,如果是这样的情况,那么对它的回收就是不合理的,为此,需要给出一个对象可触及性状态的定义,并规定在什么状态下才可以安全地回收对象。
2.finalize() 函数是一个非常糟糕的模式,不推荐使用 finalize() 函数释放资源;
(1)因为 finalize() 函数有可能发生引用外泄,在无意中复活对象;
(2)由于 finalize() 函数是被系统调用的,调用时间是不明确的,因此不是一个好的资源释放方案,推荐在 try-catch-finally 语句中进行资源的释放。
4.3.2. 引用和可触及性的强度
1.Java 中提供了 4 个级别的引用:强引用、软引用、弱引用和虚引用。
除强引用外,其他 3 种引用均可以在 java.lang.ref 包中找到。如图 4.9 所示,显示了这 3 种引用类型对应的类,开发人员可以在应用程序中直接使用它们。其中 FinalReference 为“最终”引用,它用以实现对象的 finalize() 函数。
2.强引用就是程序中一般使用的引用类型,强引用的对象是可触及的,不会被回收。软引用、弱引用和虚引用的对象是软可触及、弱可触及和虚可触及的,在一定条件下都是可以被回收的。
3.强引用的特点:
(1)强引用可以直接访问目标对象;
(2)强引用所指向的对象在任何时候都不会被系统回收,JVM 宁愿抛出 OOM 异常,也不会回收强引用所指向的对象;
(3)强引用可能导致内存泄漏;
4.3.3. 软引用 - 可被回收的引用
1.软引用是比强引用弱一点的引用类型。如果一个对象只持有软引用,那么当堆空间不足时,就会被回收。软引用使用 java.lang.ref.SoftReference 类实现。GC 未必会回收软引用的对象,但是当内存资源紧张时,软引用就会被回收,软引用对象不会引起内存溢出。
4.3.4. 弱引用 - 发现即回收
1.弱引用是一种比软引用弱的引用类型。在系统 GC 时,只要发现弱引用,不管系统堆空间情况如何,都会将对象进行回收。但是,由于垃圾回收器的线程通常优先级很低,并不一定能很快地发现持有弱引用的对象。在这种情况下,弱引用对象可以存在较长时间。一旦一个弱引用对象被垃圾回收器回收,便会加入一个注册的引用队列(这一点和软引用很像)。弱引用使用 java.lang.ref.WeakReference 类实现。
2.注意:软引用、弱引用都非常适合保持那些可有可无的缓存数据。如果这么做,当系统内存不足时,这些缓存数据会被回收,不会导致内存溢出。而当内存资源充足时,这些缓存数据又可以存在相当长的时间,从而起到让系统加速的作用。
4.3.5. 虚引用 - 对象回收跟踪
1.虚引用是所有引用类型中最弱的一个。一个持有虚引用的对象,和没有引用几乎是一样的,随时都可能被垃圾回收器回收。当试图通过虚引用的 get() 方法取得强引用时,总会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程;
2.当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象后,将这个虚引用加入引用队列,以通知应用程序对象的回收情况。
3.由于虚引用可以跟踪对象的回收时间,所以也可以将一些资源释放操作放在虚引用中执行和记录。
4.4. 垃圾回收时的停顿 - Stop-The-World
垃圾回收器的任务是识别和回收垃圾对象,以进行内存清理。为了让垃圾回收器可以正常且高效地执行,在大部分情况下,会要求系统进入一个停顿的状态。停顿的目的是终止所有应用线程的执行,只有这样系统中才不会有新的垃圾产生,同时停顿保证了系统状态在某一个瞬间的一致性,也有益于垃圾回收器更好地标记垃圾对象。因此,在垃圾回收时,都会产生应用程序的停顿。停顿产生时,整个应用程序会被卡死,没有任何响应,因 此这个停顿也叫作“Stop-The-World”(STW)。
相关文章:
垃圾回收的概念与算法(第四章)
《实战Java虚拟机:JVM故障诊断与性能优化 (第2版)》 第4章 垃圾回收的概念与算法 目标: 了解什么是垃圾回收学习几种常用的垃圾回收算法掌握可触及性的概念理解 Stop-The-World(STW) 4.1. 认识垃圾回收 - 内存管理清洁工 垃圾…...
让您的客户了解您的制造过程“VR云看厂实时数字化展示”
一、工厂云考察,成为市场热点虚拟现实(VR)全景技术问世已久,但由于应用范围较为狭窄,一直未得到广泛应用。国外客户无法亲自到访,从而导致考察难、产品取样难等问题,特别是对于大型制造企业来说…...
CV——day80 读论文:DLT-Net:可行驶区域、车道线和交通对象的联合检测
DLT-Net:可行驶区域、车道线和交通对象的联合检测I. INTRODUCTIONII. ANALYSIS OF PERCEPTIONIV. DLT-NETA. EncoderB. Decoder1) Drivable Area Branch(可行驶区域分支)2) Context Tensor(上下文张量)3) Lane Line Branch(车道线分支)4) Traffic Object Branch(目标检测对象分…...
工具篇4.5数据可视化工具大全
1.1 Flourish 数据可视化不仅是一项技术,也是一门艺术。当然,数据可视化的工具也非常多,仅 Python 就有 matplotlib、plotly、seaborn、bokeh 等多种可视化库,我们可以根据自己的需要进行选择。但不是所有的人都擅长写代码完成数…...
京东前端二面常考手写面试题(必备)
实现发布-订阅模式 class EventCenter{// 1. 定义事件容器,用来装事件数组let handlers {}// 2. 添加事件方法,参数:事件名 事件方法addEventListener(type, handler) {// 创建新数组容器if (!this.handlers[type]) {this.handlers[type] …...
如何用AST还原某音的JSVMP
1. 什么是JSVMP vmp简单来说就是将一些高级语言的代码通过自己实现的编译器进行编译得到字节码,这样就可以更有效的保护原有代码,而jsvmp自然就是对JS代码的编译保护,具体的可以看看H5应用加固防破解-JS虚拟机保护方案。 如何区分是不是jsv…...
【蓝桥杯试题】 递归实现指数型枚举例题
💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:蓝桥杯试题 文章目录1. 题目描述2. 思路解释2.1 时间复杂度2.2 递归3. 代码展示最后&#x…...
【用Group整理目录结构 Objective-C语言】
一、接下来,我们看另外一个知识点,怎么用Group把这一堆乱七八糟的文件给它整理一下,也算是封装一下吧, 1.这一堆杂乱无章的文件: 那么,哪些类是属于模型呢,哪些类是属于视图呢,哪些类是属于控制器呢, 我们接下来通过Group的方式,来给它们分一下类, 这样看起来就好…...
JavaScript高级程序设计读书分享之8章——8.1理解对象
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 创建自定义对象的通常方式是创建 Object 的一个新实例,然后再给它添加属性和方法。 let person new Object() person.name Tom person.age 18 person.sayName function(){//示 this.name…...
代码随想录算法训练营第四十天 | 343. 整数拆分,96.不同的二叉搜索树
一、参考资料整数拆分https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 视频讲解:https://www.bilibili.com/video/BV1Mg411q7YJ不同的二叉搜索树https://programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90…...
数据结构与算法系列之顺序表的实现
这里写目录标题顺序表的优缺点:注意事项test.c(动态顺序表)SeqList.hSeqList.c各接口函数功能详解void SLInit(SL* ps);//定义void SLDestory(SL* ps);void SLPrint(SL* ps);void SLPushBack(SL* ps ,SLDataType * x );void SLPopBack(SL* ps…...
基于Linux_ARM板的驱动烧写及连接、挂载详细过程(附带驱动程序)
文章目录前言一、搭建nfs服务二、ARM板的硬件连接三、putty连接四、挂载共享文件夹五、烧写驱动程序六、驱动程序示例前言 本文操作环境:Ubuntu14.04、GEC6818 这里为似懂非懂的朋友简单叙述该文章的具体操作由来,我们的主要目的是将写好的驱动程序烧进…...
python-爬虫-字体加密
直接点 某8网 https://*****.b*b.h*****y*8*.com/ 具体网址格式就是这样的但是为了安全起见,我就这样打码了. 抛出问题 我们看到这个号码是在页面上正常显示的 F12 又是这样就比较麻烦,不能直接获取.用requests库也是获取不到正常想要的 源码的,因为字体加密了. 查看页面源代码…...
计算机组成原理4小时速成5:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线
计算机组成原理4小时速成5:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,…...
安全狗受聘成为福州网信办网络安全技术支撑单位
近日,福州市委网信办召开了2022年度网络安全技术支撑单位总结表彰大会。 作为国内云原生安全领导厂商,安全狗也出席了此次活动。 据悉,会议主要对2022年度优秀支撑单位进行表彰,并为2023年度支撑单位举行授牌仪式。 本次遴选工…...
RV1126 在Ubuntu18.04开发环境搭建
1:安装软件终端下输入安装命名:sudo apt install openssh-serversudo apt install android-tools-adbsudo apt install vim net-tools gitsudo apt install cmakesudo apt install treesudo apt install minicomsudo apt install gawksudo apt install bisonsudo ap…...
如何在 C++ 中调用 python 解析器来执行 python 代码(一)?
实现 Python UDF 中的一步就是学习如何在 C 语言中调用 python 解析器。本文根据 Python 官方文档做了一次实验,记录如下: 1. 安装依赖包 $sudo yum install python3-devel.x86_642. 使用 python-config 来生成编译选项 $python3.6-config --cflags -…...
操作系统权限提升(二十三)之Linux提权-通配符(ws)提权
系列文章 操作系统权限提升(十八)之Linux提权-内核提权 操作系统权限提升(十九)之Linux提权-SUID提权 操作系统权限提升(二十)之Linux提权-计划任务提权 操作系统权限提升(二十一)之Linux提权-环境变量劫持提权 操作系统权限提升(二十二)之Linux提权-SUDO滥用提权 利用通配符…...
Zookeeper下载和安装
Zookeeper 1.下载 官方下载地址:https://zookeeper.apache.org/ 版本:apache-zookeeper-3.7.1-bin.tar.gz 2. 安装 2.1 本地安装 2.1.1 安装JDK 见:Hadoop集群搭建 2.1.2 上传安装包 使用远程工具拷贝安装包到Linux指定路径 /opt/s…...
Biomod2 (上):物种分布模型预备知识总结
Biomod11.栅格数据处理1.1 读取一个栅格图片1.2 计算数据间的相关系数1.3 生成多波段的栅格图像1.4 修改变量名称1.4.1 计算多个变量之间的相关性2. 矢量数据处理2.1 提取矢量数据2.2 数据掩膜2.2 栅格计算2.3 拓展插件的使用3. 图表绘制3.1 遥感影像绘制3.2 柱状图分析图绘制3…...
操作指南:如何高效使用Facebook Messenger销售(二)
上一篇文章我们介绍了使用Facebook Messenger作为销售渠道的定义、好处及注意事项,本节我们将详细介绍怎么将Facebook Messenger销售与SaleSmartly(ss客服)结合,实现一站式管理多主页配图来源:SaleSmartly(…...
计算机三级|网络技术|中小型网络系统总体规划与设计方案|IP地址规划技术|2|3
p3 p4一、中小型网络系统总体规划与设计方案网络关键的设备选型路由器技术指标性能指标综述吞吐量背板能力丢包率时延抖动突发处理能力路由表容量服务质量网管能力可靠性和可用性1 吞吐量指路由器的包转发能力,涉及两个内容:端口吞吐量和整机吞吐量&…...
为什么一定要做集成测试?
集成测试,我们都不陌生,几乎我们产品每天都在进行。但是我们真的有好好思考:为什么一定要做集成测试吗?只是为了简单的将“积木”搭起来就行,还是有什么其他的深意? 深意可能不一定会有,但是意…...
前端:CSS
CSS基本语法规则:选择器若干属性声明 style标签:可以放到代码的任意位置处,head/body中都可以 三种写CSS的方式: 1、内部样式:使用style标签,直接把CSS写到html文件中。此时的style标签可以放到任何位置…...
CMMI—组织级过程定义(OPD)
大家好,我是Doker 多克!一、目的组织级过程定义(Organizational Process Definition, OPD)的目的在于建立并维护一套可用的组织级过程资产、工作环境标准以及团队规则与指南二、简介组织级过程资产使得整个组织具有一致…...
华为OD机试真题Python实现【猜字谜】真题+解题思路+代码(20222023)
猜字谜 题目 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。 猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序以后一样的,比如通过变换w和e的顺序,nwes跟news是可以完全对应的…...
软测入门(三)Selenium(Web自动化测试基础)
Selenium(Web端自动测试) Selenium是一个用于Web应用程序测试的工具:中文是硒 开源跨平台:linux、windows、mac核心:可以在多个浏览器上进行自动化测试多语言 Selenium WebDriver控制原理 Selenium Client Library…...
备战蓝桥杯——sort函数
备战蓝桥杯——sort函数排列字母lambda匿名函数排列字母 链接: 排列字母 不用多说,很简单的签到题,我们先来了解一下sort函数的用法 list.sort(cmpNone, keyNone, reverseFalse) cmp:进行比较的方法(可以自定义排序的方法,通常…...
华为机试题:HJ86 求最大连续bit数(python)
文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…...
机器学习复习--logistic回归简单的介绍和代码调用
最近需要复习一下机器学习相关知识,记录一下 一、简介 线性回归:h(x)wTxbh(x)w^T x bh(x)wTxb logistic回归就是在线性模型的基础上加上一个sigmoid函数ggg,即h(x)g(wTxb)h(x)g(w^T xb)h(x)g(wTxb)。。。g(z)1/(1e−z)g(z)1/(1e^{-z})g(z)…...
沈阳网站搜索引擎优化/凡科建站的优势
橡胶密封圈是由一个或几个零件组成的环形罩,固定在轴承的一个套圈或垫圈上并与另一套圈或垫圈接触或形成窄的迷宫间隙,防止润滑油漏出及外物侵入。一、按类状分1.O型密封圈系列拥有氟橡胶,丁晴胶,硅胶、乙丙橡胶、双氟橡胶等多种材…...
海南省做购房合同网站/seo排名培训公司
转自:http://bbs.mydigit.cn/read.php?tid270847&displayMode1&page1&toread1 近几天量产一个金士顿 DataTraveler G2 4GB U盘(群联 PS2251-39 主控芯片),不小心量产成一个 USB-CDROM和一个本地磁盘(均可…...
虫虫wap建站源码/seo文章是什么
** 问题描述:**将一个2k2k单元格的棋盘用四种L型的图形进行完全覆盖(不能覆盖红色格子,不能发生重复覆盖)。** 思考:**1)如何能够让计算机实现这种算法?2)棋盘的大小为什么要为2k2k的单元格大小?任意的大小可以吗&…...
网站建设资费/谷歌搜索引擎入口
搜索引擎之中文分词实现(java版)前几天读到google研究员吴军的数学之美系列篇,颇有感触。而恰好自己前段时间做了个基于统计语言模型的中文切分系统的课程项目,于是乎,帖出来与大家共同学习。分词技术在搜索引擎&#…...
建设部网站官网 建造师 挂靠/seo优化好做吗
方法一:生成两个(1,5)的随机数,这样一共是25种情况,注意这两个数是有顺序的,从这25种情况中,取前21种,每三种代表(1,7)中的一个数字,如果取到的是…...
银川网站建设价格/百度推广关键词和创意
1. 支持手机、pad等移动设备远程控制功能。2、支持DLNA、Airplay、QPaly等协议。3、Cortex-A9四核,7寸电容触摸屏,1024*600高清分辨屏,标配通用的网络接口,内置wifi无线连接。4、功率:35W*45、4声道输出,支…...