Spring的传播行为确定了客户端和被调用端的事务边界,简单来说就是多个具有事务控制的Service的相互调用时所形成的复杂的事务边界控制。Spring定义了7种传播行为:
提到并发标记,我们不得不了解并发标记的三色标记算法。它是描述追踪式回收器的一种有用的方法,利用它可以推演回收器的正确性。
将对象分为三种类型:
当GC开始扫描对象时,则会按照如下图步骤进行对象的扫描:
对象标记过程
1、根对象被置为黑色,子对象被置为灰色。
2、继续由灰色遍历,将已扫描了子对象的对象置为黑色。
3、遍历了所有可达的对象后,所有可达的对象都变成了黑色。不可达的对象即为白色,需要被清理。
在这过程中会造成对象丢失,解决办法如下:
1、插入时候记录对象
2、删除时候记录对象
增量更新: 在CMS采用的是增量更新(Incremental update),只要在写屏障(write barrier)里发现要有一个白对象的引用被赋值到一个黑对象 的字段里,那就把这个白对象变成灰色的。即插入的时候记录下来。
STAB:在G1中,使用的是STAB(snapshot-at-the-beginning)的方式,删除的时候记录所有的对象,它有3个步骤:
这样G1到现在可以知道哪些老的分区可回收垃圾最多。 当全局并发标记完成后,在某个时刻,就开始了Mix GC.
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。
用户运行一个程序,该程序创建的进程开始时运行自己的代码,处于用户态。如果要执行文件操作、网络数据发送等操作必须通过write、send等系统调用,这些系统调用会调用内核的代码。进程会切换到Ring0,然后进入3G-4G中的内核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换到Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程地址空间中的数据。
可中断的G1
如果G1混合集合可能超过暂停目标则会使其终止。
如果G1发现启发式的收集重复的选择错误的区域数及收集预测不准确的时候会切换到更复杂的方式来执行收集;将需收集的内容拆分成两个部分:强制部分和可选部分。强制性部分包括G1不能逐步收集处理的部分(如年轻代),但是可以包含老年代以此提高效率。例如强制部分可是预测的收集部分的80%,剩余的20%(仅仅由老年代组成)构成可选部分。
G1完成强制部分的收集后如果还有剩余时间。G1会以更加细粒度的级别开始收集可选部分。此可选部分的收集粒度取决于剩余的时间量,一次最多只能到一个区域。完成对可选部分的收集后G1可根据剩余时间决定停止集合。
随着收集预测再次变得准确可选部分越来越小,直到强制部分再次包含所有收集部分(即G1完全依赖于其启发式)。如果预测再次变得不准确则下一个集合将再次包含强制和可选部分。
通过G1更及时的返回未使用的内存。
增强G1垃圾收集器。以便在空闲时候自动将java堆内存返回给操作系统。
为了实现向操作系统返回最大内存量的目标,G1将在应用程序不活动期间定期尝试或触发并发周期以确定整体Java堆使用情况。这将导致它自动将Java堆的未使用部分返回给操作系统。同时用户可主动选择Full GC从而最大化的返回未使用内存。