垃圾收集器与内存分配策略

内存分配策略

对象的内存分配就是在堆上分配(有些在栈上分配: JIT编译,逃逸分析技术),在堆上对象又主要在新生代的Eden上,如果启动了本地线程缓冲,将按线程优先在TLAB上分配。少数会直接分配在老年代中。具体由垃圾收集器组合与虚拟机参数决定。

 

垃圾收集器 Serial / Serial Old (ParNew / Serial Old) 组合下:

1.普通对象

 

2.大对象直接老年代

如:长字符串,长数组。由于Java对象大都 “朝生夕灭” 所以新生代GC 非常频繁,而且速度快。 老年代GC频率要少,效率慢10倍以上。大对象对虚拟机是个坏消息。

 

3.长期存活对象进入老年区

为了适应不同的内存状况,对象不一定年龄达到最大值才能进入老年代。如果在Survivor空间中相同年龄的对象大小的总和大于Survivor大小的一半,那么其它年龄大于这些对象的可以直接进入老年代。

 

3.空间分配担保

当Eden区发生Minor GC后仍有大量对象存活,而Survivor区无法全部放下,此时就需要老年代进行分配担保。虚拟机先检查老年代持续空间是否足够,足够则安全分配,不够则看配置是否允许分配担保失败,不允许则执行Full GC。允许则检查最大持续空间是否大于历次晋升到老年代对象的平均大小,大于则Minor GC(有风险),小于Full GC.

 

垃圾收集器

 

不同虚拟机GC日志输出不一样,在eclipse配置 Run a Java Application 如下图:

public class HeapOOM {
	static class OOMObject{
		
	}
	public static void main(String[] args) {
		
	    	List<OOMObject> list = new ArrayList<OOMObject>();
			System.gc();
			while(true) {
			 list.add(new OOMObject());	
			}
	}

}

1.运行日志为

 

  • GC / Full GC :代表 不停止java工作线程 / 停止java工作线程。

  • (. . . . . .) : Allocation Failure 分配担保时出错。

  • [ PsYougGen. . . . . ] : [ 收集器+新生代/老年代 :GC前该内存区已使用量 —>GC后该内存区已使用量(该内存区总量),GC花费时间 ]  。

  • [  ] 后面 GC前java堆已使用容量 —> GC后Java堆已使用容量(java堆已使用容量)。

  • [Times : 用户态消耗cpu时间 , 内核态消耗cpu时间 ,Wall Clock Time ]。

 

2.垃圾收集算法

  • 标记清除算法:  缺点 1.标记与清除效率不高;2.产出大量碎片内存。

  • 复制算法:内存分割成两块,第一块内存用完了,将还存活的对象复制到第二块,然后清除第一块。高效,内存开销大。

  • 标记整理算法:先将存活的对象向一端移动,然后清除未存活的对象。

  • 分代收集:新生代,老年代。

 

3.垃圾收集器

  • Serial : 作用新生代,单线程,复制算法,需要停止Java工作线程。

  • Serial Old :作用于老年代,单线程,标记整理算法,需要停止Java工作线程。

  • ParNew :Serial的多线程版本,其他与Serial一样。

  • Parallel Scavenge :作用新生代,复制算法,并行多线程,可控吞吐量 吞吐量 = 运行用户代码时间  / (运行用户代码时间+垃圾收集时间)。 高吞吐量 可以高效率利用cpu时间,尽快完成程序运算任务,适合后台运算而不需要太多交互的任务。

  • Parallel Old :作用老年代,标记整理算法,多线程。

  • CMS :作用老年代,并发收集,低停顿。以最短回收停顿时间为目的。1.初始标记;2.并发标记;3.重新标记;4.并发清除。1和3 需要停止java工作线程。2阶段进行GC Roots Tracing。3阶段修正并发标记时因用户程序继续运行而产生标记变动的对象的标记。

  • G1 : 作用新生代和老年代,面向服务端应用,并发与并行,分代收集,空间整合,可预测停顿。运行步骤:1.初始标记;2并发标记;3最终标记;4刷选回收。

 

基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值