首页 文章 精选 留言 我的

精选列表

搜索[CEL策略],共10004篇文章
优秀的个人博客,低调大师

技术篇-HBase 最佳实践-读性能优化策略

Full GC 问题之前在一些文章里面已经讲过它的来龙去脉,主要的解决方案目前 主要有两方面需要注意,一方面需要查看 GC 日志确认是哪种 Full GC,根据 Full GC 类型对 JVM 参数进行调优,另一方面需要确认是否开启了 BucketCache 的 offheap 模式,建议使用 LRUBlockCache 的童鞋尽快转移到 BucketCache 来。当然我们还是很期待官方 2.0.0 版本发布的更多 offheap 模块。 RIT 问题,我相信更多是因为我们对其不了解,具体原理可以戳这里,解决方案目前有两个,优先是使用官方提供的 HBCK 进行修复(HBCK 本人一直想拿出来分享,但是目前案例还不多,等后面有更多案例的话再拿出来说),使用之后还 是解决不了的话就需要手动修复文件或者元数据表。 而对于写吞吐量太低以及读

优秀的个人博客,低调大师

深入理解JVM(三)——垃圾收集策略详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79612610 Java虚拟机的内存模型分为五个部分,分别是:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。 这五个区域既然是存储空间,那么为了避免Java虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集者的角色,不定期地回收一些无效内存,以保障Java虚拟机能够健康地持续运行。 这个垃圾收集者就是平常我们所说的“垃圾收集器”,那么垃圾收集器在何时清扫内存?清扫哪些数据?这就是接下来我们要解决的问题。 程序计数器、Java虚拟机栈、本地方法栈都是线程私有的,也就是每条线程都拥有这三块区域,而且会随着线程的创建而创建,线程的结束而销毁。那么,垃圾收集器在何时清扫这三块区域的问题就解决了。 此外,Java虚拟机栈、本地方法栈中的栈帧会随着方法的开始而入栈,方法的结束而出栈,并且每个栈帧中的本地变量表都是在类被加载的时候就确定的。因此以上三个区域的垃圾收集工作具有确定性,垃圾收集器能够清楚地知道何时清扫这三块区域中的哪些数据。 然而,堆和方法区中的内存清理工作就没那么容易了。堆和方法区所有线程共享,并且都在JVM启动时创建,一直得运行到JVM停止时。因此它们没办法根据线程的创建而创建、线程的结束而释放。 堆中存放JVM运行期间的所有对象,虽然每个对象的内存大小在加载该对象所属类的时候就确定了,但究竟创建多少个对象只有在程序运行期间才能确定。方法区中存放类信息、静态成员变量、常量。类的加载是在程序运行过程中,当需要创建这个类的对象时才会加载这个类。因此,JVM究竟要加载多少个类也需要在程序运行期间确定。因此,堆和方法区的内存回收具有不确定性,因此垃圾收集器在回收堆和方法区内存的时候花了一些心思。 堆内存的回收 1. 如何判定哪些对象需要回收? 在对堆进行对象回收之前,首先要判断哪些是无效对象。我们知道,一个对象不被任何对象或变量引用,那么就是无效对象,需要被回收。一般有两种判别方式: 引用计数法每个对象都有一个计数器,当这个对象被一个变量或另一个对象引用一次,该计数器加一;若该引用失效则计数器减一。当计数器为0时,就认为该对象是无效对象。 可达性分析法所有和GC Roots直接或间接关联的对象都是有效对象,和GC Roots没有关联的对象就是无效对象。GC Roots是指: Java虚拟机栈所引用的对象(栈帧中局部变量表中引用类型的变量所引用的对象) 方法区中静态属性引用的对象 方法区中常量所引用的对象 本地方法栈所引用的对象PS:注意!GC Roots并不包括堆中对象所引用的对象!这样就不会出现循环引用。 两者对比:引用计数法虽然简单,但存在一个严重的问题,它无法解决循环引用的问题。因此,目前主流语言均使用可达性分析方法来判断对象是否有效。 2. 回收无效对象的过程 当JVM筛选出失效的对象之后,并不是立即清除,而是再给对象一次重生的机会,具体过程如下: 判断该对象是否覆盖了finalize()方法 若已覆盖该方法,并该对象的finalize()方法还没有被执行过,那么就会将finalize()扔到F-Queue队列中; 若未覆盖该方法,则直接释放对象内存。 执行F-Queue队列中的finalize()方法虚拟机会以较低的优先级执行这些finalize()方法们,也不会确保所有的finalize()方法都会执行结束。如果finalize()方法中出现耗时操作,虚拟机就直接停止执行,将该对象清除。 对象重生或死亡如果在执行finalize()方法时,将this赋给了某一个引用,那么该对象就重生了。如果没有,那么就会被垃圾收集器清除。 注意:强烈不建议使用finalize()函数进行任何操作!如果需要释放资源,请使用try-finally。因为finalize()不确定性大,开销大,无法保证顺利执行。 方法区的内存回收 我们知道,如果使用复制算法实现堆的内存回收,堆就会被分为新生代和老年代,新生代中的对象“朝生夕死”,每次垃圾回收都会清除掉大量的对象;而老年代中的对象生命较长,每次垃圾回收只有少量的对象被清除掉。 由于方法区中存放生命周期较长的类信息、常量、静态变量,因此方法区就像是堆的老年代,每次垃圾收集的只有少量的垃圾被清除掉。 方法区中主要清除两种垃圾:1. 废弃常量2. 废弃的类 1. 如何判定废弃常量? 清除废弃的常量和清除对象类似,只要常量池中的常量不被任何变量或对象引用,那么这些常量就会被清除掉。 2. 如何废弃废弃的类? 清除废弃类的条件较为苛刻:1. 该类的所有对象都已被清除2. 该类的java.lang.Class对象没有被任何对象或变量引用只要一个类被虚拟机加载进方法区,那么在堆中就会有一个代表该类的对象:java.lang.Class。这个对象在类被加载进方法区的时候创建,在方法区中该类被删除时清除。3. 加载该类的ClassLoader已经被回收 垃圾收集算法 现在我们知道了判定一个对象是无效对象、判定一个类是废弃类、判定一个常量是废弃常量的方法,也就是知道了垃圾收集器会清除哪些数据,那么接下来介绍如何清除这些数据。 1. 标记-清除算法 首先利用刚才介绍的方法判断需要清除哪些数据,并给它们做上标记;然后清除被标记的数据。 分析:这种算法标记和清除过程效率都很低,而且清除完后存在大量碎片空间,导致无法存储大对象,降低了空间利用率。 2. 复制算法 将内存分成两份,只将数据存储在其中一块上。当需要回收垃圾时,也是首先标记出废弃的数据,然后将有用的数据复制到另一块内存上,最后将第一块内存全部清除。 分析:这种算法避免了碎片空间,但内存被缩小了一半。而且每次都需要将有用的数据全部复制到另一片内存上去,效率不高。 解决空间利用率问题:在新生代中,由于大量的对象都是“朝生夕死”,也就是一次垃圾收集后只有少量对象存活,因此我们可以将内存划分成三块:Eden、Survior1、Survior2,内存大小分别是8:1:1。分配内存时,只使用Eden和一块Survior1。当发现Eden+Survior1的内存即将满时,JVM会发起一次MinorGC,清除掉废弃的对象,并将所有存活下来的对象复制到另一块Survior2中。那么,接下来就使用Survior2+Eden进行内存分配。 通过这种方式,只需要浪费10%的内存空间即可实现带有压缩功能的垃圾收集方法,避免了内存碎片的问题。 但是,当一个对象要申请内存空间时,发现Eden+Survior中剩下的空间无法放置该对象,此时需要进行Minor GC,如果MinorGC过后空闲出来的内存空间仍然无法放置该对象,那么此时就需要将对象转移到老年代中,这种方式叫做“分配担保”。 什么是分配担保?当JVM准备为一个对象分配内存空间时,发现此时Eden+Survior中空闲的区域无法装下该对象,那么就会触发MinorGC,对该区域的废弃对象进行回收。但如果MinorGC过后只有少量对象被回收,仍然无法装下新对象,那么此时需要将Eden+Survior中的所有对象都转移到老年代中,然后再将新对象存入Eden区。这个过程就是“分配担保”。 3. 标记-整理算法 在回收垃圾前,首先将所有废弃的对象做上标记,然后将所有未被标记的对象移到一边,最后清空另一边区域即可。 分析:它是一种老年代的垃圾收集算法。老年代中的对象一般寿命比较长,因此每次垃圾回收会有大量对象存活,因此如果选用“复制”算法,每次需要复制大量存活的对象,会导致效率很低。而且,在新生代中使用“复制”算法,当Eden+Survior中都装不下某个对象时,可以使用老年代的内存进行“分配担保”,而如果在老年代使用该算法,那么在老年代中如果出现Eden+Survior装不下某个对象时,没有其他区域给他作分配担保。因此,老年代中一般使用“标记-整理”算法。 4. 分代收集算法 将内存划分为老年代和新生代。老年代中存放寿命较长的对象,新生代中存放“朝生夕死”的对象。然后在不同的区域使用不同的垃圾收集算法。 Java中引用的种类 Java中根据生命周期的长短,将引用分为4类。 1. 强引用 我们平时所使用的引用就是强引用。A a = new A();也就是通过关键字new创建的对象所关联的引用就是强引用。只要强引用存在,该对象永远也不会被回收。 2. 软引用 只有当堆即将发生OOM异常时,JVM才会回收软引用所指向的对象。软引用通过SoftReference类实现。软引用的生命周期比强引用短一些。 3. 弱引用 只要垃圾收集器运行,软引用所指向的对象就会被回收。弱引用通过WeakReference类实现。弱引用的生命周期比软引用短。 4. 虚引用 虚引用也叫幽灵引用,它和没有引用没有区别,无法通过虚引用访问对象的任何属性或函数。一个对象关联虚引用唯一的作用就是在该对象被垃圾收集器回收之前会受到一条系统通知。虚引用通过PhantomReference类来实现。

优秀的个人博客,低调大师

【短视频SDK】短视频SDK License的策略

1.概述 短视频SDK的使用前提是需要开通License的,否则用户集成SDK将会不可用.目前需要用户提供一些基础信息发送到我们的服务邮箱来保证SDK可用.整体用户需要保证提供的信息的准确性.SDK需要保证服务的稳定性和可用性. 2.需要提供的参数 iOS: 应用bundleIDAndroid:包名和签名信息(MD5、格式小写无冒号) 2.1 bundleId如何获取? 你可以直接使用xCode查看,也可以通过代码获取: //代码段示例 [[NSBundle mainBundle] bundleIdentifier] 2.2 包名和签名信息如何获取? 注:获取签名有个点需要明确,绑定的keystore不一样,得到的MD5信息也不一样,如不指定keystore默认拿到的debug包是自己本地的debug.keystore. 如何指定keystore呢

优秀的个人博客,低调大师

谷歌希望通过全新应用下载策略杀死Facebook

从现在的情况来看,移动应用装机量似乎已经成为了谷歌和Facebook竞争的又一前沿阵地。 目前,谷歌已经开始让部分Android用户在无需登陆谷歌Play商店的前提下,直接从搜索结果页面下载应用。消息称,目前这一功能正处于测试阶段,在用户触发了下载窗口后,搜索页面上便会出现一个权限询问小窗和安装按钮,这和谷歌Play商店里的形式十分类似。 尽管这一功能尚未全面推出,但这一举措显而易见将对Facebook近年来增速最快的业务产生巨大影响。数年前,Facebook曾推出了移动应用安装广告,这让消费者可以更加轻松的找到、下载自己需要的应用程序。 目前,绝大多数移动应用安装广告会出现在Facebook的信息流中,并让用户以最快的速度点击、安装应用。对于许多应用开发者而言,Facebook的移动应用安装广告投放也是自己让产品从其他竞争对手中脱颖而出的一个自然选择。有数据显示,Facebook曾借助移动应用安装广告取得了丰厚的移动广告营收。举例来说,这一业务在2014年第一季度在其总营收中的占比达到59%,高于此前一年的30%。而且在这类广告中,广告主可以根据年龄、地理位置、性别和兴趣等重要因素对目标用户进行定位。 然而,如果谷歌开始全面推行让用户直接在搜索结果页面中下载应用的战略,Facebook移动应用安装广告的受欢迎度势必会受到很大影响。尽管Facebook一直拒绝透露移动应用安装广告在公司整体营收中的最新贡献比例,但分析人士相信这一业务已经成为了目前Facebook移动广告业务中最重要的一个环节。 对于谷歌而言,这一全新尝试则使谷歌搜索再一次向人性化靠拢了一步。去年晚些时候,谷歌推出了“应用流”功能。通过这一功能,用户可以在谷歌搜索结果中与应用内容流互动,使得下载移动应用变得不再必要。举例来说,当用户在没有安装旅行应用的时候准备出行,他完全只需通过一次搜索完成预订,而无需特地去下载专门的应用程序。 此外,该公司还在去年尝试推出了“60秒应用试用”服务,顾名思义就是让消费者在广告中先试用60秒再决定是否购买、下载这个应用。就目前而言,谷歌正在测试的直接从搜索结果页面下载应用的服务仅仅适用于谷歌原生搜索,但我们相信这一服务有望在未来覆盖更多平台。 BI旗下调研部门BI Intelligence数据显示,全球移动应用安装广告营收有望在2019年底增长至68亿美元,虽然谷歌大力推行的从搜索结果页面下载应用的服务并不意味着Facebook的末日,但这一举措显而易见会影响Android应用开发者在支配应用广告预算时候的选择,并帮助该公司从这个价值68亿美元的大蛋糕中分一杯羹。 Facebook方面此前曾解释称,公司平台上的移动应用安装广告之所以对于开发者有如此大的吸引力主要是因为,他们可以根据Facebook获悉的用户信息更好的将这类应用向目标用户进行定向推送。不过,谷歌的这一服务也同样会带来一个额外的好处,那就是应用开发者能够清楚的掌握用户会在什么时候搜索自己想要的某类应用。 本文转自d1net(转载)

优秀的个人博客,低调大师

AWS推出云计算新策略:数据及服务

美国心脏协会(AHA)宣布与亚马逊网络服务的战略合作,为研究人员和临床医生推出基于云的数据市场。 将产品定位于垂直市场的想法并不新鲜。新的是将有意义的数据放在公有云上的能力,医生和研究人员可以使用这些数据来更好地了解某些疾病的模式。这是一个伟大的飞跃。 发布后,AHA精密医学平台将包括大量的策展数据集,这些数据集在亚马逊云上集中存储,可搜索和管理。这将使研究人员和临床医生能够汇总和分析数据,包括纵向队列,蛋白质组,基因组和基因表达数据。 对于我们的外行人,这意味着他们将使用精确医学方法来发现重要的心血管疾病洞察,转化为医疗创新。换句话说,研究人员和临床医生将获得数千个病例的知识,包括诊断,治疗和结果。 AWS将向一些组织提供免费访问计算云存储和分析作为AHA数据组合的一部分 - 可能有少数组织获得资助。 与此不同的是,AWS不仅提供存储,还提供数据本身。这使AWS和其他公有云供应商成为数据即服务提供商。他们可以提供您需要的数据点,以及处理和存储能力。 用户的好处是,他们不必查找,加载,然后对数据进行复杂的分析。它在那里,准备探索。 AWS的好处是,许多研究人员和临床医生都倾向于成为AWS客户,或更有可能扩大他们对AWS的使用。 本文转自d1net(转载)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册