缓存背后的“毁灭种子”
堆是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆。 堆空间一般是程序启动时,就申请了,但是并不一定会全部使用。 随着对象的频繁创建,堆空间占用的越来越多,就需要不定期的对不再使用的对象进行回收。这个在 Java 中,就叫作 GC(Garbage Collection)。 由于对象的大小不一,在长时间运行后,堆空间会被许多细小的碎片占满,造成空间浪费。所以,仅仅销毁对象是不够的,还需要堆空间整理。这个过程非常的复杂。 那一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。 Java 的对象可以分为基本数据类型和普通对象。 对于普通对象来说,JVM 会首先在堆上创建对象,然后在其他地方使用的其实是它的引用。比如,把这个引用保存在虚拟机栈的局部变量表中。 对于基本数据类型来说(byte、short、int、long、float、double、char),有两种情况。 我们上面提到,每个线程拥有一个虚拟机栈。当你在方法体内声明了基本数据类型的对象,它就会在栈上直接分配。其他情况,都是在堆上分配。
注意,像 int[] 数组这样的内容,是在堆上分配的。数组并不是基本数据类型。
程序计数器 既然是线程,就代表它在获取 CPU 时间片上,是不可预知的,需要有一个地方,对线程正在运行的点位进行缓冲记录,以便在获取 CPU 时间片时能够快速恢复。
程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。这里面存的,就是当前线程执行的进度。下面这张图,能够加深大家对这个过程的理解。 因就在于目前Android厂商各家都有各家的快充技术,例如小米的Super Charge Turbo、OPPO的VOOC闪充、一加的Warp闪充、vivo的Super FlashCharge、华为的FCP、摩托罗拉的涡轮快充、魅族的mCharge,而芯片提供商还有着如高通的QC快充、联发科的Pump Express。另外还有更为普遍的USB-IF组织制定的USB-PD快充协议。这些协议都有着略微不同的快充实现原理,尽管一款Android机型普遍会支持两种协议,但在配件混用的情况下,最终测试结果一般还是原配来的最好。不赠送快充头,可能就意味着用户在实际使用中的快充无法如厂商宣传中的那样迅猛。 实际上,Google也早已看到了这一问题,不过现在还无法让手机厂商们在快充上达成一致。早在2016年时,Google就提出过在未来希望统一Android的充电标准,当时的这一“强烈建议”,目前来看还暂时收效甚微。要知道,Android阵营在今年年底才有望实现手机间的Airdrop功能,可见要想在各个厂商间统一标准有多难。
然而,苹果并不存在这一问题,苹果的快充遵循了目前最普遍的USB-PD快充协议,这也意味着用户即便不去购买官方的快充头,选择一款第三方的充电器,也能实现快充效果。更何况,目前市场上的体积更小、更利于携带的氮化镓充电器的价格甚至还低于苹果目前官方充电器的售价。而拥有苹果iPad Pro、MacBook Air、MacBook Pro产品的用户,其实可以无需再购买充电器,使用这些产品标配的充电器,在iPhone手机上也能实现快充,目前就有一些苹果用户出门只会带一个MacBook的充电器来同时解决电脑、平板、手机的充电问题。 (编辑:信阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |