资讯详情

基于weber的齿轮啮合刚度计算

【实例简介】

%注意刚度的使用。k=F/delta,而不是用k=F/(B*delta)。 %数据来源:多个参考文献 %采用方法:Webster方法(材料力学) 两者都是外齿轮啮合 %原理参考机械原理P184和P185

文件:590m.com/f/25127180-490658798-0ea727(访问密码:551685

以下内容无关:

-------------------------------------------分割线---------------------------------------------

分代收集理论 理论支撑: 弱分代假说(Weak Generational Hypothesis):绝大多数对象朝生夕灭。 强分代假说(Strong Generational Hypothesis):垃圾收集过程越多,死亡的对象就越困难。 跨代引用假说(Intergenerational Reference Hypothesis):与同代引用相比,跨代引用只占少数。 跨代引用假说的具体解决办法是:在新生代上建立一个全局的数据结构(该结构被称为“记忆集”,Remembered Set),这种结构将老年人划分为几个小块,标志着老年人的哪个内存会被跨代引用。从那时起Minor GC只有包含跨代引用的小块内存中的对象才会被添加到GC Roots进行扫描。

各种收集名称 部分收集(Partial GC):目标不是完全收集整个目标Java堆放的垃圾收集分为: 新生代收集(Minor GC/Young GC):目标只是新一代垃圾收集。 老年代收集(Major GC/Old GC):目标只是收集老年垃圾。目前只有CMS收集器将分别收集老年行为。此外,请注意Major GC这种说法现在有点混乱,不同的数据往往有不同的意思。读者需要根据上下文来区分是指老年人的收藏还是整堆收藏。 混合收集(Mixed GC):目标是收集整个新生代和一些老年人的垃圾。目前只有G收集器会有这种行为。 整堆收集(Full GC):收集整个Java垃圾收集堆和方法区。

标记-清除算法 算法分为标记和清除两个阶段:首先,标记所有需要回收的对象,并在标记完成后统一回收所有标记的对象。标记过程是判断对象是否属于垃圾的过程。它是最基本的收集算法,后续的收集算法主要是基于标记清除算法来改进其缺点。 它有两个主要缺点: 一是执行效率不稳定。Java堆中包含大量物体,其中大部分需要回收。此时,必须进行大量的标记和清除,导致标记和清除过程的执行效率随着物体数量的增加而降低; 二是内存空间的碎片化。标记和清除后,会产生大量不连续的内存碎片。过多的空间碎片可能会导致另一个垃圾收集动作,当未来需要在程序运行过程中分配大对象时,无法找到足够的连续内存。

标记-复制算法 为了解决标记清除算法在面对大量可回收对象时执行效率低的问题,将可用内存按容量分为两部分,每次只使用一部分。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。每次都是为了回收整个半区域的内存,在分配内存时,只要移动堆顶指针,就不需要考虑空间碎片的复杂性。 这种复制回收算法的成本是将可用内存缩小到原始内存的一半。 现在的商用Java大多数虚拟机优先使用这种收集算法来回收新一代。由于98%的新生代对象无法忍受第一轮收集,当然,新生代内存空间的实际实现不是1:1。而是使用“Appel类型回收,具体做法是将新一代分更大的一部分Eden空间和两块较小 Survivor每次只使用空间分配内存Eden和其中一块Survivor。收集垃圾时,将Eden和Survivor仍然存活在的对象一次复制到另一块Survivor在空间上,然后直接清理Eden还有用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor大小比例为8∶1.也就是说,每个新生代的内存空间是整个新生代容量的90%(Eden80%加一个Survivor10%),只有一个Survivor空间,也就是说,10%的新浪费。当Survivor空间不足以容纳一次Minor GC之后存活的对象需要依靠其他内存区域(其实大部分都是老年人)来分配担保(Handle Promotion),这些对象将通过分配担保机制直接进入老年。

标记-整理算法 当对象存活率较高时,需要进行更多的复制操作,效率会降低。更重要的是,如果你不想浪费50%的空间,你需要有额外的空间来分配担保,以应对被使用内存中所有对象100%存活的极端情况。因此,在老年人中,不能直接选择标记-复制算法。 另一种针对老年对象的生存特征的标记-整体 理”(Mark-Compact)算法,其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。 如果移动生存对象,特别是在老年,每次回收都有大量的对象生存区域,移动生存对象和更新所有引用这些对象将是一个非常重的操作,对象移动操作必须暂停用户应用程序,这使得用户必须仔细权衡其缺点,最初的虚拟机设计师生动地将这样的停顿描述为Stop The World”。 移动对象是否有缺点,移动时内存回收会更复杂,不移动时内存分配会更复杂。从垃圾收集的停顿时间来看,非移动对象的停顿时间会更短,甚至不需要停顿,但从整个程序的吞吐量来看,移动对象会更具成本效益。HotSpot关注虚拟机吞吐量的虚拟机Parallel Scavenge收集器以标记整理算法为基础,注意延迟CMS基于标记-清除算法的收集器。 CMS当内存空间的碎片化程度大到影响对象分配时,收集器也会采用标记-整理算法收集一次,以获得规则的内存空间。

根节点枚举 固定可作为GC Roots节点主要在引用(如常量或类静态属性)和执行上下文(如栈帧中的本地变量表)中,虽然目标明确,但现在Java应用越来越大,方法区的大小往往是几百千兆,其中的类别和常量是恒河沙数。在搜索过程中高效并不容易。到目前为止,所有节点枚举这一步骤时,所有收集器都必须暂停用户线程。这里的一致性意味着执行子系统在整个枚举期间看起来像冻结在某个时间点,不会出现在分析过程中,根节点对象引用关系仍在变化,如果这不能满足,分析结果的准确性就不能保证。 主流Java虚拟机是准确的垃圾收集,所以不需要检查执行上下文和全局的所有参考位置。在HotSpot 在解决方案中,使用一组称为OopMap实现这一目标的数据结构。OopMap 记录了栈上本地变量与寄存器对堆上对象的引用关系。它的功能是:只要收集器扫描这些OopMap你可以直接知道这些GC Roots,不需要真正从执行上下文等方面不漏GC Roots开始查找。

安全点 在OopMap的协助下,HotSpot能快速准确地完成GC Roots然而,枚举可能会导致引用关系的变化或OopMap内容变化的指令很多,如果每个指令都生成相应的指令OopMap,它将需要大量的额外存储空间。HotSpot只记录在特定位置 这些信息被称为安全点(Safep oint)。安全点的设置决定了用户程序的执行 并不是说垃圾收集可以在代码指令流的任何位置停止,而是强制要求在达到安全点后停止。 因此,安全点的选择不能太少,使收集器等待时间过长,也不能太频繁,以至于在运行过程中过度增加内存负荷。安全点位置的选择基本上是基于程序是否具有长期执行的特点,由于每个指令执行时间很短,程序不太可能长期执行,因此长期执行最明显的特点是指令序列的重用,如方法调用、循环跳转、异常跳转等属于指令序列重用,因此,只有具有这些功能的指令才能产生安全点。(实际上,所有的创建对象和其他需要添加Java堆放内存分配的地方,检查垃圾收集是否即将发生,避免内存分配对象不足) 那么,当垃圾收集发生时,如何让所有线程跑到最近的安全点,然后停止呢。有两种选择:第一次中断 (Preemptive Suspension)和主动式中断(Voluntary Suspension)。 第一次中断不需要线程执行代码积极配合,当垃圾收集发生时,系统首先中断所有用户线程,如果发现用户线程中断不在安全点,恢复线程执行,让它中断一段时间,直到运行到安全点。现在几乎没有虚拟机使用第一次中断来暂停线程响应GC事件。 主动中断的想法是,当垃圾收集需要中断线程时,不要直接操作线程,只要设置一个标志位置,每个线程执行过程将继续主动轮流查询标志,一旦发现中断标志是真实的,主动中断挂在最近的安全点。轮流查询标志的位置与安全点重叠。

安全区域 安全点机制保证了程序的实施,在不太长的时间内就会遇到可以进入垃圾收集过程的安全点。但如果程序没有执行,例如处理器时间没有分配,典型的场景是用户线程Sleep 状态或者Blocked状态,此时线程不能响应虚拟机的中断要求,不能去安全点中断自己,虚拟机显然不可能等待线程重新激活分配处理器时间。在这种情况下,必须引入安全区(Safe Region)来解决。 安全区域是指可以确保引用关系不会改变,因此在该区域的任何地方开始垃圾收集是安全的。我们也可以将安全区域视为扩展和拉伸的安全点。 当用户线程执行到安全区域的代码时,他们首先会识别自己已经进入安全区域,因此当虚拟机在此期间启动垃圾收集时,他们不必关心声明自己在安全区域的线程。当线程离开安全区域时,检查虚拟机是否已完成根节点列举(或垃圾收集过程中其他需要暂停用户线程的阶段)。如果完成,线程将被视为无事可做,并继续执行;否则,它必须等待,直到收到离开安全区域的信号。

记集与卡表(卡表是记忆集的一种实现方式) 记忆集是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。 解决对象跨代引用所带来的问题,垃圾收集器在新生代中建立了名为记忆集(Remembered Set)的数据结构,用以避免把整个老年代加进GC Roots扫描范围。而在垃圾 收集的场景中,收集器只需要通过记忆集判断出某一块非收集区域是否存在有指向了收集区域的指针 就可以了,并不需要了解这些跨代指针的全部细节。那设计者在实现记忆集的时候,便可以选择更为粗犷的记录粒度来节省记忆集的存储和维护成本。 一种称为“卡表”(Card Table)的方式去实现记忆集,这也是目前最常用的一种记忆集实现形式,HotSpot虚拟机的卡表只是一个字节数组,字节数组CARD_TABLE的每一个元素都对应着其标识的内存区域中一块特定大小的内存块,这个内存块被称作“卡页”(Card Page)。一般来说,卡页大小都是以2的N次幂的字节数,HotSpot中使用的卡页是2的9次幂,即512字节。一个卡页的内存中通常包含不止一个对象,只要卡页内有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素的值标识为1,称为这个元素变脏(Dirty),没有则标识为0。在垃圾收集发生时,只要筛选出卡表中变脏的元素,就能轻易得出哪些卡页内存块中包含跨代指针,把它们加入GC Roots中一并扫描。

写屏障 卡表如何维护呢?如果是解释执行,虚拟机用充分的介入空间,但如果是编译执行呢?经过即时编译后的代码已经是纯粹机器指令流了,所以必须在机器码层面把卡表的维护动作放到每一次赋值操作中。 HotSpot通过写屏障技术维护卡表状态。写屏障可以看作在虚拟机层面对“引用类型字段赋值”这个动作的AOP切面,在引用对象赋值时会产生一个环形(Around)通知,供程序执行额外的动作,也就是说赋值的前后都在写屏障的覆盖范畴内。在赋值前的部分的写屏障叫作写前屏障(Pre-Write Barrier),在赋值后的则叫作写后屏障(Post-Write Barrier)。 当然额外的环形增强来维护卡表会有性能开销,但相比扫描整个非收集代的代价相比还是低很多。 此外卡表维护还会面临多线程并发的伪共享,为了减少伪共享带来的性能损失,虚拟机会判断只有卡表元素未脏的情况下才去更新此卡表元素。可以通过UseCondCardMark参数开启这一判断,默认是关闭的。

标签: weber传感器captor

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台