并发产生的缘由是:“编译器和处理器”在程序执行时会对程序进行的重排序。html
重排序的缘由是:为了提升程序的并发度,从而提升性能!可是对于多线程程序,重排序可能会致使程序执行的结果不是咱们须要的结果!所以,就须要咱们经过“volatile,synchronize,锁等方式”做出正确的实现同步。java
http://www.cnblogs.com/skywang12345/p/3447546.html算法
内存案例多线程
https://mp.weixin.qq.com/s/aLMJkbRAgTDwYV8GO0psQg并发
CMS回收器性能
这个算法在两种状况下会进入一个”stop the world”的模式:spa
当进行根对象的初始标记的时候 (老生代中线程入口点或静态变量可达的那些对象)线程
以及当这个算法在并发运行的时候应用程序改变了堆的状态使得它不得不回去再次确认本身标记的对象都是正确的。设计
使用这个回收器最大的问题就是会碰到promotion failure,这是指在回收新生代及年老代时出现了竞争条件的状况。若是回收器须要将年轻的对象提高到年老代中,而这个时候年老代没有多余的空间了,它就只能先进行一次STW(Stop The World)的full GC了htm
另外一个缺点就是和并行回收器相比,它使用的CPU资源会更多,它使用了多个线程来执行扫描和回收,这样才能让应用持续提供更高级别的吞吐量。
堆小于4G,而你又但愿分配更多的CPU资源以免应用暂停,那么这就是你要选择的回收器。
G1回收器
若是堆大于4G的话,你可能更但愿使用最后的这个——G1回收器。
它的设计目标是能更好地支持大于4GB的堆。G1回收器将堆分为多个区域,大小从1MB到32MB不等,并使用多个后台线程来扫描它们。G1回收器会优先扫描那些包含垃圾最多的区域,这正是它的名字的由来(Garbage first)。这个回收器能够经过-XX:UseG1GC标记来启用。
这一策略减小了后台线程还未扫描完无用对象前堆就已经用光的可能性,而那种状况回收器就必须得暂停应用,这就会致使STW回收。G1的另外一个好处就是它老是会进行堆的压缩,而CMS回收器只有在full GC的时候才会干这事。
https://mp.weixin.qq.com/s/k2IOceZyYslj-50e78hg7A
http://www.liuhaihua.cn/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B