最新要闻
- 世界快资讯:大爷大妈景区爬松树站树顶拍照 景区称出事不负责!网友被吓到
- 2月87款国产游戏获批版号:腾讯、网易新游来了
- 再不用装一堆软件了!Windows 11可原生控制RGB信仰灯
- 天天热头条丨西安最倒霉面馆顾客暴涨员工数翻4倍 很多人慕名而来:感谢大家照顾
- 通讯!男子躲查酒驾3次跳河 血检结果却为0!结果令人舒适
- 流畅度飙升!小米:MIUI 14第一批正式版机型已全量推送
- 开了比亚迪之后 男子直呼不会开油车了:跟老人机一样
- 【当前独家】配1200W永磁同步电机!宗申TL3两轮版上市:可载重300公斤
- 世界快消息!别以为老师看不出来ChatGPT生成的论文!网友:你什么水平老师心里有数
- 【世界聚看点】火狐浏览器国内最受欢迎的扩展出炉:ABP等神级工具没入围
- 真相令人大跌眼镜!研究称莫奈印象派画风实则是雾霾
- 焦点要闻:土耳其地震“震出”隐秘地层:覆盖地球的44%、颠覆板块运动
- 今日最新!女子应聘财务被要求给五六人煮饭 负责人:吃饭不方便 可以不煮
- 多色多款 杰克琼斯卫衣89元包邮:低至1.3折清仓
- 最新消息:realme 10 Pro可口可乐版发布:骁龙695 背壳logo爱了
- 【世界热闻】微信、微博全部断更!老干妈回应“退网”:经营一切正常
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球百事通!【垃圾回收】v8引擎垃圾回收策略
在一些数据不被需要的时候,它就是垃圾数据,垃圾数据占用的内存就应该被回收,以释放有限的内存空间
(资料图片)
不同语言的垃圾回收策略
通常情况下,垃圾数据回收分为手动回收和自动回收两种策略。
如 C/C++ 就是使用手动回收策略,何时分配内存、何时销毁内存都是由代码控制的,你可以参考下面这段 C 代码:
// 在堆中分配内存char* p = (char*)malloc(2048); // 在堆空间中分配 2048 字节的空间,并将分配后的引用地址保存到 p 中 // 使用 p 指向的内存 { //.... } // 使用结束后,销毁这段内存free(p);p = NULL;
从上面这段 C 代码可以看出来,要使用堆中的一块空间,我们需要先调用 mallco 函数分配内存,然后再使用;当不再需要这块数据的时候,就要手动调用 free 函数来释放内存。如果这段数据已经不再需要了,但是又没有主动调用 free 函数来销毁,那么这种情况就被称为内存泄漏。
另外一种使用的是自动垃圾回收的策略,如 JavaScript、Java、Python 等语言,产生的垃圾数据是由垃圾回收器来释放的,并不需要手动通过代码来释放。
对于 JavaScript 而言,也正是这个“自动”释放资源的特性带来了很多困惑,也让一些 JavaScript 开发者误以为可以不关心内存管理,这是一个很大的误解。
调用栈中的数据是如何回收的
首先是调用栈中的数据,我们还是通过一段示例代码的执行流程来分析其回收机制,具体如下:
function foo(){ var a = 1 var b = {name:" 极客邦 "} function showName(){ var c = " 极客时间 " var d = {name:" 极客时间 "} } showName()}foo()
当执行到第 6 行代码时,其调用栈和堆空间状态图如下所示:
从图中可以看出,原始类型的数据被分配到栈中,引用类型的数据会被分配到堆中。当 foo 函数执行结束之后,foo 函数的执行上下文会从堆中被销毁掉
如果执行到 showName 函数时,那么 JavaScript 引擎会创建 showName 函数的执行上下文,并将 showName 函数的执行上下文压入到调用栈中,最终执行到 showName 函数时,其调用栈就如上图所示。与此同时,还有一个记录当前执行状态的指针(称为 ESP),指向调用栈中 showName 函数的执行上下文,表示当前正在执行 showName 函数。
接着,当 showName 函数执行完成之后,函数执行流程就进入了 foo 函数,那这时就需要销毁 showName 函数的执行上下文了。ESP 这时候就帮上忙了,JavaScript 会将 ESP 下移到 foo 函数的执行上下文,这个下移操作就是销毁 showName 函数执行上下文的过程。
ESP 指针向下移动怎么就能把 showName 的执行上下文销毁了呢?具体你可以看下面这张移动 ESP 前后的对比图
从图中可以看出,当 showName 函数执行结束之后,ESP 向下移动到 foo 函数的执行上下文中,上面 showName 的执行上下文虽然保存在栈内存中,但是已经是无效内存了。比如当 foo 函数再次调用另外一个函数时,这块内容会被直接覆盖掉,用来存放另外一个函数的执行上下文。
所以说,当一个函数执行结束之后,JavaScript 引擎会通过向下移动 ESP 来销毁该函数保存在栈中的执行上下文。
堆中的数据是如何回收的
通过上面的讲解,我想现在你应该已经知道,当上面那段代码的 foo 函数执行结束之后,ESP 应该是指向全局执行上下文的,那这样的话,showName 函数和 foo 函数的执行上下文就处于无效状态了,不过保存在堆中的两个对象依然占用着空间,如下图所示
从图中可以看出,1003 和 1050 这两块内存依然被占用。要回收堆中的垃圾数据,就需要用到 JavaScript 中的垃圾回收器了。
所以,接下来我们就来通过 Chrome 的 JavaScript 引擎 V8 来分析下堆中的垃圾数据是如何回收的。
代际假说和分代收集
不过在正式介绍 V8 是如何实现回收之前,你需要先学习下代际假说(The Generational Hypothesis)的内容,这是垃圾回收领域中一个重要的术语,后续垃圾回收的策略都是建立在该假说的基础之上的,所以很是重要。
代际假说有以下两个特点:
- 第一个是大部分对象在内存中存在的时间很短,简单来说,就是很多对象一经分配内存,很快就变得不可访问;
- 第二个是不死的对象,会活得更久。
其实这两个特点不仅仅适用于 JavaScript,同样适用于大多数的动态语言,如 Java、Python 等。
在 V8 中会把堆分为新生代和老生代两个区域,新生代中存放的是生存时间短的对象,老生代中存放的生存时间久的对象。
新生区通常只支持 1~8M 的容量,而老生区支持的容量就大很多了。对于这两块区域,V8 分别使用两个不同的垃圾回收器,以便更高效地实施垃圾回收。
- 副垃圾回收器,主要负责新生代的垃圾回收。
- 主垃圾回收器,主要负责老生代的垃圾回收。
浏览器将数据分为两种,一种是「临时」对象,一种是「长久」对象。
- 临时对象:
- 大部分对象在内存中存活的时间很短。
- 比如函数内部声明的变量,或者块级作用域中的变量。当函数或者代码块执行结束时,作用域中定义的变量就会被销毁。
- 这类对象很快就变得不可访问,应该快点回收。
- 长久对象:
- 生命周期很长的对象,比如全局的
window、DOM、Web API
等等。 - 这类对象可以慢点回收。
- 生命周期很长的对象,比如全局的
这两种对象对应不同的回收策略,所以,V8 把堆分为新生代和老生代两个区域, 新生代中存放临时对象,老生代中存放持久对象,多回收新生代,少回收老生代。
垃圾回收器的工作流程
V8 把堆分成两个区域——新生代和老生代,并分别使用两个不同的垃圾回收器。它们都有一套共同的执行流程。
第一步是标记空间中活动对象和非活动对象。所谓活动对象就是还在使用的对象,非活动对象就是可以进行垃圾回收的对象。
第二步是回收非活动对象所占据的内存。其实就是在所有的标记完成之后,统一清理内存中所有被标记为可回收的对象。
第三步是做内存整理。一般来说,频繁回收对象后,内存中就会存在大量不连续空间,我们把这些不连续的内存空间称为内存碎片。当内存中出现了大量的内存碎片之后,如果需要分配较大连续内存的时候,就有可能出现内存不足的情况。所以最后一步需要整理这些内存碎片,但这步其实是可选的,因为有的垃圾回收器不会产生内存碎片,比如接下来的副垃圾回收器。
那么接下来,我们就按照这个流程来分析新生代垃圾回收器(副垃圾回收器)和老生代垃圾回收器(主垃圾回收器)是如何处理垃圾回收的。
副垃圾回收器
副垃圾回收器主要负责新生区的垃圾回收。而通常情况下,大多数小的对象都会被分配到新生区,所以说这个区域虽然不大,但是垃圾回收还是比较频繁的。
新生代中用Scavenge 算法来处理。 Scavenge 算法,是把新生代空间对半划分为两个区域,一半是对象区域,一半是空闲区域,如下图所示
新加入的对象都会存放到对象区域,当对象区域快被写满时,就需要执行一次垃圾清理操作。
在垃圾回收过程中,首先要对对象区域中的垃圾做标记;标记完成之后,就进入垃圾清理阶段,副垃圾回收器会把这些存活的对象复制到空闲区域中,同时它还会把这些对象有序地排列起来,所以这个复制过程,也就相当于完成了内存整理操作,复制后空闲区域就没有内存碎片了。
完成复制后,对象区域与空闲区域进行角色翻转,也就是原来的对象区域变成空闲区域,原来的空闲区域变成了对象区域。这样就完成了垃圾对象的回收操作,同时这种角色翻转的操作还能让新生代中的这两块区域无限重复使用下去。
由于新生代中采用的 Scavenge 算法,所以每次执行清理操作时,都需要将存活的对象从对象区域复制到空闲区域。但复制操作需要时间成本,如果新生区空间设置得太大了,那么每次清理的时间就会过久,所以为了执行效率,一般新生区的空间会被设置得比较小。
也正是因为新生区的空间不大,所以很容易被存活的对象装满整个区域。为了解决这个问题,JavaScript 引擎采用了对象晋升策略,也就是经过两次垃圾回收依然还存活的对象,会被移动到老生区中。
主垃圾回收器
主垃圾回收器主要负责老生区中的垃圾回收。除了新生区中晋升的对象,一些大的对象会直接被分配到老生区。因此老生区中的对象有两个特点,一个是对象占用空间大,另一个是对象存活时间长。
由于老生区的对象比较大,若要在老生区中使用 Scavenge 算法进行垃圾回收,复制这些大的对象将会花费比较多的时间,从而导致回收执行效率不高,同时还会浪费一半的空间。因而,主垃圾回收器是采用标记 - 清除(Mark-Sweep)的算法进行垃圾回收的。
标记过程阶段
首先是标记过程阶段。标记阶段就是从一组根元素开始,递归遍历这组根元素,在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据。
比如最开始的那段代码,当 showName 函数执行退出之后,这段代码的调用栈和堆空间如下图所示:
从上图你可以大致看到垃圾数据的标记过程,当 showName 函数执行结束之后,ESP 向下移动,指向了 foo 函数的执行上下文,这时候如果遍历调用栈,是不会找到引用 1003 地址的变量,也就意味着 1003 这块数据为垃圾数据,被标记为红色。由于 1050 这块数据被变量 b 引用了,所以这块数据会被标记为活动对象。这就是大致的标记过程。
垃圾的清除过程
它和副垃圾回收器的垃圾清除过程完全不同,你可以理解这个过程是清除掉红色标记数据的过程,可参考下图大致理解下其清除过程:
上面的标记过程和清除过程就是标记 - 清除算法,不过对一块内存多次执行标记 - 清除算法后,会产生大量不连续的内存碎片。而碎片过多会导致大对象无法分配到足够的连续内存,于是又产生了另外一种算法——标记 - 整理(Mark-Compact),这个标记过程仍然与标记 - 清除算法里的是一样的,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。你可以参考下图
全停顿
由于 JavaScript 是运行在主线程之上的,一旦执行垃圾回收算法,都需要将正在执行的 JavaScript 脚本暂停下来,待垃圾回收完毕后再恢复脚本执行。我们把这种行为叫做全停顿(Stop-The-World)。
比如堆中的数据有 1.5GB,V8 实现一次完整的垃圾回收需要 1 秒以上的时间,这也是由于垃圾回收而引起 JavaScript 线程暂停执行的时间,若是这样的时间花销,那么应用的性能和响应能力都会直线下降。主垃圾回收器执行一次完整的垃圾回收流程如下图所示:
在 V8 新生代的垃圾回收中,因其空间较小,且存活对象较少,所以全停顿的影响不大,但老生代就不一样了。如果在执行垃圾回收的过程中,占用主线程时间过久,就像上面图片展示的那样,花费了 200 毫秒,在这 200 毫秒内,主线程是不能做其他事情的。比如页面正在执行一个 JavaScript 动画,因为垃圾回收器在工作,就会导致这个动画在这 200 毫秒内无法执行的,这将会造成页面的卡顿现象。
为了降低老生代的垃圾回收而造成的卡顿,V8 将标记过程分为一个个的子标记过程,同时让垃圾回收标记和 JavaScript 应用逻辑交替进行,直到标记阶段完成,我们把这个算法称为增量标记(Incremental Marking)算法。如下图所示:
使用增量标记算法,可以把一个完整的垃圾回收任务拆分为很多小的任务,这些小的任务执行时间比较短,可以穿插在其他的 JavaScript 任务中间执行,这样当执行上述动画效果时,就不会让用户因为垃圾回收任务而感受到页面的卡顿了。
总结
为了减少对主线程执行js的影响,
分代收集
V8 把堆分为新生代和老生代两个区域, 新生代中存放临时对象,老生代中存放持久对象。并且让副垃圾回收器、主垃圾回收器,分别负责新生代、老生代的垃圾回收。多回收新生代,少回收老生代。
增量收集
如果脚本中有许多对象,引擎一次性遍历整个对象,会造成一个长时间暂停。
所以引擎将垃圾收集工作分成更小的块,每次处理一部分,多次处理。
这样就解决了长时间停顿的问题。
闲时收集
垃圾收集器只会在 CPU 空闲时尝试运行,以减少可能对代码执行的影响。
扩展:内存泄漏与优化
平常用 JavaScript 开发代码,内存的泄漏和优化是应该经常留意的。内存泄漏是指 JavaScript 中,已经分配堆内存地址的对象由于长时间未释放或者无法释放,造成了长期占用内存,使内存浪费,最终会导致运行的应用响应速度变慢以及最终崩溃的情况。这种就是内存泄漏,你应该在日常开发和使用浏览器过程中也遇到过,那么我们来回顾一下内存泄漏的场景:
过多的缓存未释放;
闭包太多未释放;
定时器或者回调太多未释放;
太多无效的 DOM 未释放;
全局变量太多未被发现。
我大概总结了这几种场景,这些现象会在开发或者使用中造成内存泄漏,以至于你的浏览器卡顿、不响应、页面打不开等问题产生。那么这些问题该怎么优化呢?我们来看下这些场景都需要注意点什么。
1. 减少不必要的全局变量,使用严格模式避免意外创建全局变量。例如:
function foo() { // 全局变量=> window.bar this.bar = "默认this指向全局"; // 没有声明变量,实际上是全局变量=>window.bar bar = "全局变量"; }foo();
这段代码中,函数内部绑定了太多的 this 变量,虽然第一眼看不出问题,但仔细一分析,其实 this 下的属性默认都是绑定到 window 上的属性,均为全局变量,这一点是非常有必要注意的。
2. 在你使用完数据后,及时解除引用(闭包中的变量,DOM 引用,定时器清除)。例如:
var someResource = getData();setInterval(function() { var node = document.getElementById("Node"); if(node) { node.innerHTML = JSON.stringify(someResource)); // 定时器也没有清除,可以清除掉 } // node、someResource 存储了大量数据,无法回收}, 1000);
比如上面代码中就缺少清除 setInterval 的代码,类似这样的代码增多会造成内存的占用过多,这是同样也需要注意的一点。
3. 组织好你的代码逻辑,避免死循环等造成浏览器卡顿、崩溃的问题。例如,对于一些比较占用内存的对象提供手工释放内存的方法,请看下面代码:
var leakArray = [];exports.clear = function () { leakArray = [];}
比如这段代码提供了清空该数组内容的方法,使用完成之后可以根据合适业务时机进行操作释放。这样就能较好地避免对象数据量太大造成的内存溢出的问题。
-
环球热文:kx00016-顺序表--用C语言实现:多种方法合并2个非递减顺序表
一、顺序表结构定义 defineINIT_SIZE10 顺序表初始容量typedefvoid(myOpFunType)(void*); 定义操作函数类型typedefint
来源: 环球百事通!【垃圾回收】v8引擎垃圾回收策略
世界快资讯:大爷大妈景区爬松树站树顶拍照 景区称出事不负责!网友被吓到
小白也能做应用(三)之fusion app远程更新及免登录
环球热文:kx00016-顺序表--用C语言实现:多种方法合并2个非递减顺序表
2月87款国产游戏获批版号:腾讯、网易新游来了
python之路68 drf从入门到成神 9 drf_jwt源码执行流程、自定义用户表签发和认证、simpleui的使用、权限控制(acl、rbac)
每日关注!导出域用户hash姿势总结
世界滚动:readelf命令读取elf文件的详细信息
再不用装一堆软件了!Windows 11可原生控制RGB信仰灯
天天热头条丨西安最倒霉面馆顾客暴涨员工数翻4倍 很多人慕名而来:感谢大家照顾
每日热门:56.函数模板
热门看点:学习打卡01- java入门
通讯!男子躲查酒驾3次跳河 血检结果却为0!结果令人舒适
流畅度飙升!小米:MIUI 14第一批正式版机型已全量推送
开了比亚迪之后 男子直呼不会开油车了:跟老人机一样
【当前独家】配1200W永磁同步电机!宗申TL3两轮版上市:可载重300公斤
世界快消息!别以为老师看不出来ChatGPT生成的论文!网友:你什么水平老师心里有数
世界热头条丨基于声网互动白板实现一个多人数独游戏
当前最新:学习笔记——尚好房项目(配置ssm环境、测试ssm环境)
《Towards Cooperation in Sequential Prisoner’s Dilemmas: a Deep Multiagent Reinfo
世界滚动:R机器学习:重复抽样在机器学习模型建立过程中的地位理解
【世界聚看点】火狐浏览器国内最受欢迎的扩展出炉:ABP等神级工具没入围
真相令人大跌眼镜!研究称莫奈印象派画风实则是雾霾
焦点要闻:土耳其地震“震出”隐秘地层:覆盖地球的44%、颠覆板块运动
今日最新!女子应聘财务被要求给五六人煮饭 负责人:吃饭不方便 可以不煮
多色多款 杰克琼斯卫衣89元包邮:低至1.3折清仓
项目终于用上了低代码,才知道为什么真香了!
机器学习-PCA
天天热消息:kx00015-顺序表--用C语言实现:删除顺序表中元素值等于x的所有元素
精彩看点:批处理脚本教程_编程入门自学教程_菜鸟教程-免费教程分享
vuex相关笔记
最新消息:realme 10 Pro可口可乐版发布:骁龙695 背壳logo爱了
【世界热闻】微信、微博全部断更!老干妈回应“退网”:经营一切正常
当前讯息:1TB版本太香了 真我GT Neo5供不应求 徐起:会加紧拧螺丝
焦点滚动:零添加:太太乐900ml*2瓶酱油最低26.4元
美少女手游《妮姬:胜利女神》即将推出PC版 推荐配置1650S
【全球聚看点】C#教程_编程入门自学教程_菜鸟教程-免费教程分享
环球时讯:【网关开发】8.Openresty 网关自定义健康检查的设计与实现
每日焦点!【0基础学爬虫】爬虫基础之爬虫的基本介绍
记录--千万别让 console.log 上生产!用 Performance 和 Memory 告诉你为什么
省选集训2023年2月9日T2
全球热讯:非油炸!吃欢天荞麦面皮10袋到手19.9元:麻酱、酸辣随便挑
世界今热点:ChatGPT版必应被华人小哥攻破:一句话“催眠”问出所有Prompt
世界热门:钙钛矿-硅光伏电池效率突破30%!可稳定工作30年
世界即时:公交车刹车提醒是2B请注意 当地回应:考虑不周将“改名”
环球热议:苹果忍不住反驳乔布斯女儿吐槽:iPhone 14比iPhone 13 Pro还要好
Entity Framework 教程_编程入门自学教程_菜鸟教程-免费教程分享
全球热文:【Spring】Bean注册注解
【当前独家】算法学习笔记(17): 快速傅里叶变换(FFT)
世界要闻:化繁为简|AIRIOT智慧水务信息化建设解决方案
环球资讯:让地球“流浪”前 先来研究下这一个更现实的威胁
女子疑吃自热火锅去世:不排除急性中毒、家属索赔176万元
当前消息!最香的i9+RTX 4080游戏本!ROG枪神7超竞版仅需18999元起
全球热讯:泰国1月份纯电动车上牌量排行:比亚迪称王、国产车霸榜
GTX 1060落魄了?《原子之心》1080P高画质需GTX 1080
环球关注:一步一腳印的 iOS App 上架和更新流程
当前快看:学习笔记——尚好房项目(项目介绍、环境搭建、配置依赖关系)
[数据结构] 二叉树的层次遍历
全球实时:JVM sandbox 实现热修复示例
《流浪地球2》全球爆火背后!《三体》导演:中国科幻的内核是文化自信
神十五航天员首次出舱视频公布:和地球同框 绝美
每日速看!方向盘助力失灵、AEB抽风!车主:百年凯迪拉克毁于LYRIQ 绝望
速递!Android 14来了:提升续航和流畅度
《狂飙》片头被指抄袭 网友放对比照跟国外一电影太相似:背后公司被扒
环球资讯:剖析字节案例,火山引擎 A/B 测试 DataTester 如何“嵌入”技术研发流程
Docker安装使用Kafka
每日动态!机器学习-KNN
全球热点评!网民称《水浒》应从中小学课文中清除 毒害更多人:浙江官方回应了
24岁生日当天崩了!腾讯QQ回应:服务器挤爆了 现已恢复
【全球报资讯】酒剑仙拿狙蚌埠住了 《仙剑奇侠传》五位角色入驻《和平精英》
如何注册 ChatGPT ,OpenAI
每日头条!A/B测试教程_编程入门自学教程_菜鸟教程-免费教程分享
环球即时看!24亿巨制大片 《速度与激情10》开启预售 片长130分钟
天天热点!魅族20 Pro外观偷跑:矩阵三摄 纯白机身太吸睛
世界今日报丨年轻人别以赚钱为目标!张朝阳称别把考试太当回事:不一定非上好大学
天天即时:中国在土耳其建造电站强震中未受损:稳定保障救援电力供应
实时焦点:微软公布ChatGPT版Bing不到48小时:申请用户量已超百万
天天热推荐:01-数据结构与算法-目录索引
环球快消息!keycloak~再说session和token
学习笔记——redis集群(定义、集群连接、查看集群、节点分配方式、插槽、集群中录入值、查询集群中的值、故障恢复)
滴滴一面:order by 调优10倍,思路是啥?
投诉不断 极氪被爆出现大规模动力故障 官方回应:会升级
焦点讯息:昆虫学硕士因表演双节棍获得工作 2000万粉大V感慨:掌握一门手艺很重要
当前报道:手机QQ崩了:显示无网络 你消息接收正常吗?
【环球新要闻】Moment推出1.55X变形镜头:iPhone也能拍出电影级超宽照片
十八罗汉分别叫什么?十八罗汉排名及顺序
马前泼水指的是什么生肖?马前泼水这个故事是什么意思?
巴黎恋人的结局是什么?巴黎恋人演员表
手净欲摸杯是什么意思?手净欲摸杯的出处是哪里?
环球观点:Linux 命令大全:2万字实现Linux自由
20088乐队现在怎么样?20088乐队现在怎么样了?
milo显示器是什么牌子?milo显示器怎么样?
ec文件是什么的简称?ec文件怎么打开?
神舟笔记本如何下载安装软件?神舟笔记本如何下载驱动?
tplink路由器怎么设置端口映射?tplink路由器怎么重新设置密码?
冰箱电磁阀怎么判断好坏?冰箱电磁阀的颜色代表什么?
票房榜前10稳了!《流浪地球2》总票房突破35亿 官方公布月球美术设计
每日信息:丰田皇冠遭车主集体投诉:空调管短了 漏水漏风
腾讯严惩《和平精英》外挂 一大批玩家一觉醒来发现被封号10年
高速特斯拉自动驾驶 驾驶员座位上睡觉!网友:保险赔吗?