图片 15

分代垃圾回收ZGC,jQuery中的选取器

什么是自动垃圾回收?

自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。

在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java
不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。

 

 

twemproxy背景

第一步:标记

这个过程的第一步叫做标记。这一阶段,垃圾回收器识别哪些内存正在使用,哪些内存未被使用。

图片 1

被引用的对象以蓝色展示。未被引用的对象以金黄色展示。在标记阶段,所有对象都需要扫描并做出判断。如果系统中的所有对象都必须扫描到,这将是一个非常耗时的过程。

在jQuery中选择器分为:基本选择器,层次选择器,过滤选择器,表单选择器

 

第二步:清除

这一步会删掉标记出的未引用对象。图片 2

内存分配器会保留指向可用内存的引用,以供分配新对象。

一,基本选择器:

在业务量剧增的今天,单台高速缓存服务器已经无法满足业务的需求,
而相较于大容量SSD数据存储方案,缓存具备速度和成本优势,但也存在数据安全性的挑战。为此搭建一个高速缓存服务器集群来进行分布式存储是十分必要的。

压缩

为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。图片 3

1,基本选择器是jQuery最常用的选择器,也是最简单的选择器,它是通过元素id,class,标签名称来查找DOM元素(注意:在网页中ID只能使用一次,id是唯一的,但是class允许重复使用的)
2,id选择器:

目前主流的高速缓存服务器是redis和memchache。而twemproxy是支持memcached和redis协议的轻量级代理中间件,能用于高速缓存服务器集群的搭建。为此,twemproxy是高速缓存服务器集群的核心组件之一,也是业界较为成熟的高速缓存服务器集群解决方案之一。

为什么使用分代垃圾回收?

如前所述,标记并整理所有JVM里的对象,效率是很低的。随着越来越多的对象被分配,对象列表不断增长,导致垃圾回收时间越来越长。然而,根据应用程序的经验分析,大多数的对象都是短命的。

下面是这类数据的一个例子。Y轴表示分配的字节数,X轴表示随着时间分配的字节数。

图片 4

正如你所看到的,随着时间的推移,仍然存活的对象越来越少。事实上,大多数对象的生命周期都很短,如图左侧较高的值所示。

 

1)根据给定的id匹配一个元素

 

JVM 分代

根据之前的规律,就可以用来提升 JVM
的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老年代,以及永生代。图片 5

新对象会被分配在新生代内存。一旦新生代内存满了,就会开始对死掉的对象,进行所谓的小型垃圾回收过程。一片新生代内存里,死掉的越多,回收过程就越快;至于那些还活着的对象,此时就会老化,并最终老到进入老年代内存。

Stop the World 事件 —— 小型垃圾回收属于一种叫 “Stop the World”
的事件。在这种事件发生时,所有的程序线程都要暂停,直到事件完成(比如这里就是完成了所有回收工作)为止。

 

老年代用来保存长时间存活的对象。通常,设置一个阈值,当达到该年龄时,年轻代对象会被移动到老年代。最终老年代也会被回收。这个事件成为
Major GC。

Major GC 也会触发STW(Stop the World)。通常,Major
GC会慢很多,因为它涉及到所有存活对象。所以,对于响应性的应用程序,应该尽量避免Major
GC。还要注意,Major GC的STW的时长受年老代垃圾回收器类型的影响。

永久代包含JVM用于描述应用程序中类和方法的元数据。永久代是由JVM在运行时根据应用程序使用的类来填充的。此外,Java
SE类库和方法也存储在这里。

如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。

 

 

2)用法:$(“#txt”)选取id为txt的元素(返回单个元素)

twemproxy概述 

分代垃圾回收过程

既然已经了解了为什么将堆分成不同的代,现在就该看看这些空间到底是如何交互的。下面的图片展示了JVM中对象分配和老化的过程。

首先,任何新对象都在Eden区分配。两个survivor区都是空的。

图片 6

当Eden区满了,触发一次Minor GC。

图片 7

被引用的对象被移动到第一个Survivor区,未被引用的对象会在Eden区清除时一并删除。

图片 8

 

在下一次Minor
GC中,Eden区也会做同样的操作。删除未被引用的对象,并将被引用的对象移动到Survivor区。然而,这里,他们被移动到了第二个Survivor区(S1)。此外,第一个Survivor区(S0)中,在上一次Minor
GC幸存的对象,会增加年龄,并被移动到S1中。待所有幸存对象都被移动到S1后,S0和Eden区都会被清空。注意,Survivor区中有了不同年龄的对象。

图片 9

在下一次Minor
GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S0,。幸存的对象增加年龄。Eden区和S1被清空。

图片 10

 

 

此幻灯片演示了 promotion。
在较小的GC之后,当老化的物体达到一定的年龄阈值(在该示例中为8)时,它们从年轻一代晋升到老一代。

图片 11

随着较小的GC持续发生,物体将继续被推广到老一代空间。

图片 12

所以这几乎涵盖了年轻一代的整个过程。
最终,将主要对老一代进行GC,清理并最终压缩该空间。

图片 13

 

3.class(类选择器)

 

1)根据给定的类名匹配元素

twemproxy是搭建分布式缓存集群的重要组件之一。他能将来自客户端的redis包通过key分片发送到不同的redis服务器,而不是发到单个redis服务器上。因此,可以使本来集中到一个redis上的信息被分流到多个redis上,这就使得 twemproxy能支持redis集群。

2)用法:$(“.txt”)选取所有class为txt的元素(返回集合元素)

不难想到,因为twemproxy的分片功能,可以轻松地对redis集群进行水平扩展(简单地理解成在一个业务中加入更多的redis服务器),同时对于代码稍加改造,我们就可以得到能读写分离的redis集群,这大大将提高了redis集群的性能。这使得各大公司如豌豆荚、阿里、百度等都对于这份代码进行了修改,能使其满足分布式缓存集群的要求。当然,twemproxy并不负责数据一致性的工作。

4、element(标签选择器)
1)用法:$(“span,p,div”); 返回集合元素

源码下载地址: 

5,*匹配所有元素

 

1)用法:$(“*”) :返回集合元素,匹配所有元素

twemproxy架构 

二,层次选择器:

 

1,先找到元素的父级元素+空格找其子级元素

为了能更好地了解twemproxy的代码结构,我们就需要了解twemproxy的架构,明白与它交互的组件。下面就是一般twemproxy的架构图

2.语法:parent  child;

图片 14图1
twemproxy架构图

例如:

图1中,client是客户端,这里的客户端可以是很多应用,如网页,也可以是一些需要redis支持的服务器。LVS是Linux虚拟服务器,它主要用于负载均衡以及数据冗余,当然这一个层的负载均衡以及数据冗余也可以通过其他手段完成,如HAproxy等,当然也可以不需要这一层,可以让客户端直连twemproxy。memchache和redis是twemproxy目前支持的两种高速缓存服务器,但是考虑到高可用性和具体功能,一般会选用redis服务器。

<!DOCTYPE html>
<html xmlns=”;
<head>
<meta http-equiv=”Content-Type” content=”text/html;
charset=utf-8″/>
<title></title>
<script src=”Scripts/jquery-3.3.1.min.js”></script>
<script type=”text/javascript”>
$(function () {

我们可以看到在这种架构下,由于所有的通信都是用redis或者memchache协议完成。为此,client根本不知道和它通信的是高速缓存服务器还是twemproxy,高速缓存服务器memchache或redis也不知道和它联系的的是client还是twemproxy。

var txt = $(“#table1
tr”);//找到table1中的tr
var txt = $(“#table1 tr
td”);//找到table1中的tr下的td

这样业务量一旦提升,我们只需要添加适量的高速缓存服务器和twemproxy服务器就可以满足业务需求。在这期间,几乎不需要对原先的client端的代码或者原先的高速缓存服务器的配置做任何修改,就可以完成业务上的水平扩容,这样就大大提高了高速缓存服务器的可用性。同时,由于不用修改client端的代码,我们可以进行平滑升级,即用户根本感知不到我们对业务进行了扩容,线上的client端不会因为我们的扩容而停止服务。同样地,我们可以对业务进行缩容处理。因此在业务量急剧变化的时候,这种架构的灵活性和可用性是原先单一的高速缓存服务器集群不能比拟的。

})
</script>
</head>
<body>
<table id=”table1″>
<tr><td></td></tr>
</table>

从这幅架构图上,我们也能开始逐一说明twemproxy的特性,阅读源码文件夹下的《README.md》的features,至于他是如何实现的,就需要我们去解读代码,这不是这一章要完成的任务。

三:过滤选择器:(注意:过滤选择器前以:开头)

图片 15

1.基础过滤选择器:

                                  图2
twemproxy特性

1):first 找到第一个元素

1.Fast,即快速,据测试,直连twenproxy和直连redis相比几乎没有性能损失,这已经很逆天了,最重要的是他还没有进行读写分离就能达到这样的效果,确实fast

用法:$(“div:first”)选取所有<div>元素中第一个<div>元素

2.Lightweight,即轻量级,就我个人而言,它代码量就是轻量级的,解压后仅仅1.8MB!!!!因为透明连接池,内存零拷贝以及epoll模型的使用,使得它足够快速和轻量级。

2):last 找到最后一个元素

3.Enables pipelining of requests and responses,Keeps connection count
on the backend caching servers
low,即保持前端的连接数,减少后端的连接数,这里主要得益于透明连接池的使用,前端主要指的是client和lvs,后端指的是redis和memchache,这个好处特别明显,既可以减少了redis的连接负载,又保持了保持了前端的功能。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:

相关文章

网站地图xml地图