Java GC机制 —— 个人笔记

【Java】浅谈Java的GC机制 目录一、GC机制概述二、JAVA的内存管理1、私有内存区:2、共享内存区三、GC机制详述(一) 确定回收对象1、如何确定哪些内存需要被回收?2、四种引用类型(二) 确定回收机制1、标记-清除算法(Mark-Sweep)2、复制算法(Copying)3、标记-整理算法(Mark-Compact)4、分代收集算法(三) 确定回收时机四、垃圾收集器1、Serial收集器2、Serial Old收集器3、... 阅读详情

文章源于学习若干个博客过程中整合,图源于图文并茂,万字详解,带你掌握 JVM 垃圾回收!

7种垃圾回收器特点,优劣及使用场景

GC garbage collection 垃圾回收

C/C++中,对象的申请和释放都需要程序员自己进行操作,然而程序员如果忘记对内存空间进行正确的释放,可能导致内存泄漏。

为避免此类情况发生,GC机制可以让程序员开发过程中更专注程序应用本身,而无需考虑内存泄露问题。

  • GC自动检测对象是否超过作用域,自动回收内存
  • 垃圾收集器自动管理

JVM内存区

JVM一共有五个区域: Method Area, VM stack, Native Mathod Stack, Heap, Program Counter Register

其中GC回收的区域为:

  1. 堆区
  2. 方法区

GC回收区域的共同点为:线程共享

对象是否需要回收?

对象无引用,或不可达

判断方法

1. 引用计数法

static class Test{
    public Test instance;
}

public void run() {
    Test t1 = new Test();
    Test t2 = new Test();
    t1.instance = t2; 
    t2.instance = t1;
    // t1和t2相互引用
}

如果我们执行run()方法后,虽然t1和t2不会再被访问,但由于t1, t2相互引用对方,引用计数器不为0,无法对他们进行回收。所以,市面上主流的Java虚拟机都没有使用这个算法,而是使用可达性分析法

2. 可达性分析法(根搜索算法)

通过 GC Roots根对象来作为起始节点,从这些节点开始,根据引用关系向下搜索,搜索过程的就是一条引用链(Reference Chain)。不在这个链里面的对象,就认为是 可回收的

在这里插入图片描述
哪些对象可以作为GC Roots?

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象,参数,局部变量,临时变量
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈JNI引用对象

虚拟机栈引用的对象

当运行某个函数的时候,JVM就会为这个函数在栈区开辟内存,如果运行main函数,那么JVM为main函数的局部变量在栈区开辟内存

public class Test {
    public static void main(String[] args) {
		Test a = new Test();//a是栈中局部变量
		a = null; //a为null的时候,他和原本的new Test()断开连接
		//对象回收
    }
}

方法区中类静态属性引用的对象

方法区本身用于存放类的信息:名称,父类,接口,变量等

public class Test {
    public static Test s; //s为类静态属性引用的对象
    public static void main(String[] args) {
		Test a = new Test();
		a.s = new Test();
		a = null;
    }
}

a = null 时,由于 a 原来指向的对象与 GC Root (变量 a) 断开了连接,所以 a 原来指向的对象会被回收。
然而s是类静态属性,且被赋值引用,被认为是GC Root,s依然 可达

方法区中常量引用的对象


public class Test {
	public static final Test s = new Test();
    public static void main(String[] args) {
	    Test a = new Test();
	    a = null;
    }

同上,a对象被回收不会影响到常量s指向的对象

本地方法栈中 JNI(Java Native Interface引用) 的对象

  • 一个 java 调用非 java 代码的接口
  • 可能由 C 或 Python等其他语言实现的
  • 通过 JNI 来调用本地方法, 而本地方法是以库文件的形式存放的(Windows为dll, unix上为so文件)

区别?

Java方法本地方法
虚拟机会创建一个栈桢并压入 Java 栈虚拟机会保持 Java 栈不变,不会在 Java 栈祯中压入新的祯,虚拟机只是简单地动态连接并直接调用指定的本地方法。
Java的引用

强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)

//强引用
String s = new String("hello");
System.gc();
System.out.println(s);

和前文一样,强引用存在,垃圾收集器永远不会回收被引用的对象,只有当引用被设为null的时候,对象才会被回收。如果赋值给static变量,对象很长一段时间都不会被回收

//软引用
String s = new String("hello");
//强引用添加到软引用
SoftReference<String> softReference = new SoftReference<>(s);
s=null;
//执行垃圾回收
System.gc();
//再次获取
if(softReference !=null ){
    System.out.println(softReference.get());
}

GC过程中,如果内存充足,软引用对象不会被释放

//弱引用
WeakReference<String> weakReference = new WeakReference<>(new String("hello"));
 //执行垃圾回收
 System.out.println("执行垃圾回收之前");
 System.out.println(weakReference.get());
 System.gc();
 System.out.println("执行垃圾回收之后:");
 System.out.println(weakReference.get());

只要系统执行完垃圾回收,无论内存是否足够,弱引用变量指向的对象都会被回收。

ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
PhantomReference<String> phantomReference = new PhantomReference<>(new String("hello"), referenceQueue);
System.gc();
System.out.println(referenceQueue.remove().get());

无论内存是否足够,弱引用变量指向的对象都会被回收,和虚引用的区别在于,无法通过虚引用来取得一个对象实例,虚引用也不会对生成他的对象生存时间产生影响。

作用:对象被收集器回收的时候得到系统通知

对象何时被回收?

  • 自动调用的情况:

    • 程序创建新对象/基本类型数据
    • 内存空间不足
  • 手动调用的情况

    • System.gc()

回收策略

回收策略1:引用计数算法

  • 发现垃圾时,立即回收。

  • 最大限度减少程序暂停,因为发现后立即回收,减少了程序因内存爆满而被迫停止的现象

  • 时间开销大,因为引用计数算法需要时刻监控引用计数器的变化。

  • 无法回收循环引用的对象

回收策略2:标记清除算法(Mark-Sweep)

未引用对象并不会被立即回收,垃圾对象将一直累计到内存耗尽为止,当内存耗尽时,程序将会被挂起,垃圾回收开始执行

  1. 遍历所有对象,标记所有的可达对象
  2. 会遍历所有对象,清除没有标记的对象

优点:简单,快速
缺点:标记和清除过程效率不高 —— 之后会产生大量不连续的内存碎片,提高触发另一次垃圾收集动作的概率
在这里插入图片描述

回收策略3:标记整理算法(Mark-Mark-Compact)

  1. 标记过程仍然与“标记-清除”算法一样

  2. 第二阶段不对可回收对象进行清理,而让所有存活的对象都向一端移动

在这里插入图片描述

回收策略4:复制算法(Copying)

改进了标记-清除算法的效率

内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
在这里插入图片描述
优点

  1. 不用考虑内存碎片
  2. 简单高效

缺点

  1. 内存缩小一半

回收策略5:分待回收机制

于是我们结合前面的2,3,4 三种策略,得到了当前最流行的分带回收机制算法

  • 新生代:复制算法
  • 老年代:标记-清除算法、标记-整理算法
弱分代假说:绝大多数对象都是朝生夕死的。
强分代假说:熬过越多次的垃圾回收的对象,就越难消亡

绝大多数对象在前几次GC过程中回收,经过多次GC过程未被回收的对象很难消亡。

于是把对象分为 新生代, 老年代。然后分配到不同的区域后,执行不同的策略。比例一般为1:2

新生代老年代
大部分对象会被回收难被回收
频繁使用可达性分析法较少频率回收
存活对象被复制到幸存者区域后被释放

详细说明

新生代

  1. 所有new的对象先出现在新生代中
  2. 新生代内存满了触发一次GC事件(Minor garbage collection)
  3. 无法回收的对象移动到老年代
  4. Minor garbage collection为全局暂停事件,垃圾回收过程结束其他线程才可运行

老年代

  1. 老年代被占满时也会触发GC时间(Major garbage collection)
  2. 也需要全局暂停
  3. 涉及所有存活对象,更慢。受老年代垃圾回收器影响

除此之外,还有一个永久代(在非heap内存)

  1. 存储了描述应用程序类和方法的源数据
  2. JVM 在运行时基于应用程序所使用的类产生
  3. 类不在被其他类所需要,同时其他类需要更多的空间的时候才会被回收(此回收过程为Full garbage collection)
    在这里插入图片描述
内存区分配

前面说过,新生代(Young generation)、老年代(Old generation)所占空间比例为 1 : 2,其中新生代还会被分为三个空间

  • 1个伊甸园空间(Eden)
  • 2个幸存者空间(Fron Survivor、To Survivor)

默认情况下,新生代空间的分配:Eden : Fron : To = 8 : 1 : 1
在这里插入图片描述

为何还要对新生代进行划分?

假设我们没有survivor

  1. Eden区每进行一次Minor GC,存活的对象就会被送到老年代。
  2. 老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)
  3. 老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多

如果不划分新生代区,有无其他方法避免上述情况?

方案优点缺点
增加老年代空间更多存活对象才能填满老年代。降低Full GC频率随着老年代空间加大,一旦发生Full GC,执行所需要的时间更长
减少老年代空间Full GC所需时间减少老年代很快被存活对象填满,Full GC频率增加

上述两种解决方案都不能从根本上解决问题

Survivor:就是减少被送到老年代的对象,进而减少Full GC的发生。Survivor的预筛选保证:经历16次Minor GC还能存活的对象,才会被送到老年代。

为啥Survivor区需要两个?

若只有一个Survivor区,会出现以下情况

  1. Eden满了,触发一次Minor GC,Eden中的存活对象就会被移动到Survivor区,此时Eden和Survivor各有一些存活对象
  2. Minor GC到底一定次数后,Survivor区会把部分数据存到Old区,eden也会把数据存放到Survivor区
  3. 但是Eden存到Survivor的数据不一定能刚好存入Survivor空缺部分的数据,导致内存碎片化

在这里插入图片描述
应该建立两块Survivor区

  1. 刚刚新建的对象在Eden中
  2. 经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;
  3. 等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制到survivor space S1

在这里插入图片描述

垃圾收集器

在这里插入图片描述
新生代收集器

  • Serial
  • ParNew
  • parallel
    老年代收集器
  • Serial Old
  • CMS
  • Parallel Old
    新生代和老年代收集器
    G1

常用组合
在这里插入图片描述

新生代:Serial

  • 单线程收集器
  • 使用**“复制”**算法
  • GC过程中,所有线程必须暂停
    在这里插入图片描述
    特点
  1. 简单,无上下文切换,效率高
  2. 用户体验较差,其不知情情况下停止所有线程
  3. 适用场景:Client 模式(桌面应用);单核服务器。
  4. 使用命令如下开启Serial作为新生代收集器
-XX:+UserSerialGC #选择Serial作为新生代垃圾收集器

新生代:ParNew

serial的一个多线程版本
多核机器上,其默认开启的收集线程数与cpu数量相等。可以通过如下命令进行修改

-XX:ParallelGCThreads #设置JVM垃圾收集的线程数  

在这里插入图片描述

当用户线程都执行到安全点时,所有线程暂停执行,采用复制算法进行垃圾收集工作

特点

  • 有效利用CPU
  • 用户体验较差,其不知情情况下停止所有线程
  • Server模式常用,因为CMS收集器只能和serial或者parNew联合使用。可以使用如下命令进行强制指定
-XX:UseParNewGC #新生代采用ParNew收集器  

新生代:Parallel Scavenge

  • 复制算法
  • 对比parNew,PS收集器关注缩短GC停顿时间,从而达到可控的吞吐量

吞吐量 = 运行用户代码时间 运行用户代码时间 + 垃圾收集时间 吞吐量=\frac{运行用户代码时间}{运行用户代码时间+垃圾收集时间} 吞吐量=运行用户代码时间+垃圾收集时间运行用户代码时间​

例如虚拟机一共运行了 100 分钟,其中垃圾收集花费了 1 分钟,那吞吐量就是 99%

垃圾收集器每 100 秒收集一次,每次停顿 10 秒,和垃圾收集器每 50 秒收集一次,每次停顿时间 7 秒,虽然后者每次停顿时间变短了,但是总体吞吐量变低了,CPU 总体利用率变低了。
在这里插入图片描述

特点

  • 高吞吐量,高CPU利用率,可控
  • 使用高吞吐量高CPU利用率场景,如高速运算,少量交互的情况

老年代:Serial Old

Serial Old是Serial收集器的老年代版本
标记-整理算法

适用场景

  • Client模式;
  • 单核服务器;
  • 与Parallel Scavenge收集器搭配;
  • 作为CMS收集器的后备方案,在并发收集发生Concurrent Mode Failure时使用

老年代:Parallel Old

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法

在这里插入图片描述
一般搭配Parallel Scavenge 收集器

参数指定

-XX:+UserParallelOldGC

CMS收集器

获取最短回收停顿时间为目标的收集器。采用的算法是“标记-清除“

  1. 标记GC Roots 能够直接关联到达对象
  2. 并发标记,进行GC Roots Tracing 的过程
  3. 重新标记,修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录
  4. 标记清除算法清除对象
    在这里插入图片描述
    特点
  • 并发收集,低停顿
  • CPU资源非常敏感,默认回收线程数(CPU数量+3)/4,CPU数量不足4个对用户影响较大
  • 无法处理浮动垃圾
    • 可能会出现“Concurrent Mode Failure”失败而导致一次FullGC的产生
    • 此时用SerialOld来重新进行老年代GC
    • CMS并发清理阶段用户线程还在运行,伴随程序运行自然还会有新的垃圾产生,所以只能等待下一次GC清楚,无法填满后GC
    • -XX:CMSInitiatingOccupancyFraction修改CMS触发的百分比
  • 空间碎片

混合:G1

面向服务端应用的垃圾收集器,目前是JDK9的默认垃圾收集器

  • 并行并发
  • 分代收集。能够采用不同的方式去处理新创建的对象和已经存活了一段时间的对象
  • 整体上来看基于“标记-整理”,部上看是基于复制算法,不产生空间碎片
  • 可预测的停顿

Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但两者之间不是物理隔离的。他们都是一部分Region的集合

在这里插入图片描述
一个方块对应一个区域,他的身份不定,每种身份的数量也不一定

JVM启动设置每个区为2的次幂大小,最多为2048个区域( 2048 × 32 M = 64 G 2048\times 32M=64G 2048×32M=64G)假如设置 -Xmx8g -Xms8g,则每个区域大小为 8g/2048=4M。

作用

  • 避免在整个Java堆全区域GC
    • 跟踪各个区的价值大小(回收空间大小,所需时间)得到优先队列
    • 每个区域都有Remembered Set 来实时记录 引用类型数据和其他区域数据的关系

在这里插入图片描述

  1. 初始阶段:标记处GC直接关联对象(需要停止线程,单线程执行)
  2. 并发阶段:GC roots开始对heap对象进行可达分析,和用户线程并行
  3. 最终标记:修正并行过程中变动的记录
  4. 筛选回收:对各个 Region 的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来指定回收计划 —— 最少的时间回收垃圾最多的区域,这里需要停止用户线程

复习

  1. JVM的五大内存区是?
  2. 判定是否需要回收某个对象的方法有哪些?优缺点是什么?
  3. 为什么市面上多采用可达性分析方法
  4. 可达性分析方法如何判断GC Root
  5. 四种引用的区别是什么
  6. 对象什么时候会被回收?主动回收和被动回收的区别?
  7. 回收策略有哪些?
  8. 标记清除算法和标记整理算法的区别?
  9. 分带回收机制和Copying机制主要区别在哪?
  10. 这些回收策略的优缺点是什么?
  11. 新生代,老年代如何划分?
  12. 新生代如何变成老年代?
  13. Minor, Major, Full GC的区别
  14. 为何Survivor区设置为两个?少一个会如何?
  15. 为啥主流的回收策略是分带回收机制?
  16. 常见的垃圾收集器有哪些?一般他们如何搭配使用?
Java 垃圾回收(GC)机制与算法详解 垃圾回收(Garbage Collection,GC)是 Java 自动内存管理的核心机制,负责。,避免内存泄漏和手动内存管理的复杂性。理解 GC 机制是 Java 性能优化的关键一步!整理阶段: 存活对象向一端移动。标记阶段: 标记所有可达对象。清除阶段: 回收未标记对象。存活对象复制到另一块。 阅读详情

相关推荐

Java GC垃圾回收机制

文章目录一、Java GC二、GC 回收的对象三、GC 回收过程1、图解分代内存1.1 年轻代1.2 年老代1.3 永久代2、图解 GC 回收过程对象分配策略3、Minor GC 和 Full GC 本文内容基于目前使用最广泛的 HotSpot JVM。 参考书籍:《深入理解Java虚拟机:JVM高级特性与最佳实践》–周志明 一、Java GC Java 垃圾回收机制是由 GC(Garbage...

媛测 696

详解Java GC、新生代、老年代

Java 中的堆是 JVM 所管理的最大的一块内存空间,堆主要用于存放各种类的实例对象和数组。,如下图所示: 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old)。新生代 ( Young ) 又被划分为三个区域:Eden、S0、S1。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。 Java 中的堆也是 GC 收集垃圾的主要区域。GC 分为两种:Minor GC、Full GC ( 或称为 Major GC )。 1.年轻..

Vermont_的博客 1万+

HyperLynx VX2.5 实战:5分钟搞定LPDDR4X内存的批量仿真与报告分析

本文详细介绍了如何使用HyperLynx VX2.5进行LPDDR4X内存的批量仿真与报告分析,通过智能网络分组和并行计算技术,5分钟内即可完成全流程验证。文章涵盖工程准备、批量仿真配置、报告解析及典型问题解决方案,帮助工程师高效提升PCB仿真效率,确保移动设备内存接口的稳定性与性能。

weixin_42683394的博客 400

深入理解JVM:垃圾回收机制

我们知道Java内存运行时数据区域划分为5个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生,随着线程而灭;栈中每一个栈帧中分配的内存在编译期就已经确定下来,因此这几个区域的内存分配与回收都具备确定性。 而Java堆和方法区,这部分的内存分配与回收是动态的,是垃圾收集器所需要回收的关注回收的区域。 在回收对象之前,首先要确定对象能否被回收。当一个对象不在被其它途径使用时,这个对象就可以被回收了。 一、垃圾标记算法 在堆里面存放着Java中几乎所有的对象实例,垃圾回收器在对堆进行回收前,首先需要

正义 332

Dify-前端本地运行-单点登录

本文介绍了如何在已部署Dify的系统中实现AI应用跳转及页面定制化改造。通过iframe跳转无法满足甲方需求后,作者对Dify前端源码进行了本地化二次开发,主要步骤包括:1) 按照官方文档搭建本地开发环境;2) 修改.env配置文件连接部署好的后端服务;3) 隐藏侧边栏和头部导航栏;4) 实现单点登录功能,通过URL参数获取用户邮箱自动登录。过程中解决了请求拦截导致的登录校验问题,最终达成仅保留对话框界面并同步用户信息的需求。该方案涉及Next.js框架和React技术的应用,为类似定制化需求提供了参

weixin_43163457的博客 3224

DTS 数据迁移

支持关系型数据库(MySQL, Oracle, SQL Server等)、NoSQL数据库、大数据系统等。DTS数据迁移是现代化数据架构调整和云迁移过程中的重要工具,能够大大降低数据迁移的复杂度和风险。DTS (Data Transmission Service) 是一种数据迁移和同步服务,:先迁移历史数据(全量),再实时同步新增变化(增量):不同数据库类型间迁移,如Oracle到MySQL。:将单库数据迁移到分库分表架构。:将业务数据迁移到分析型数据库。:将本地数据库迁移到云数据库。

qq_41081716的博客 749

Java GC新生代晋升老年代的情况

Java中对象一般在新生代中进行创建,但是在一定的机制中会触发晋升老年代的机制。相关机制包括: 1、分配担保机制 Eden区满时,进行Minor GC,当Eden和一个Survivor区中依然存活的对象无法放入到Survivor中,则通过分配担保机制提前转移到老年代中。 2、对象过大 若对象体积太大,新生代无法容纳这个对象,就会绕过新生代, 直接在老年代分配, 此...

weixin_38569499的博客 3461

Uniapp微信小程序:详解根据角色权限动态展示底部tabbar,支持不同身份显示不同底部导航+灵活权限组合完整源码,菜单切换不闪烁、秒加载不卡(提供动态原生Tabbar配置+自定义组件形式2种方案)

uni-app微信小程序实现根据用户不同角色显示不同的tabBar,uniapp微信小程序原生tabbar实现动态菜单导航,微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色,动态pages,uni-app微信小程序动态tabBar,根据不同用户展示不同的tabBar,uni-app微信小程序动态切换tabBar,根据不同用户角色展示不同的tabBar,微信小程序自定义底部tabbar动态修改,Uniapp小程序根据权限(角色)不同动态展示底部tabbar,解决tabbar闪烁卡顿问题,小

✅ 精选推荐文章 4283

JVM 新生代老年代与GC

Java堆可以分为新生代和老年代两个区,其中新生代又可以分为一个Eden区和两个Survivor区,两个Survivor区分别被命名为From和To以示区分,新生代和老年代的比例为1:2,它们共同组成堆的内存区,所以新生代占堆的1/3,老年代占2/3,但这个比例可以修改,下面分别来介绍一下新生代和老年代。 1、【新生代】 新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比...

Adolph的专栏 5375

【毕设全程指导】基于YOLOv8的包装商品检测与可视化系统(SKU110K实战)

本文介绍了一个基于YOLOv8的包装商品检测与可视化系统毕业设计方案。项目采用SKU110K数据集,通过CSV转TXT格式转换适配YOLO模型训练,包含详细的环境搭建、模型配置和训练流程。系统实现了包装商品的自动化检测,并开发了Tkinter可视化界面进行交互式检测展示。该方案结合产业应用需求与技术深度,既具备实用价值,又能充分展示学生的技术能力,适合作为计算机视觉相关专业的毕业设计选题。整个项目从数据准备到界面开发完整覆盖,帮助学生系统掌握目标检测项目的完整实现流程。

LXY_LOVE36的博客 145

实现端到端加密的WebRTC视频会议终端

需要注意的是,上述示例代码中没有涉及到具体的加密算法和密钥交换过程,而是通过WebRTC API自动处理了加密和密钥交换的细节。然后,我们通过信令服务器将本地SDP发送给对方,并接收对方的SDP。最后,我们将对方的SDP设置为远程描述,并将最终的连接建立起来。最后,我们将对方的SDP设置为远程描述,并建立最终的连接。在本文中,我们将探讨如何使用WebRTC构建一个加密的视频会议终端,并提供相应的源代码。在本文中,我们将探讨如何使用WebRTC构建一个加密的视频会议终端,并提供相应的源代码。

WaJulia的博客 433

java gc 策略_Java GC 机制与内存分配策略详解

Java GC 机制与内存分配策略详解收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现自动内存管理解决的是:给对象分配内存 以及 回收分配给对象的内存为什么我们要了解学习 GC 与内存分配呢?在 JVM 自动内存管理机制的帮助下,不再需要为每一个new操作写配对的delete/free代码。但出现内存泄漏和溢出的问题时,如果不了解虚拟机是怎样使用内存的,那么排查错误将是一项非常艰难的工作...

weixin_42490307的博客 252

小白也能懂!一步步教你用FPGA加速YOLO目标检测(入门篇)

安装到 PYNQ 开发板中。该库为 PYNQ 平台提供了对量化神经网络(如 YOLO)的硬件加速支持。确保你的电脑已连接到外网,如 WiFi 或热点(手机热点理论上也可用,未实测)。当你看到安装成功的提示后,打开 Jupyter Notebook,你会发现在。趁这个机会,泡了杯茶,刷了会儿手机,顺便感慨了一下开源社区的强大……页面中多出了一些新的项目文件夹 —— 这就是我们刚才安装的。参数,浅拷贝只克隆最近一次提交,减少数据量,避免超时问题。初始化,打开该文件,即可运行我们的Tiny YOLO。

FJN110的博客 1597

【JAVA核心】Java GC机制详解

垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制。 导读: 1、什么是GC 2、GC常用算法 3、垃圾收集器 4、finalize()方法详解 5、总结--根据GC原理来优化代码 正式阅读之前需要了解相关概念: Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和 2个 Survivor 区域。 ...

老莫的博客 9万+

已解决“TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败“,亲测有效!!!

已解决"TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败",亲测有效!!!

wbajsjhhhhh的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java中的GC机制

转载:https://blog.youkuaiyun.com/laomo_bible/article/details/83112622 https://blog.youkuaiyun.com/weixin_41835916/article/details/81530733 垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制。 导读 1、什么是...

8876

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java笔记简要总结-GC工作机制与回收算法及策略

承接上文Java笔记简要总结-JDK与JVM,补齐因时间问题未写完的GC相关内容,直接进入主题,GO!

fyydlz的博客 5534

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JVM GC 机制笔记

当触发 GC 时,先 Stop the world 将 GC Root 直接引用的对象都标记上,再继续运行用户线程,并行运行 GC 线程遍历出整个 GC Root 引用网络,遍历完后继续 STW,开启多线程纠正 GC Root 引用网络,因为在前一步遍历时可能会新增对象,所以需要纠正,纠正后继续开启用户线程,并行 GC 线程采用标记-整理算法回收垃圾,在并发清理时,需要判断区域是否满足最大 STW 停顿时间(优先回收垃圾占比高的区域),区域满足才进行清理,如果不满足则跳过。

weixin_51008312的博客 1186

Java GC机制:Minor GC与Full GC的触发条件

在Java中,GC(垃圾收集)自动管理内存,主要分为Minor GC和Full GC。本文将简洁明了地介绍这两种GC的触发条件。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 4797

java gc机制 优点_浅谈GC机制

一、什么是GC在Java中,对象所占用的内存在对象不再使用后会自动被回收。这些工作是由一个叫垃圾回收器 Garbage Collector 的进程完成的。GC的优缺点好处是开发者无需过问内存管理,可以专注于解决实际问题。虽然内存泄露仍有可能会发生,但发生的概率比较小。GC的智能算法可以在后台自动的进行内存管理,且这种管理在大多数时候是最佳的。坏处是当垃圾回收发生时,它会影响程序的性能,甚至会暂停程...

weixin_30820933的博客 948

深入理解Java-GC机制

Hello,大家好,我是Steafan,在经历了惊心动魄的阿里电面之后,我又回来了。今天我们来谈谈Java主流虚拟机-HotSpot的GC实现机制,本篇文章默认使用HotSpot虚拟机进行介绍,如果没有特殊说明,其都为HotSpot虚拟机中的特性。  Java与C++之间有一堵由内存动态分配和垃圾收集技术所围城的“高墙”,墙外面的人想进去,墙里面的人却想出来。说起垃圾收集,大部分人都把这项技术当做...

Steafan_ 8万+

java 避免gc_Java GC机制

Java GC机制是JVM中一个最重要的部分,了解GC机制也对了解JVM中内存分布,日志查看等原理有所了解存储划分垃圾回收算法1、引用计数(Reference Counting)2、标记清除(Mark-Sweep)3、复制(Copying)4、标记-整理(Mark-Compact)5、增量收集(Incremental Collecting)6、分代(Generational Collecting)...

weixin_33669766的博客 2743

Java之GC机制

1JVM基本结构 1)类加载器classLoader:在JVM启动时或者类运行时将需要的.class文件加载到内存中 2)内存区域(运行时数据区): 是在JVM运行的时候操作所分配的内存区 3)执行引擎:负责执行class文件中包含的字节码指令 4)本地方法接口:主要是调用C/C++实现的本地方法及返回结果 2JVM内存结构 1 ) 方法区:用于...

码莎拉蒂 3092

Java JVM中的GC机制详解

垃圾回收(Garbage Collection,简称GC)机制是JVM中最重要的部分之一。在Java程序运行的过程中,运行时数据区域(包括堆和栈等内存区域)一直都需要使用和回收内存空间。由于Java中的内存分配方式是动态的,所以在程序运行期间,其内存空间的占用量会不断变化。如果Java程序没有进行垃圾回收,那么程序运行过程中使用的内存空间将不断累加,最后内存会被完全占用,导致程序崩溃。因此,为了保证程序正常运行,避免内存被耗尽和泄漏问题,JVM中设计了垃圾回收机制,用来定期清理无用的对象,并回收内存空间。

兴趣是最好的老师,勤能补拙 3496

聊聊Java的GC机制

/ 今日科技快讯 /近日,MIUI在小米全球社区发布公告,表示MIUI将在全球市场销售的手机中预装谷歌拨号及谷歌消息应用程序(中国、印度、印度尼西亚等市场除外)。小米表示,小米9...

郭霖 404
上一篇: hadoop生态圈-- 个人笔记学习05 HDFS优化
下一篇: Hive 知识点八股文记录 ——(一)特性
JamSlade
博客等级 码龄6年 1万+粉丝 403原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值