一次编写,处处运行算法
Java虚拟机是对操做系统的模拟,隔离差别编程
2018编程语言排行榜多线程
一个复杂的构架并发
虚拟机的内部概念编程语言
编译器,解释器执行流程工具
内存分配-线程模型spa
栈帧模型操作系统
内存分配-堆区线程
堆内存分配3d
收集器
1.Serial GC。单线程,全部的线程暂停。通常用于Client模式的JVM中。
2.ParNew GC。是在SerialGC的基础上,增长了多线程机制。
3.Parrallel Scavenge GC。吞吐量优先收集器,吞吐量=程序运行时间/(JVM执行回收的时间+程序运行时间), 运行100分钟,GC占用1分钟,吞吐量=99%。server模式JVM默认配置。
4.ParallelOld。老生代并行收集器的一种,使用了标记整理算法,是JDK1.6中引进的。
5.Serial Old,CMS收集器失败后的备用收集器。
6.CMS又称响应时间优先回收器,使用标记清除算法。他的回收线程数为(CPU核心数+3)/4,因此当CPU核心数为2时比较高效些。CMS分为4个过程:初始标记、并发标记、从新标记、并发清除。
肯定垃圾-引用计数法
肯定垃圾-可达性分析
GC算法
1 、标记- 清除(Mark-Sweep )算法
标记- 清除算法将垃圾回收分为两个阶段:
1.标记阶段:首先标记出全部须要回收的对象。
2.清除阶段:标记完成后,统一回收被标记的对象
缺点:
3.效率问题:标记清除过程效率都不高。
4.空间问题:标记清除以后会产生大量的不连续的内存碎片( 空间碎片太多可能会致使之后在程序运行过程当中须要分配较大的对象时,没法找到足够的连续的内存空间而不得不提早触发另外一次垃圾收集动做。)
2 、复制(Copying )算法
2.1. 算法思想:
1).将现有的内存空间分为两块,每次只使用一块.
2).当其中一块用完的时候,就将还存活的对象复制到另一块上去。
3).再把已使用过的内存空间一次清理掉。
2.2. 优势:
1).因为是每次都对整个半区进行内存回收,内存分配时没必要考虑内存碎片问题。
2).只要移动堆顶指针,按顺序分配内存便可,实现简单,运行高效。
2.3. 缺点:
1).内存减小为原来的一半,太浪费了。
2).对象存活率较高的时候就要执行较多的复制操做,效率变低。
3).若是不使用50%的对分策略,老年代须要考虑的空间担保策略。
3 、标记- 整理(Mark-Compact )算法
1).标记阶段:首先标记出全部须要回收的对象。与“标记-清除”同样
2).让存活的对象向内存的一段移动。而不跟“标记-清除”直接对可回收对象进行清理
3).再清理掉边界之外的内存。因为老年代存活率高,没有额外内存对老年代进行空间担保,那么老年代只能采用标记-清理算法或者标记整理算法。
4 、分代收集算法
以上三种算法的综合
在新生代中,每次垃圾收集时都发现有大批对象死去,只有少许存活,选用:复制算法
在老年代中由于对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清除”或者“标记-整理”算法来进行回收。
一些工具
•jps
•jmap
•Jstat
•Jvisualvm: window下启动远程监控,并在被
监控服务端,启动jstatd服务。
-jmap
Mark Sweep Compact GC Heap Configuration: #堆内存初始化配置 MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率 MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率 MaxHeapSize = 100663296 (96.0MB) #-XX:MaxHeapSize=设置JVM堆的最大大小 NewSize = 1048576 (1.0MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小 MaxNewSize = 4294901760 (4095.9375MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小 OldSize = 4194304 (4.0MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小 NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率 SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 PermSize = 12582912 (12.0MB) #-XX:PermSize=<value>:设置JVM堆的‘持久代’的初始大小 MaxPermSize = 67108864 (64.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘持久代’的最大大小 Heap Usage: New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含伊甸园区+1个Survivor区 capacity = 30212096 (28.8125MB) used = 27103784 (25.848182678222656MB) free = 3108312 (2.9643173217773438MB) 89.71169693092462% used Eden Space: #Eden区内存分布 capacity = 26869760 (25.625MB) used = 26869760 (25.625MB) free = 0 (0.0MB) 100.0% used From Space: #其中一个Survivor区的内存分布 capacity = 3342336 (3.1875MB) used = 234024 (0.22318267822265625MB) free = 3108312 (2.9643173217773438MB) 7.001809512867647% used To Space: #另外一个Survivor区的内存分布 capacity = 3342336 (3.1875MB) used = 0 (0.0MB) free = 3342336 (3.1875MB) 0.0% used tenured generation: #当前的Old区内存分布 capacity = 67108864 (64.0MB) used = 67108816 (63.99995422363281MB) free = 48 (4.57763671875E-5MB) 99.99992847442627% used Perm Generation: #当前的 “持久代” 内存分布 capacity = 14417920 (13.75MB) used = 14339216 (13.674942016601562MB) free = 78704 (0.0750579833984375MB) 99.45412375710227% used