精华内容
下载资源
问答
  • RIP路由大防环机制
    千次阅读
    2020-04-10 20:59:53

    防环机制
    1、路由毒化(route poisoning):将故障路由度量值设置为无穷大,并发送出去
    2、水平分割(split-horizon):学习到的路由项将不从原接口返回
    3、毒性逆转(poison maximum):学习到的路由度量值,设置为无穷大,并从原接口返回
    4、定义最大值(define maximum):当路由项cost大于15时,表示路由不可达,丢弃此报文
    5、抑制时间(suppression time):在抑制时间内,对来自于同一个邻居,只要此路由cost小于16则更新;来自于不同邻居,不管cost值增大还是减小都不更新;抑制时间结束后,无论是哪个邻居发来的关于此路由项的更新报文,都直接更新
    6、触发更新(trigger update):不等周期性的时间,立刻更新。路由选择进程修改其路由选择表中的路由度量值后,将发送一条更新路由,其中度量值被设置为一个表明相应的网络不可达值。触发更新将信息立刻告诉其他路由器

    更多相关内容
  • 构建六项机制实施方案.pdf
  • 人大健全六项机制经验交流.doc
  • 构建六项机制实施方案实施计划书范文.doc
  • 项目工程安全生产风险管控“六项机制”-工作实施与方案.doc
  • MFC早在编译器支持RTTI之前,就具有了这能力。承接上一章,我们现在要在Console程序中将RTTI仿真出来。我希望我的类库具备IsKindOf()的能力,能够在执行器检查某个对象是否"属于某种类",并传回TRUE或FALSE。为了...
  • 基于自注意力机制的下一推荐

    千次阅读 2018-11-15 16:27:20
    Next Item Recommendation with self-Attention摘要关键词介绍相关工作1.序列感知推荐系统(sequence-aware) ...通过自注意力机制可以在用户交互轨迹中评估每个item的相关权重,以便更好的来学习用户瞬...


    ACM 2018 原文地址

    摘要

    这篇论文,作者提出了一个序列感知推荐模型。该模型利用自注意力机制从用户历史交互中推测出item-item之间的关系。通过自注意力机制可以在用户交互轨迹中评估每个item的相关权重,以便更好的来学习用户瞬时兴趣的表示。这个模型最后训练在**度量学习框架(metric learning framework)**上,并且考虑了用户短期和长期的意图。在不同领域大量的数据集上的实验证明了,我们的方法表现了最有的性能。

    关键词

    推荐系统、序列推荐、自注意力

    介绍

    在很多领域有丰富的历史交互数据存在,比如点击率、购买记录、浏览等,通过这些数据可以构建有效的推荐系统。利用历史数据来推算出下一项推荐是很多基于机器学习的推荐系统基础。很多现有成果利用用户行为的再现和丰富的序列模型来预测用户的next item。这篇论文利用自回归趋势来建立高效的序列推荐系统。
    近几年CNN和RNN对于解决序列问题方法很火热。RNN中,相连item之间的交互可以被循环矩阵捕获,长期依赖关系可以保存在循环记忆中。CNN通过对输入序列进行滑动参数化地转换,隐式得捕获交互。但是这样的推荐系统有一个缺点:它们不能通过历史数据显示得捕获item-item之间的交互。建模用户上下文历史中的item-item之间的关系,是非常必要的。因为理解单个item pairs之间的粒度关系(fine-grained)而不是简单地掩饰他们是十分重要的。我们假设为我们的模型提出归纳偏置,将会提高表示的质量,进而提高序列推荐系统的性能。
    为此,我们提出了一种神经序列推荐系统,其中序列表示不仅通过建模consecutive item,而且通过建模当前窗口all user interactions来学习。因此我们的模型,可以说是一种local-global的方法。我们认为,基于自注意力机制的神经模型,通过全体用户的历史交互序列,显示得表达item-item之间的相互作用。这不仅能够使我们了解全局信息,而且还能了解连续的K个item项之间的短期信息。基于自匹配矩阵(self-matching matrix),我们学习关注相互作用的序列,以选择出最相关的item,来产生最终的用户表示。实验证明,我们的模型贼好。
    我们的模型运用度量学习框架的形式,在训练过程中,用户的选择item和预期item之间的距离被拉进。这是第一个在序列推荐系统中运用自注意力机制度量学习的例子。我们的贡献有以下三个:
    1.新颖的序列推荐系统:模型结合自注意力网络和度量嵌入模型来建模用户临时的和长期的意图。
    2.我们的框架在12个完善的数据集上试验了,性能优秀。演示了序列建模中, 显示得表达了item-item之间的关系。
    3.我们实现了广泛的超参数和消融研究。

    相关工作

    1.序列感知推荐系统(sequence-aware)

    user-item的交互记录在时间戳中,积累的数据能够对时间动态建模,并为用户偏好提供证据。
    前人对此研究:
    Koren et al. [22]将用户和item偏好视为随时间变化的函数,对item的瞬时流行度和用户时间倾向建模
    Xiong et al. [40]引入额外的时间因子,建立贝叶斯概率张量因子分解方法来模拟时间漂移
    Wu et al. [39] 使用递归神经网络模拟评级的瞬时演变
    都是专门用于预测评级的。
    为了生成个性化推荐排名列表:
    Rendle et al. [28] 将矩阵分解和马尔可夫链相结合
    He et al. [12] 基于相似性的方法于马尔可夫链相融合的顺序推荐方法,除此之外,度量嵌入也很好
    Feng et al. [6] 通过引入嵌入翻译的思想来改进该模型

    2.基于深度神经网络的推荐

    深度学习用在推荐系统很多领域,比如多层感知器在建模用户关系时可以引入非线性表示。卷积神经网络可用于物品和用户的特征提取,自编码器从side信息中学习显著信息来提高推荐质量,RNN建模时间。
    在所有的推荐系统中,基于会话的推荐系统和我们系统的任务相似,但是也有些不一样。在基于会话的推荐系统中,用户身份未知,因此模型结构和学习过程是分散的(divergent)。深度学习的灵活性使得将不同的神经网络相结合可以形成强大的混合推荐系统。这归功于其非线性、强大的学习表示、和序列建模。
    Wang 提出分层表示模型,去捕获用户总体偏好和时序行为。
    Tang 提出卷积序列模型,去学习用户瞬时轨迹。其性能比CNN好。
    总体来说,CNN和RNN需要从大量数据在学习才有意义,稀疏的数据集使模型学习变得很困难。

    3.神经注意力模型

    神经注意力模型和人类视觉很类似,它只学习关注最重要的部分。标准的注意力可以整合到CNN和RNN中来克服其不足。特别得,注意力机制使得RNN容易记住非常长期的依赖关系,可以帮助CNN将注意力集中在最重要的部分。
    我们的论文是基于一种新的模型,自注意力机制。自注意力机制关注的是两个序列的协作学习和自我匹配(co-learning and self-matching)*。其中一个序列的注意力权重取决于另一个序列,反之亦然。它可以在序列学习中代替RNN和CNN,以更低的计算复杂度达到更高的精度。我们用自注意力机制建模序列依赖关系和用户短期行为。但值得注意的是,在基于上下文的推荐系统中,使用自注意力机制并不是那么简单,因此我们的论文好呀!

    模型:AttRec

    AttRec即self-attentive sequential recommendation,本模型由两部分组成。一部分是用于建模用户短期意图的自注意力机制,一部分是建模用户长期偏好的协作度量学习。

    1.序列推荐

    用户最近的交互反映了用户近期的需求和意图。因此为了更好的地理解用户的时间偏好,建模用户短期交互是一项重要的任务。本文使用自注意力机制来捕获序列并使用它来建模用户最近的交互轨迹。U表用户,I表item。其中|U|=M,|I|=N。我们使用表示用户u交互的item序列是有序的
    表示用户u交互的item序列,是有序的。其中Hu属于I。序列推荐的目的是为了通过之前的轨迹,预测用户可能与之交互的下一项item。

    2.使用自注意力机制建模短期意图

    自注意力模型是注意力机制的一个特例,已成功应用于各自任务,它通过将单个序列与自身匹配来细化表示。在背景知识有限的情况下,自注意力可以保存上下文序列信息,并捕获序列中元素的关系。因此用自注意力来关注用户过去的行为。
    自注意力机制的基础是被缩放的点积注意(dot-product attention)。该模型的输入由query、value、key三个组成,输出是value的加权和。其中权重矩阵由query和与其对应的key决定。在本文中,query、key、value三值相等,并且都是又用户最近的历史记录组成。假设用户的短期意图可以从她最近的交互L中得到。其中每一项都可以由d维的嵌入向量表示。X ∈ RN×d表明全体item的嵌入表示。最新的L项(比如从t-L+1到t)按顺序放在在如下矩阵中:
    在这里插入图片描述
    最新的L项是Hu的子集。用户u的query、key、value在时间步长t下,等于Xut(X的上标是u下标是t)。
    首先:我们将query和key通过共享参数的非线性变化整合到一个空间中。
    在这里插入图片描述
    ReLU是激活函数,是为了引入非线性表示到学习到的注意中。关联矩阵的计算如下:
    在这里插入图片描述
    输出是L*L的关联矩阵(或注意力map),表明L项之间的相似度。注意根号d被用于收缩点积注意。在我们这个例子中,d通过设得比较大(比如100)。这样的话,缩放因子可以减小非常小的梯度效应。在softmax之前应用屏蔽操作(屏蔽关联矩阵的对角线),以避免相同的query向量和key之间的高匹配分数。(不是很理解)
    第二:我们保持Xut不变,在模型中使用恒等映射(identity mapping)(其他模型使用线性变换来映射)在其他应用领域中,value通常是预先训练的特征嵌入,例如字嵌入或图像特征。但本模型value由需要学习的参数构成,线性或非线性变换的加入将增加实际参数显露的难度。key和query是辅助信息,以便其不像value那样那么容易被转换。
    最后,关联矩阵和value相乘构成最后的自注意力机制的权重输出:在这里插入图片描述
    aut就表示用户短期意图的表示。为了学习单个注意力表示,我们L自注意表示的均值嵌入作为用户瞬时意图。注意,其他的方式也可以(比如累加啊、求最大啊、最小啊),后面的实验将会比较效果。
    在这里插入图片描述
    输入嵌入的时间信号:以上的自注意力模型不包括时间信号,没有序列信号。输入低级的词袋不能归保留序列模式。我们提议通过位置嵌入提供带有时间信息的query和key。我们使用一个时间尺度的几何序列来向输入端添加不同频率的正弦波。时间嵌入(TE)由以下两个正弦信号组成:
    在这里插入图片描述
    其中t是时间步长,i是维度。在非线性变换之前,TE加到query和key里。
    整个过程的图如下:
    在这里插入图片描述

    3用户长期喜好建模

    在对短期效果进行建模之后,将用户的一般品味或长期偏好结合起来是有益的。和潜在因素方法相同,我们为每个用户和每个item分配一个潜在因素。让U属于RMd(Md为上标),V属于RNd(Nd为上标)表明users和item的潜在因素。然而,最新你的研究表明,点积操作违背了度量函数参数不等下的性质,并且将会导致次优解。为了避免这个问题,我们采用欧式距离去测量item i和user u的距离。
    在这里插入图片描述
    越小,距离越近~~~~

    4.模型训练

    目标函数:给定时间步t的短期意图,和长期偏好。我们的目标是预测用户u在时间t+1下的item(我们用Hu t+1表示,u为上标,t+1为下标)为了保证一致性,我们使用欧式距离,去建模短期和长期的影响。使用其和作为最后的推荐分数。
    在这里插入图片描述
    上式中,第一项是长期推荐的分数,第二项是短期推荐的分数。注意:在这里插入图片描述
    都是下一项item的嵌入向量,但是V和U是不一样的参数。最后的分数是由w控制的加权和。
    在有些例子中,我们期望去预测多个item。这要求我们的模型,可以捕获序列中的跳跃行为。T+表示用户真正喜欢的下一项T。在我们的论文中,我采用成对排序方法去学习参数,因此我们需要去采样T的反面,即用户不会交互的,不喜欢的item(用T-表示)。显然T-是从I/T+中采样的来的。为了增强消极对和积极对之间的区别。我们使用铰链损失函数:
    在这里插入图片描述
    上式中,在这里插入图片描述是模型参数,r是分离积极和消极对的距离。我们使用l2损失去控制模型的复杂度。DropOut也可以被用于自注意力模型的非线性层。因为我们使用欧式距离,对于稀疏数据集,我们也可以选择范数剪裁策略在欧里几德求中去约束x,u,v。
    优化和建议:利用自适应梯度法优化提出得模型,可以自动得适应步长,因此减少学习速率调整所作的努力。

    展开全文
  • 系统分析了水力压裂、钻冲压一体化、老孔修复、三堵两注固液两相封孔、下向瓦斯抽采孔自动排水排渣气驱、地面以孔代巷等六项瓦斯抽采技术的增产原理,简要介绍了研制的相关装备、装置和器材以及现场应用效果。...
  • 原标题:共识机制:权益证明机制(POS)在区块链系统框架中,共识层提供了全网对交易和区块的共识,是接在区块链中产生信任的方法和机制。目前常用的共识机制有三种: Proof of Work工作量证明,简称PoW;Proof of ...

    原标题:共识机制:权益证明机制(POS)

    在区块链系统框架中,共识层提供了全网对交易和区块的共识,是接在区块链中产生信任的方法和机制。

    目前常用的共识机制有三种: Proof of Work工作量证明,简称PoW;Proof of Staked权益证明,简称Pos; Delegated Proof of Stake授权股权证明,简称DPoS。其中,工作量证明PoW是比特币所用的共识机制,也是目前使用最广泛和成熟的共识机制,权益证明PoS和授权股权证明DPoS这两种机制是针对工作量证明机制不足之处进行优化和完善而产生的,其应用范围目前也集中在后期产生的一些数字货币,等等;下面我们介绍第二种机制POS。

    14e7a89c953536d159d264fff8094bc0.png

    权益证明机制

    权益证明机制,是针对工作量证明机制存在的不足而设计出来的一种改进型共识机制,其英文全称Proof of Stake,简称POS。与工作量证明机制要求节点不断进行哈希计算来验证交易有效性的机制不同,权益证明机制的原理是:要求用户证明自己拥有一定数量的数字货币的所有权,即“权益”。

    2012年8月个化名 Sunny King的极客推出了 Peercoin( PPC采用工作量证明机制发行新币,采用权益证明机制维护网络安全。这是首次将权益证明机制引入到加密数字货币领域。经过近两年的发展,这种机制得到了市场的广泛认同,后来采用PoS机制的还有 BitShares、Shadow cash、Nxt、 Black coin等数字货币,以太坊( Ethereum)也计划通过硬分叉( hard fork)来从PoW转换到PoS机制上来。

    PoS这种机制与PoW机制的最大不同在于,只有持有数字货币的人才能进行挖矿,而且不需要大量的算力就可以挖到货币,避免了比特币网络中出现的“算力集中”趋势,回归到区块链“去中心化”的本质要求。

    工作量证明机制产生区块时依赖于算力,致使每一个比特币的创建至少需要240度电(2014年数据),相当于16加仑的汽油。权益证明机制产生区块时不采用算力作为资源,而将对数字货币的拥有权视作稀缺资源来产生共识,创建区块的节点必须提供证明,让全网认同它在创建这个区块之前拥有一定数量的数字货币。

    首先,PoS机制在创建区块时,要求自己先拥有数字货币(如比特币或PPC),即先拥有一定数量的权益( Stake)。有意思的是,对于整个数字货币网络来说,创始区块拥有的数字货币是用比特币的PoW机制“挖矿”出来的,但从创始货币往下实施的是权益证明机制,创建区块的同时也创建出更多的数字货币。因此在PoS机制下,创建区块的过程不叫“挖矿”而叫“铸币”。

    05628d9cdb65263876375a6bd62f0770.png

    (一)币龄

    PoS机制的主要特点是引人了“币龄”概念。币龄的概念至少在2010年就为中本聪所知,并用于比特币中帮助区分交易的优先级,但在比特币的安全模型中不担负关键作用。币龄定义为交易的货币数量乘以该货币在钱包中储存的时间,例如,假设Bob从Ace处收到10个币并持有90天,我们就说BQb已经积累了10×90=900天”的币龄另外,当Bob把他从 Alice处收到的10个币花掉之后,系统认定Bob将这10个币上积累的“币龄”已经消费了,在Bob的钱包中这10个币的币龄归零,相应地,他创建一个新区块的能力也就归零了。为加快币龄的计算,PoS机制在每项交易中引入了一个时间戳。区块的时间戳以及与协议相关的交易时间戳促进了币龄的计算。

    (二)PoS机制下产生区块

    在PoS设计中,区块分为两类:PoW区块和PoS区块。

    PoS(币权)交易的结构如图所示。

    dbcb6fd0eb0fd78add8094c2f1bd976b.png

    新型区块中的PoS是一种特殊的交易,称为币权交易( coinstake,与比特币的特定交易命名为币基 coinbase相对应)。在币权交易中,区块所有者进行支付并消耗币龄,同时得到产生一个区块和PoS铸币的权限。

    币权交易的第一个输入称为核心( Kernel)输入,需要符合特定的哈希目标协议,因此使产生PoS区块的过程成为一个随机过程,与PoW区块相似。但与PoW区块不同的是,币权交易的哈希操作是在一个有限的搜索空间内执行(更具体地说,是每秒在每个未支付的钱包进行一次哈希),而不是像PoW那样一个无限的搜索空间内进行,因此不需要消耗大量的能源。

    权益核心必须匹配的哈希目标是在核心中所消的每单元币龄(与之相对的是比特币的PoW目标是符合一个给定的目标哈希值)。因此在核心中消耗越多的币龄,就更容易符合哈希目标协议,例如,假如Bob有一个钱包,其中累积了100币年,希望两天内生成一个核心,那么 Alice可以预期她的200币年的钱包在一天内产生一个核心。另外,PoS的哈希目标是连续调整的,不像比特币有两周的调整间隔,可以避免网络产出率的突然波动。

    (三)基于PoS的铸币

    在比特币PoW铸币机制之外,PoS区块引入了一种新的铸币机制。PoS区块基于币权交易中消耗的币龄来铸造货币,选择“每消耗1币年产生1分钱”的铸币速率,导致未来的通货膨胀率很低。PoS保留了PoW作为铸币流程的初始部分以促进初始铸币,但是作用类似于股票交易的上市首发,之后就不需要PoW机制进行铸币了。

    (四)主链协议

    PoS采用区块消耗的币龄来决定哪一个竞争的区块链赢得主链地位区块中的每一笔交易的币龄合计为区块的积分,具有最大的总消耗币龄的区块链被选择为主链。这与比特币的主链协议中使用PoW相反,其使用区块链的总工作量来决定主链。这种设计减缓了对比特币51%攻击的担心,在比特币网络中,只有当好节点”至少控制51%的网络挖矿能力时系统才认为是安全的。在PoS机制下,控制51%权益的成本远远高于控制51%挖矿能力的成本,因此攻击方的成本会大幅提高。此外攻击方的币龄在攻击期间大量消耗,可使得攻击者继续阻止交易进入主链的行为变得更加困难。

    (五)检查点:历史保护

    使用消耗的总币龄决定主链,这种机制的一个不利因素是它降低了攻击全部的历史区块链的成本;另一个担心是双花攻击的成本也下降了,因为攻击者只需积累一定数量的币龄就可强制重组区块链尽管比特币对交易历史有相当强的保护作用,但中本聪还是在2010年引入了检查点机制,通过阻止对检查点之前的区块链的任何改动,来强化区块链历史交易的保护。借鉴比特币的做法,为保障PoS的商业实践,在PoS中也引入一个检查点的附加表格,在较短间隔内(如一天多次)进行中心广播,用于冻结区块链和完结交易。这种新型检查点的广播机制类似于比特币的报警系统。另一个技术原因也导致了PoS采用中心化广播的检查点。为了抵御“拒绝服务攻击”,在PoS区块可被每个节点的本地数据库(区块树)接受之前,PoS必须验证币权交易的核心。PoS采用了中心化检查点,其解决方案是:修改币龄算法为设定一个最小币龄,如一个月,低于最小币龄的都计为0,然后中心化检查点确保所有节点都认同过去的全部交易都比一个月长,因此,验证币权核心连接是否能成为核心时要求非零的币龄,也就是说必须使用比一个月时间更早的产出。

    (六)区块签名和权益复制协议

    每一个区块必须由所有者签名,防止攻击者复制和使用同一PoS。权益复制协议用来抵御攻击者用一个PoS产生多个区块来实施的“拒绝服务”攻击,每一个节点收集它所看到的全部币权交易具备的(核心,时间戳)数据对,如果节点收到的一个区块含有与另一个之前收到的区块相同的数据对,则忽略这一复制权益的区块,并接收其他区块。在数据对中“时间戳”是指本区块的创建时间距离创始区块的秒数。

    (七)能效

    在比特币中,当PoW铸币率接近为0时,构造PoW区块几乎没有奖励,在这种长期情况下网络的能源消耗降到非常低的水平,因为不感兴趣的矿工停止了PoW区块的挖矿。这时比特币网络将面临危机,除非提升交易费用到足够高以持续能源消耗。而在PoS机制下,即使网络能源消耗为0,PoS仍然保护着网络。如果用于PoW机制的能源消耗可以接近于0,这种加密货币就被称为“长期能效”。

    (八)其他考虑

    PoS机制修改了PoW的铸币速率决定机制,不是由区块高度(即时间)决定的,而是由难度决定的。当挖矿难度上升时,铸币速率降低,相比于比特币的阶梯函数走势,PoS的曲线相当平稳,避免了对市场的人为冲击。

    在比特币及PoW机制下,交易费的存在导致矿工之间排斥合作。为了解决这个问题,在PoS机制下,对区块所有者不再支付交易费用,而且如果不确认其他矿工的区块就没有交易费,只在协议层级实施交易费。这种方式有利于抵消PoS铸币的通货膨胀作用。

    (九)随机抽签

    PoS的铸币是基于账户所拥有的有效数字货币权益,必然会导致“富者越富,穷者越穷”的马太效应,因为“富有”的人,即持有数字货币权益越多的人,他创建新区块的可能性更高,“铸造”出新的数字货币也越容易,就会拥有越多的数字货币,然后这一结果再反过来推进“铸币”的过程……而“穷人”由于初始权益少,币龄不足,创建区块、获得新币的可能性大为降低,反过来又进一步影响下一次的“铸币”成功率,最终的结果就是“富者越富,穷者越穷”。

    当然,在比特币中也存在这样的现象,比如越富有的人就有越多的资金,可以购置更多的高性能矿机甚至建立矿池,拥有更强大的算力,也就是说可以挖到更多的比特币,而穷人由于缺乏资金,在极端情况下只能采用CPU或GPU挖矿,在当前网络算力下可能根本挖不到矿、得不到比特币,这不就是另一种形式的“富者越富,穷者越穷”吗?

    PoS机制为了解决这个问题,一方面设计了一种“随机抽签”机制系统中建立了一套透明的算法机制,根据每一个活跃账户的权益数量(这些权益数量对于全网节点来说是公开的、可以查询的),依据算法,其他节点可以预测到哪一个账户将获得产生下一个区块的权限。当这个账户通过哈希计算撞针获得了创建下一个区块的权限后,它将收集全网中所有未确认的交易,打包到区块中,并填写各种参数,然后将区块向全网广播等待其他节点确认后链入主链,完成了区块链的延续。同时,系统中还规定:当持有数字货币达到90天时其产生下一个区块的概率达到最高,以后即使再增加持有时间,也不能增加产生下一个区块的概率,这一规定避免出现通过增加持有权益时间或数量来垄断区块链的情形。

    注:从零开始学区块链,把每天学习阅读的章节和资讯分享给大家返回搜狐,查看更多

    责任编辑:

    展开全文
  • Tomcat 的类加载机制

    千次阅读 2021-10-16 19:14:38
    在前面 Java虚拟机:对象创建过程与类加载机制、双亲委派模型 文章中,我们介绍了 JVM 的类加载机制以及双亲委派模型,双亲委派模型的类加载过程主要分为以下几个步骤: (1)初始化 ClassLoader 时需要指定自己的...

            在前面 Java虚拟机:对象创建过程与类加载机制、双亲委派模型 文章中,我们介绍了 JVM 的类加载机制以及双亲委派模型,双亲委派模型的类加载过程主要分为以下几个步骤:

    • (1)初始化 ClassLoader 时需要指定自己的 parent 是谁
    • (2)先检查类是否已经被加载过,如果类已经被加载了,直接返回
    • (3)若没有加载则调用父加载器 parent 的 loadClass() 方法进行加载
    • (4)若父加载器为空则默认使用启动类加载器 bootstrap ClassLoader 进行加载
    • (5)如果父类加载失败,抛出 ClassNotFoundException 异常后,再调用自己的 findClass() 方法进行加载。

            前面文章也提到,如果想要破坏这种机制,那么就自定义一个类加载器(继承自 ClassLoader),并重写其中的 loadClass() 方法,使其不进行双亲委派即可。最经典例子就是 Tomcat 容器的类加载机制了,它实现了自己的类加载器 WebApp ClassLoader,并且打破了双亲委派模型,在每个应用在部署后,都会创建一个唯一的类加载器。

    1、Tomcat 的类加载器结构图:

    (1)Common ClassLoader:加载 common.loader 属性下的 jar,一般是 CATALINA_HOME/lib 目录下,主要是 tomcat 使用以及应用通用的一些类

    (2)Catalina ClassLoader:加载 server.loader 属性下的 jar,默认未配置路径,返回其父加载器即 Common ClassLoader,主要是加载服务器内部可⻅类,这些类应⽤程序不能访问;

    (3)Shared Classloader:加载 share.loader 属性下的jar,默认未配置路径,返回其父加载器即 Common ClassLoader,主要是加载应⽤程序共享类,这些类对 Tomcat 自己不可见;

    只有指定了 tomcat/conf/catalina.properties 配置文件的 server.loader 和 share.loader 项后,才会真正建立 Catalina ClassLoader 和 Shared ClassLoader 的实例,否则在用到这两个类加载器的地方都会用 Common ClassLoader 的实例代替,而默认的配置文件中是没有设置这两个 loader 项的

    (4)WebApp ClassLoader:Tomcat 可以存在多个 WebApp ClassLoader 实例,每个应⽤程序都会有⼀个独⼀⽆⼆的 WebApp ClassLoader,⽤来加载本应⽤程序 /WEB-INF/classes 和 /WEB-INF/lib 下的类。

    2、Tomcat 的类加载流程说明:

    当 Tomcat 使用 WebAppClassLoader 进行类加载时,具体过程如下:

    (1)先在本地 cache 缓存中查找该类是否已经加载过,看看 Tomcat 有没有加载过这个类

    (2)如果 Tomcat 没有加载过这个类,则从系统类加载器的 cache 缓存中查找是否加载过

    (3)如果没有,则使用 ExtClassLoader 类加载器类加载,重点来了,Tomcat 的 WebAppClassLoader 并没有先使用 AppClassLoader 来加载类,而是直接使用了 ExtClassLoader 来加载类。不过 ExtClassLoader 依然遵循双亲委派,它会使用 Bootstrap ClassLoader 来对类进行加载,保证了 Jre 里面的核心类不会被重复加载。

    比如在 Web 中加载一个 Object 类。WebAppClassLoader → ExtClassLoader → Bootstrap ClassLoader,这个加载链,就保证了 Object 不会被重复加载。

    (4)如果没有加载成功,WebAppClassLoader 就会调用自己的 findClass() 方法由自己来对类进行加载,先在 WEB-INF/classes 中加载,再从 WEB-INF/lib 中加载。

    (5)如果仍然未加载成功,WebAppclassLoader 会委派给 SharedClassLoader,SharedClassLoad 再委派给 CommonClassLoader,CommonClassLoader 委派给 AppClassLoader,直到最终委派给 BootstrapClassLoader,最后再一层一层地在自己目录下对类进行加载。

    (6)都没有加载成功的话,抛出异常。

    3、源码解析:

    (1)WebAppClassLoader 的 loadClass() 方法源码:

    WebappClassLoader 应用类加载器的 loadClass 在他的父类 WebappClassLoaderBase 中

    public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            Class<?> clazz = null;
            //1. 先在本地cache查找该类是否已经加载过
            clazz = findLoadedClass0(name);
            if (clazz != null) {
                if (resolve)
                    resolveClass(clazz);
                return clazz;
            }
            //2. 从系统类加载器的cache中查找是否加载过
            clazz = findLoadedClass(name);
            if (clazz != null) {
                if (resolve)
                    resolveClass(clazz);
                return clazz;
            }
            // 3. 尝试用ExtClassLoader类加载器类加载(ExtClassLoader 遵守双亲委派,ExtClassLoader 会使用 Bootstrap ClassLoader 对类进行加载)
            ClassLoader javaseLoader = getJavaseClassLoader();
            try {
                clazz = javaseLoader.loadClass(name);
                if (clazz != null) {
                    if (resolve)
                        resolveClass(clazz);
                    return clazz;
                }
            } catch (ClassNotFoundException e) {
                // Ignore
            }
            // 4. 尝试在本地目录搜索class并加载
            try {
                clazz = findClass(name);
                if (clazz != null) {
                    if (resolve)
                        resolveClass(clazz);
                    return clazz;
                }
            } catch (ClassNotFoundException e) {
                // Ignore
            }
            // 5. 尝试用系统类加载器(AppClassLoader)来加载
            try {
                clazz = Class.forName(name, false, parent);
                if (clazz != null) {
                    if (resolve)
                        resolveClass(clazz);
                    return clazz;
                }
            } catch (ClassNotFoundException e) {
                // Ignore
            }
         }
        //6. 上述过程都加载失败,抛出异常
        throw new ClassNotFoundException(name);
    }

    (2)WebAppClassLoader 的 findClass() 方法源码:

    public Class<?> findClass(String name) throws ClassNotFoundException {
        // Ask our superclass to locate this class, if possible
        // (throws ClassNotFoundException if it is not found)
        Class<?> clazz = null;
    
        // 先在自己的 Web 应用目录下查找 class
        clazz = findClassInternal(name);
    
        // 找不到 在交由父类来处理
        if ((clazz == null) && hasExternalRepositories) {  
            clazz = super.findClass(name);
        }
        if (clazz == null) {
             throw new ClassNotFoundException(name);
        }
        return clazz;
    }

    4、为什么tomcat要实现自己的类加载机制:

            WebAppClassLoader 加载类的时候,故意打破了JVM 双亲委派机制,绕开了 AppClassLoader,直接先使用 ExtClassLoader 来加载类。最主要原因是保证部署在同一个 Web 容器上的不同 Web 应用程序所使用的类库可以实现相互隔离,避免不同项目的相互影响。当然还有其他原因,如:

    (1)保证 Web 容器自身的安全不受部署的 Web 应用程序影响,所以 Tomcat 使用的类库要与部署的应用的类库相互独立

    (2)保证部分基础类不会被同时加载,有些类库 Tomcat 与部署的应用可以共享,比如说 servlet-api

    (3)保证部署在同一个 Web 容器的应用之间的类库可以共享,这听起来好像主要原因相互矛盾,但其实这很合理,类被类加载器加载到虚拟机后,会存放在方法区的永久代中,如果类库不能共享,虚拟机的方法区就会很容易出现过度膨胀的风险。比如这时候如果有大量的应用使用 spring 来管理,如果 spring 类库不能共享,那每个应用的 spring 类库都会被加载一次,将会是很大的资源浪费。

    小结:Tomcat 实际上只有 WebAppClassLoader 加载器中打破了双亲委派,其他类加载器还是遵循双亲委派的。 这样做最主要原因是保证同个 Web 容器中的不同 Web 应用程序所使用的类库相互独立,避免相互影响

    参考文章:https://mp.weixin.qq.com/s/OwWUDxHY4Th6decmJeMTgA

    展开全文
  • 最后,还针对高科技生产性服务业发展水平低、生产性服务业自身创新能力低、金融机构对制造业支持力度低等问题,提出了提高生产性服务业信息化、智能...服务业和制造业集聚式发展、加大金融机构对小微企业的支持等6项对策建议...
  • CV中的Attention机制总结

    千次阅读 2022-04-06 10:05:26
    SENet注意力机制的理解与PyTorch实现什么是注意力机制 什么是注意力机制 注意力机制是深度学习常用的一个小技巧,它有多种多样的实现形式,尽管实现方式多样,但是每一种注意力机制的核心都是类似的,就是注意力。 ...
  • MFC机制之三:消息映射机制

    万次阅读 2015-06-28 23:12:46
    上篇我们通过重写WindowProc函数来处理消息,今天我们采用下面的方法实现同样的功能  1.建一个win32简单应用程序,不要认为这样就不能写出MFC程序,因为是不是MFC程序取...4.Project-->Settings菜单中设置使用MFC库
  • hadoop 切片机制详解

    万次阅读 2022-01-02 15:19:43
    hadoop切片机制详解
  • Java基础篇:反射机制详解

    万次阅读 多人点赞 2018-09-29 10:19:50
    反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,...
  • 在这研究中,我们提出了一种用于对话响应生成的机制感知型神经机器。 它假定存在一些潜在的响应机制,每种机制都可以为单个输入帖子生成不同的响应。 以此假设为基础,我们将不同的响应机制建模为潜在的嵌入,并...
  • 机制检验、异质性检验、调节效应

    千次阅读 2022-04-28 15:05:18
    机制分析模型(调整要素配置结构): 机制分析模型(生产率提升效应): 异质性检验 1.企业规模 2.企业注册地 调节效应(假设3后半部分) 1.人力资本 2.市场化环境 本文是对王林辉老师的论文《工业智能化会重塑...
  • python垃圾回收机制

    千次阅读 多人点赞 2020-04-26 21:21:40
    文章目录一、引入二、堆区和栈区三、直接引用和循环引用四、垃圾回收机制原理分析五、引用计数、标记清除1、循环引用问题2、解决方案(标记清除)七、分代回收1、效率问题2、解决方案(分代回收) 一、引入 ​ ...
  • mysql的锁机制

    千次阅读 2022-04-05 17:39:58
    锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库...
  • 注意力机制最新综述解读

    万次阅读 多人点赞 2019-04-16 18:02:24
    调查提供了一个结构化和全面的概述关于attention的发展。我们回顾了注意力机制被纳入的不同的神经网络结构,并展示了注意力如何提高神经网络的可解释性。最后,我们讨论了在实际应用中,注意力机制取得的重要...
  • 文章目录浅析 IA-32 架构的分页机制和中断机制1 分页机制1.1 页目录(PDT)、页表(PT)和页1.2 页目录(PDE)和页表(PTE)1.3 地址变换1.3.1 访问页1.3.2 访问页目录1.3.3 访问页表1.3.4 为什么这么麻烦呢?...
  • 在这工作中,我们重点关注频谱分配机制。二级市场以缓解频谱短缺。在光谱中交易市场,我们假设二级用户将为使用量出价频谱:1)一些固定的时间间隔(即固定间隔),2)在特定时间范围内的一些连续时间间隔(例如,...
  • 缓存数据的淘汰机制 缓存满了怎么办
  • ,交易权益证明机制 网络上的每个事务可以可选地(可选)包含最近块的散列哈希。如果这样选择触发此项机制,那么交易的签署人可以在任何一个包含该交易的区块链中确信他们的交易。但这一过程的副作用是随着...
  • Android内存管理机制官方详解文档

    千次阅读 2020-12-09 12:40:54
    很早之前写过一篇《Android内存管理机制详解》点击量已7万+,现把Google官方文档整理输出一下,供各位参考。 一、内存管理概览 Android 运行时 (ART) 和 Dalvik 虚拟机使用分页和内存映射来管理内存。这意味着应用...
  • 北京华恒智信人力资源顾问有限公司【员工晋升机制】多渠道员工晋升机制如何建立引言:员工晋升机制是员工由较低层级职位上升到较高层级职位的过程,合理的员工晋升机制可以实现良好的资源配置,使合适的人做合适的事...
  • 注意力机制

    千次阅读 2020-02-16 23:18:16
    文章目录注意力机制注意力机制框架softmax的屏蔽超出二维矩阵的乘法点积注意力多层感知机注意力计算背景变量矢量化计算引入注意力机制的S2SDecoder 注意力机制 在“编码器—解码器(seq2seq)”⼀节⾥,解码器在各个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 419,748
精华内容 167,899
关键字:

六项机制