两个周末整理的垃圾回收知识,我要吐血了

发表于 3年以前  | 总阅读数:385 次

1 唠唠叨叨

今天的肝货来了,作者已经肝吐血了,看书查资料整理了 8000 字的垃圾回收相关知识,虽然很长,可能会花费你 20 分钟左右的阅读时间,但是看完相信你一定会有很大的收货,诶,周末又没有了,心好痛。

「面试必问」的垃圾回收,我们直接进入正题,读完你会学到以下的所有知识,「包括但不限于」:

垃圾是怎么找到的? OopMap 有什么作用? 为什么需要 STW? 记忆集有什么作用? 常用的 7 种垃圾回收器都有哪些?? 三色标记算法? CMS 为什么会产生碎片化? G1 居然会引起 Full GC? ......

2 垃圾对象是怎么找到的?

2.1 引用计数算法

就是给对象添加一个计数器:

  • 每当有一个地方引用它的时候,计数器就加 1;
  • 每当有一个引用失效的时候,计数器就减 1。

「当计数器的值为 0 的时候,那么该对象就是垃圾了」

这种方案的原理很简单,而且判定的效率也非常高,但是却可能会有其他的额外情况需要考虑。

比如两个「对象循环引用」,a 对象引用了 b 对象,b 对象也引用了 a 对象,a、b 对象却没有再被其他对象所引用了,其实正常来说这两个对象已经是垃圾了,因为没有其他对象在使用了,但是计数器内的数值却不是 0,所以引用计数算法就无法回收它们。

这种算法是比较「直接的找到垃圾」,然后去回收,也被称为"直接垃圾收集"。

2.2 根可达算法

这也是「JVM 默认使用」的寻找垃圾算法。

它的原理就是定义了一系列的根,我们把它称为 「"GC Roots"」 ,从 「"GC Roots"」开始往下进行搜索,走过的路径我们把它称为 「"引用链"」 ,当一个对象到 「"GC Roots"」 之间没有任何引用链相连时,那么这个对象就可以被当做垃圾回收了。

如图,「根可达算法」就可以「避免」计数器算法不好解决的「循环引用问题,Object 6、Object 7、Object 8」彼此之前有引用关系,但是没有与 「"GC Roots"」 相连,那么就会被当做垃圾所回收。

在 Java中,有「固定的GC Roots 对象」和「不固定的临时GC Roots对象:」

「固定的GC Roots:」

  • 在「虚拟机栈(栈帧的本地变量表)中所引用的对象」,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等;
  • 在方法区中「类静态属性引用的对象」,譬如 Java 类的引用静态变量;
  • 在方法区中「常量引用的对象」,譬如字符串常量池中的引用;
  • 在方法区栈中 「JNI (譬如 Native 方法)引用的对象」;
  • Java 「虚拟机内部的引用」,如基本数据类型对应的 Class 对象,一些常驻的异常对象(空指针异常、OOM等),还有类加载器;
  • 所有「被 Synchronized 持有的对象」;
  • 反应 Java 虚拟机内部情况的 「JMXBean、JVMTI 中注册的回调本地代码缓存等」。

「临时GC Roots:」

「为什么会有临时的 GC Roots ?」

目前的垃圾回收大部分都是「分代收集和局部回收」,如果只针对某一部分区域进行局部回收,那么就必须要考虑的「当前区域的对象有可能正被其他区域的对象所引用」,这时候就要将这部分关联的对象也添加到 GC Roots 中去来确保根可达算法的准确性。

这种算法是利用了「逆向思维」,找到使用的对象,剩下的就是垃圾,也被称为"间接垃圾收集"。

3 四种引用类型

3.1 强引用

"Object o = new Object()" 就是一种强引用关系,这也是我们在代码中最常用的一种引用关系。

无论任何情况下,只要强引用关系还存在,垃圾回收器就不会回收掉被引用的对象。

3.2 软引用

当内存空间不足时,就会回收软引用对象。

String str = new String("abc");
// 软引用
SoftReference<String> softRef = new SoftReference<String>(str);

软引用用来描述那些有用但是没必要的对象。

3.3 弱引用

弱引用要比软引用更弱一点,它「只能够存活到下次垃圾回收之前」。

也就是说,垃圾回收器开始工作,会回收掉所有只被弱引用关联的对象。

//弱引用
WeakReference<String> weakRef = new WeakReference<String>(str);

在 ThreadLocal 中就使用了弱引用来防止内存泄漏。

3.4 虚引用

虚引用是最弱的一种引用关系,它的唯一作用是用来作为一种通知。

如零拷贝(Zero Copy),开辟了堆外内存,虚引用在这里使用,会将这部分信息存储到一个队列中,以便于后续对堆外内存的回收管理。

4 分代收集理论

大多数的垃圾回收器都遵循了分代收集的理论进行设计,它建立在两个分代假说之上:

  • 「弱分代假说」:绝大多数对象都是朝升夕灭的;
  • 「强分代假说」:熬过越多次数垃圾回收过程的对象就越难消亡。

这两种假说的设计原则都是相同的:

垃圾收集器「应该将 JVM 划分出不同的区域」,把那些较难回收的对象放在一起(一般指老年代),这个区域的垃圾回收频率就可以降低,减少垃圾回收的开销。剩下的区域(一般指新生代)可以用较高的频率去回收,并且只需要去关心那些存活的对象,也不用标记出需要回收的垃圾,这样就能够以较低的代价去完成垃圾回收。

  • 「跨代引用假说」:如果某个新生代的对象存在了跨代引用,但是老年代的对象是很难消亡的,那么随着时间的推移,这个新生代对象也会慢慢晋升为老年代对象,那么这种跨代引用也就被消除了。

由于跨代引用是很少的,所以我们不应该为了少量的跨代引用去扫描整个老年代的数据,只需要在新生代对象建立一个「记忆集」来记录引用信息。

记忆集:「将老年代分为若干个小块,每块区域中有 N 个对象」,在对象引用信息发生变动的时候来维护记忆集数据的准确性,这样每次发生了 「"Minor GC"」 的时候只需要将记忆集中的对象添加到 「"GC Roots"」 中就可以了。

5 三种垃圾收集算法

5.1 标记清除算法

这种算法的实现是很简单的,有两种方式:

  • 标记出垃圾,然后清理掉;
  • 标记出存货的对象,回收其他空间。

这种算法有两个缺点:

  • 随着对象越来越多,那么所需要消耗的时间就会越来越多;
  • 标记清除后会导致碎片化,如果有大对象分配很有可能分配不下而出发另一次的垃圾收集动作。

5.2 标记复制算法

这种算法解决了第一种算法碎片化的问题。

就是「开辟两块完全相同的区域」,对象只在其中一篇区域内分配,然后「标记」出那些「存活的对象,按顺序整体移到另外一个空间」,如下图,可以看到回收后的对象是排列有序的,这种操作只需要移动指针就可以完成,效率很高,「之后就回收移除前的空间」。

这种算法的缺点也是很明显的:浪费过多的内存,使现有的「可用空间变为」原先的「一半」。

5.3 标记整理算法

这种算法可以说是结合了前两种算法,既有标记删除,又有整理功能。

这种算法就是通过标记清除算法找到存活的对象,然后将所有「存活的对象,向空间的一端移动」,然后回收掉其他的内存。

但是这种算法却有一个缺点,就是在移动对象的时候必须要暂停用户的应用程序(「STW」)才能移动。

6 STW

Java 中「Stop-The-World 机制简称 STW」 ,是在执行垃圾收集算法时,Java 应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java 中一种全局暂停现象,全局停顿,所有 Java 代码停止,native 代码可以执行,但不能与 JVM 交互。

6.1 为什么需要STW

在 Java 应用程序中「引用关系」是不断发生「变化」的,那么就会有会有很多种情况来导致「垃圾标识」出错。

想想一下如果 Object a 目前是个垃圾,GC 把它标记为垃圾,但是在清除前又有其他对象指向了 Object a,那么此刻 Object a 又不是垃圾了,那么如果没有 STW 就要去无限维护这种关系来去采集正确的信息。

再举个例子,到了秋天,道路上洒满了金色的落叶,环卫工人在打扫街道,却永远也无法打扫干净,因为总会有不断的落叶。

7 垃圾回收器是怎样寻找 GC Roots 的?

我们在前面说明了根可达算法是通过 GC Roots 来找到存活的对象的,也定义了 GC Roots,那么垃圾回收器是怎样寻找 GC Roots 的呢?

首先,「为了保证结果的准确性,GC Roots 枚举时是要在 STW 的情况下进行的」,但是由于 Java 应用越来越大,所以也不能逐个检查每个对象是否为 GC Root,那将消耗大量的时间。

一个很自然的想法是,能不能用空间换时间,在某个时候把栈上代表引用的位置全部记录下来,这样到真正 GC 的时候就可以直接读取,而不用再一点一点的扫描了。事实上,大部分主流的虚拟机也正是这么做的,比如 HotSpot ,它使用一种叫做 「OopMap」 的数据结构来记录这类信息。

7.1 OopMap

我们知道,一个线程意味着一个栈,一个栈由多个栈帧组成,一个栈帧对应着一个方法,一个方法里面可能有多个安全点。GC 发生时,程序首先运行到最近的一个安全点停下来,然后更新自己的 OopMap ,记下栈上哪些位置代表着引用。枚举根节点时,递归遍历每个栈帧的 OopMap ,通过栈中记录的被引用对象的内存地址,即可找到这些对象( GC Roots )。

使用 OopMap 可以「避免全栈扫描」,加快枚举根节点的速度。但这并不是它的全部用意。它的另外一个更根本的作用是,可以帮助 HotSpot 实现准确式 GC (即使用准确式内存管理,虚拟机可用知道内存中某个位置的数据具体是什么类型) 。

7.2 安全点

从线程角度看,安全点可以理解成是在「代码执行过程中」的一些「特殊位置」,当线程执行到这些位置的时候,说明「虚拟机当前的状态是安全」的。

比如:「方法调用、循环跳转、异常跳转等这些地方才会产生安全点」。

如果有需要,可以在这个位置暂停,比如发生GC时,需要暂停所有活动线程,但是线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,等待GC结束。

那么如何让线程在垃圾回收的时候都跑到最近的安全点呢?这里有「两种方式」:

  • 抢先式中断
  • 主动式中断

抢先式中断:就是在 STW 的时候,先让所有线程「完全中断」。如果中断的地方不在安全点上,然后「再激活」,「直到运行到安全点的位置」再中断。

主动式中断:在安全点的位置打一个标志位,每个线程执行都去轮询这个标志位,如果为真,就在最近的安全点挂起。

但是如果有些线程处于 Sleep 状态怎么办呢?

7.3 安全区域

为了解决这种问题,又引入了安全区域的概念。

安全区域是指「在一段代码片中,引用关系不会发生改变」,实际上就是一个安全点的拓展。当线程执行到安全区域时,首先标识自己已进入安全区域,那样,当在这段时间里 JVM 要发起 GC 时,就不用管标识自己为“安全区域”状态的线程了,该线程只能乖乖的等待根节点枚举完或者整个GC过程完成之后才能继续执行。

8 聊聊垃圾回收器

前面和大家聊了很多垃圾收集算法,所以在真正实践的时候会有多种选择,垃圾回收器就是真正的实践者,接下来就和大家聊聊10种垃圾回收器。

8.1 Serial

Serial 是一个「单线程」的垃圾回收器,「采用复制算法负责新生代」的垃圾回收工作,可以与 CMS 垃圾回收器一起搭配工作。

在STW的时候「只会有一条线程」去进行垃圾收集的工作,所以可想而知,它的效率会比较慢。

但是他确是所有垃圾回收器里面消耗额外内存最小的,没错,就是因为简单。

8.2 ParNew

ParNew 是一个「多线程」的垃圾回收器,「采用复制算法负责新生代」的垃圾回收工作,可以与CMS垃圾回收器一起搭配工作。

它其实就是 Serial 的多线程版本,主要区别就是在 STW 的时候可以用多个线程去清理垃圾。

8.3 Pararllel Scavenge

Pararllel Scavenge 是一个「多线程」的垃圾回收器,「采用复制算法负责新生代」的垃圾回收工作,可以与 Serial Old , Parallel Old 垃圾回收器一起搭配工作。

是与ParNew类似,都是用于年轻代回收的使用复制算法的并行收集器,与ParNew不同的是,Parallel Scavenge的「目标是达到一个可控的吞吐量」。

吞吐量 = 程序运行时间 /(程序运行时间+GC时间)

如程序运行了99s,GC 耗时1s,吞吐量=99/(99+1)=99%。Parallel Scavenge 提供了两个参数用以精确控制吞吐量,分别是用以控制最大 GC 停顿时间的 -XX:MaxGCPauseMillis及直接控制吞吐量的参数 -XX:GCTimeRatio。

「停顿时间越短就越适合需要与用户交互的程序」,良好的响应速度能提升用户体验,而高吞吐量则可以高效的利用 CPU 时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

8.4 Serial Old

Serial Old 是一个「单线程」的垃圾回收器,「采用标记整理算法负责老年代」的垃圾回收工作,有可能还会配合 「CMS」 一起工作。

其实它就是 Serial 的老年代版本,整体链路和 Serial 大相径庭。

8.5 Parallel Old

Parallel Old 是一个「多线程」的垃圾回收器,「采用标记整理算法负责新生代」的垃圾回收工作,可以与 Parallel Scavenge 垃圾回收器一起搭配工作。

Parallel Old 是 Pararllel Scavenge 的老年代版本,它的设计思路也是以吞吐量优先的,ps+po 也是很常用的一种组合。

8.6 CMS

CMS 可以说是一款具有"跨时代"意义的垃圾回收器,支持了和用户线程一起工作,做到了「一起并发回收垃圾」的"壮举"。

  • 初始标记

  • 初始标记只是标记出来「和 GC Roots 直接关联」的对象,整个速度是非常快的,为了保证标记的准确,这部分会在 「STW」 的状态下运行;

  • 并发标记

  • 并发标记这个阶段会直接根据第一步关联的对象找到「所有的引用」关系,这一部分时刻用户线程「并发运行」的,虽然耗时较长,但是不会有很大的影响。

  • 重新标记

  • 重新标记是为了解决第二步并发标记所导致的标错情况,这里简单举个例子:并发标记时 a 没有被任何对象引用,此时垃圾回收器将该对象标位垃圾,在之后的标记过程中,a 又被其他对象引用了,这时候如果不进行重新标记就会发生「误清除」;

  • 这部分内容也是在 「STW」 的情况下去标记的。

  • 并发清除

  • 这一步就是最后的清除阶段了,将之前「真正确认为垃圾的对象回收」,这部分会和用户线程一起并发执行。

CMS的「三个缺点」:

  • 影响用户线程的执行效率

  • CMS 默认启动的回收线程数是(处理器核心数 + 3)/ 4 ,由于是和用户线程一起并发清理,那么势必会影响到用户线程的执行速度,并且这个影响「随着核心线程数的递减而增加」。所以 JVM 提供了一种 "「增量式并发收集器」"的 CMS 变种,主要是用来减少垃圾回收线程独占资源的时间,所以会感觉到回收时间变长,这样的话「单位时间内处理垃圾的效率就会降低」,也是一种缓和的方案。

  • 会产生"浮动垃圾"

  • 之前说到 CMS 真正清理垃圾是和用户线程一起进行的,在「清理」这部分垃圾的时候「用户线程会产生新的垃圾」,这部分垃圾就叫做浮动垃圾,并且只能等着下一次的垃圾回收再清除。

  • 会产生碎片化的空间

  • CMS 是使用了标记删除的算法去清理垃圾的,而这种算法的缺点就是会产生「碎片化」,后续可能会「导致大对象无法分配」从而触发「和 Serial Old 一起配合使用」来处理碎片化的问题,当然这也处于 「STW」 的情况下,所以当 java 应用非常庞大时,如果采用了 CMS 垃圾回收器,产生了碎片化,那么在 STW 来处理碎片化的时间会非常之久。

8.7 G1

G1(Garbage First):顾名思义,「垃圾回收第一」,官方对它的评价是在垃圾回收器技术上具有「里程碑式」的成果。

G1 回收的目标不再是整个新生代,不再是整个老年代,也不再是整个堆了。G1 可以「面向堆内存的任何空间来进行」回收,衡量的标准也不再是根据年代来区分,而是哪块「空间的垃圾最多就回收哪」块儿空间,这也符合 G1 垃圾回收器的名字,垃圾第一,这就是 G1 的「Mixed GC」 模式。

当然我的意思是「垃圾回收不根据年代来区分」,但是 G1 还是「根据年代来设计」的,我们先来看下 G1 对于堆空间的划分:

G1 垃圾回收器把堆划分成一个个「大小相同的 Region」,每个 Region 都会扮演一个角色,H、S、E、O。

E 代表伊甸区,S 代表 Survivor 区,H 代表的是 Humongous(G1 用来分配「大对象的区域」,对于 Humongous 也分配不下的超大对象,会分配在连续的 N 个 Humongous 中),剩余的深蓝色代表的是 Old 区,灰色的代表的是空闲的 region。

在 HotSpot 的实现中,整个堆被划分成 2048 左右个 Region。每个 Region 的大小在 1-32MB 之间,具体多大取决于堆的大小。

在并发标记垃圾时也会产生新的对象,G1 对于这部分对象的处理是这样的:

将 Region 「新增一块并发回收过程中分配对象的空间」,并为此设计了两个 TAMS(Top at Mark Start)指针,这块区域专门用来在并发时分配新对象,有对象新增只需要将 TAMS 指针移动下就可以了,并且这些「新对象默认是标记为存活」,这样就「不会干扰到标记过程」。

但是这种方法也会有个问题,有可能「垃圾回收的速度小于新对象分配的速度」,这样会导致 "Full GC" 而产生长时间的 STW。

在 G1 的设计理念里,「最小回收单元是 Region」 ,每次回收的空间大小都是Region的 N 倍,那么 G1 是「怎么选择要回收哪块儿区域」的呢?

G1 会跟踪各个 Region 区域内的垃圾价值,和回收空间大小回收时间有关,然后「维护一个优先级列表」,来收集那些价值最高的 Reigon 区域。

执行的步骤:

  • 初始标记:

  • 标记出来 GC Roots 能「直接关联」到的对象;

  • 修改 TAMS 的值以便于并发回收时新对象分配;

  • 是在 Minor GC 时期(「STW」)完成的。

  • 并发标记:

  • 根据刚刚关联的对像扫描整个对象引用图,和用户线程「并发执行」;

  • 记录 SATB(原始快照) 在并发时有引用的值。

  • 最终标记:

  • 处于 「STW」,处理第二步遗留下来的少量 SATB(原始快照) 记录。

  • 筛选回收:

  • 维护之前提到的优先级列表;

  • 根据「优先级列表」,「用户设置的最大暂停时间」来回收 Region;

  • 将需要回收的 Region 内存活的对象「复制」到不需要回收的 Region区域内,然后回收需要回收的 Region;

  • 这部分是处于 「STW」 下执行,并且是多线程的。

三色标记

这里我们又提到了一个概念叫做 「SATB 原始快照」,关于SATB会延伸出有一个概念,「三色标记算法」,也就是垃圾回收器标记垃圾的时候使用的算法,这里我们简单说下:

将对象分为「三种颜色」:

  • 白色:没被 GC 访问过的对象(被 GC 标记完后还是白色代表是垃圾);
  • 黑色:存活的对象;
  • 灰色:被 GC 访问过的对象,但是对象引用链上至少还有一个引用没被扫描过。

我们知道在「并发标记」的时候「可能会」出现「误标」的情况,这里举两个例子:

  • 刚开始标记为「存活」的对象,但是在并发标记过程中「变为了垃圾对象」;
  • 刚开始标记为「垃圾」的对象,但是在并发标记过程中「变为了存活对象」。

第一种情况影响还不算很大,只是相当于垃圾没有清理干净,待下一次清理的时候再清理一下就好了。

第二种情况就危险了,正在使「用的对象的突然被清理掉」了,后果会很严重。

那么「产生上述第二种情况的原因」是什么呢?

  • 新增」一条或多条「黑色到白色」对象的新引用;
  • 删除「了」灰色「对象」到该白色对象「的直接」引用或间接引用。

当这两种情况「都满足」的时候就会出现这种问题了。

所以为了解决这个问题,引入了「增量更新」(Incremental Update)和「原始快照」(SATB)的方案:

增量更新破坏了第一个条件:「增加新引用时记录」该引用信息,在后续 STW 扫描中重新扫描(CMS 的使用方案)。

原始快照破坏了第二个条件:「删除引用时记录下来」,在后续 STW 扫描时将这些记录过的灰色对象为根再扫描一次(G1 的使用方案)。

9 结尾的唠叨

今天聊的这些东西应该能够帮你把堆垃圾回收的整体链路打通,其实关于垃圾回收器,我们这里只介绍了最常用的7中,是因为剩下的 Shenandoah、ZGC、Epsilon这些垃圾回收器,每个拿出来讲解都是可以单独成一篇文章的(其实是我也没有太深入了解哈哈,还不能够写成文章)。

本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/2e6olWH6BolENIDhVEsEkA

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237231次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8065次阅读
 目录