1.垃圾收集算法的核心思想
Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。
垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能,因此需要开发人员做比较深入的了解。
2.触发主GC(Garbage Collector)的条件
JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:
①当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。
②Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。
由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。
3.减少GC开销的措施
根据上述GC的机制,程序的运行会直接影响系统环境的变化,从而影响GC的触发。若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面:
(1)不要显式调用System.gc()
此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。
(2)尽量减少临时对象的使用
临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。
(3)对象不用时最好显式置为Null
一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。
(4)尽量使用StringBuffer,而不用String来累加字符串(详见blog另一篇文章JAVA中String与StringBuffer)
由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如 Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer 是可变长的,它在原有基础上进行扩增,不会产生中间对象。
(5)能用基本类型如Int,Long,就不用Integer,Long对象
基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。
(6)尽量少用静态对象变量
静态变量属于全局变量,不会被GC回收,它们会一直占用内存。
(7)分散对象创建或删除的时间
集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片, 从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC 的机会。
摘自:http://blog.csdn.net/bocaicbl/archive/2010/02/23/5319915.aspx
-------------------------------------------------------------
趁着今天写程序的热乎劲儿,小谈一下System.gc()这个神秘的东东~
很多人把Java的“效率低下”归咎于不能自由管理内存,但我们也知道将内存管理封装起来的好处,这里就不赘述。
Java中的内存分配是随着new一个新的对象来实现的,这个很简单,而且也还是有一些可以“改进”内存回收的机制的,其中最显眼的就是这个System.gc()函数。
乍一看这个函数似乎是可以进行垃圾回收的,可事实并不是那么简单。
其实这个gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。但是它不能保证垃圾回收一定会进行,而且具体什么时候进行是取决于具体的虚拟机的,不同的虚拟机有不同的对策。
那么下一个问题就是:gc()进行回收的准则是什么?也就是说什么样的对象可以被回收?
简单来说就是:没有被任何可达变量指向的对象。这里的可达是我发明的……意思就是能够找到的,那什么样的是不可达的呢?
比如说:
a.v = b;
b.v = c;
/*
*Watch out !
*/
a.v = d;
看一下这段代码:
第一行:对象a的变量v指向了对象b
第二行:对象b的变量v指向了对象c
第六行:对象a的变量v指向了变量d。
这个时候,虽然变量c指向的对象有c 以及b.v指向它,但是它们都已经不可达了,为什么?因为唯一可以找到它们的是a.v,但是现在a.v指向了d,所以他们就是不可达的了。
理由也很直观:没有任何可达变量指向你,你还有活下去的理由吗?你就算活下去谁能找得到你呢?
所以说,C++中将释放了的指针置为null的习惯要保留到Java中,因为这有可能是你释放内存的唯一途径。
最后的箴言:不要频繁使用gc函数。
我的建议是:保持代码健壮(记得将不用的变量置为null),让虚拟机去管理内存。
摘自:
相关推荐
这个改动对字符串的内存管理产生了显著的影响,因为它使得常量池内的对象可以被垃圾收集器(GC)回收。 【字符串常量池的创建与使用】 创建字符串常量的方式有很多种,每种方式在内存中的表现形式也不同: 1. ...
- 当所有对象被垃圾收集时自动调用(如`System.gc()`) - 程序退出时为每个对象调用一次`finalize()`方法 - 显式调用`finalize()`方法 3. 二次标记过程:为了避免因`finalize()`导致的误回收,虚拟机执行了两次...
电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。
内容概要:本文详细介绍了将西门子SMART系列PLC与得利捷GD4430扫码枪进行通讯连接的具体方法和技术要点。首先阐述了硬件连接部分,强调了232转485模块作为关键中介的作用以及正确的接线方式。接着深入探讨了PLC端口初始化配置,包括波特率、数据位等重要参数设定,并提供了具体的初始化代码示例。对于数据接收处理方面,则采用中断驱动的方式,利用循环队列避免数据冲突,同时加入了超时机制和数据校验措施以提高可靠性。此外,还提到了触摸屏上的数据显示逻辑及其优化技巧。最后分享了一些实用的经验教训,如扫码枪供电稳定性、抗电磁干扰措施等。 适用人群:从事工业自动化领域的工程师和技术人员,特别是那些需要解决PLC与外部设备(如扫码枪)通讯问题的专业人士。 使用场景及目标:适用于各类制造业生产环境中,旨在帮助技术人员建立稳定可靠的扫码系统,从而提升工作效率和准确性。具体应用场景包括但不限于仓库管理、产品追溯等领域。 其他说明:文中不仅提供了详细的理论指导,还有丰富的实战经验和故障排查建议,能够为读者提供全面的支持。
内容概要:本文深入探讨了逆合成孔径雷达(ISAR)成像技术,从基本原理到具体实现进行了全面介绍。ISAR成像通过雷达回波信号生成高分辨率的目标图像,涉及信号生成、回波模拟、信号处理(如匹配滤波、距离压缩、方位压缩)以及图像生成等多个步骤。文中提供了详细的Python代码示例,帮助读者理解各个阶段的具体实现。此外,文章还讨论了ISAR成像面临的挑战,如运动补偿、噪声处理和高分辨率成像。 适合人群:对雷达技术和信号处理感兴趣的科研人员、工程师及高校学生。 使用场景及目标:适用于希望深入了解ISAR成像技术及其应用场景的研究人员和技术爱好者。通过学习本文,读者可以掌握ISAR成像的基本原理和实现方法,为进一步研究打下坚实的基础。 其他说明:文章不仅介绍了理论知识,还通过具体的代码实例展示了ISAR成像的实际操作过程,使读者能够在实践中更好地理解和应用相关技术。
内容概要:本文详细介绍了利用COMSOL进行边坡降雨入渗数值模拟的方法,特别是针对流量-压力混合边界条件的应用。首先讨论了几何建模的最佳实践,如使用AutoCAD绘制并导入DXF文件,确保边坡角度和高度符合实际工程场景。接着深入探讨了混合边界条件的核心控制方程及其在COMSOL中的具体实现方式,强调了根据降雨强度动态切换边界类型的必要性和实现细节。文中还提供了关于计算收敛性的宝贵经验和技巧,包括初始条件的选择、时间步长的设定以及网格划分策略。此外,作者分享了后处理阶段的数据可视化方法,展示了不同降雨强度下边坡渗流场的变化特性,并解释了一些反直觉的现象,如特大暴雨时边坡底部可能出现负压区。 适合人群:从事岩土工程、环境科学及相关领域的研究人员和技术人员,尤其是那些希望深入了解边坡稳定性分析和数值模拟的人群。 使用场景及目标:适用于需要评估边坡在不同降雨条件下稳定性的项目,帮助预测潜在滑坡风险,优化防灾减灾措施的设计。通过掌握混合边界条件的处理方法,提高模拟精度,更好地理解和预测边坡行为。 其他说明:文中提供的代码片段和实践经验对于初学者来说非常有价值,能够显著减少建模过程中常见的错误和技术难题。同时,所介绍的技术手段不仅限于COMSOL软件,相关理念也可应用于其他类似的数值模拟工具。
链排工作台组装(sw23可编辑+工程图)_三维3D设计图纸_三维3D设计图纸.zip
法西测试机sw20可编辑_三维3D设计图纸_三维3D设计图纸.zip
电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。
《土木工程地质》作业与思考题.docx
小阀体自动平面机机sw18可编辑_三维3D设计图纸_三维3D设计图纸.zip
使用sdl3 播放pcm文件
卷料回转库sw20可编辑_三维3D设计图纸_三维3D设计图纸.zip
校园无线一体化方案 -黑龙江大学全光校园网络建设方案.docx
内容概要:本文详细探讨了基于半车悬架模型的不同控制策略对车辆行驶平顺性的仿真研究。首先介绍了半车悬架模型的基本构成及其动力学方程,随后比较了PID控制、反步控制和模糊控制三种方法在不同路面条件下的表现。PID控制虽然简单易实现但在复杂路况下效果不佳;反步控制理论上更为严谨,但计算量较大;模糊控制则表现出较强的抗干扰能力和灵活性。实验结果显示,在随机路面条件下,模糊控制在2-4Hz频段的抑制效果比PID提升了约40%,而在高频段反步控制仍存在小幅震荡。此外,文中还讨论了主动悬架作动器的最佳响应频率范围以及控制策略对俯仰角加速度的影响。 适合人群:汽车工程专业学生、从事车辆控制系统设计的研究人员和技术人员。 使用场景及目标:适用于需要优化车辆悬挂系统性能的设计阶段,旨在提高车辆行驶舒适性和稳定性。通过对不同控制策略的仿真研究,帮助工程师选择最适合特定应用场景的控制方法。 其他说明:文中提供了详细的数学模型和MATLAB/Simulink代码片段,便于读者理解和复现相关实验。同时强调了实际应用中需要注意的问题,如传感器噪声对控制效果的影响等。
电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。
内容概要:本文探讨了在离网状态下,利用粒子群算法优化风光储系统的容量配置。通过引入蓄电池与超级电容的混合储能方式,以全生命周期费用最小化为目标,确保缺电功率低于负荷的5%。文中详细介绍了超级电容和蓄电池的分工合作机制,以及如何通过动态调整惯性权重提高算法收敛速度。此外,还讨论了目标函数的设计,包括成本模型和约束条件的处理方法,并展示了实验结果及其经济效益。 适用人群:从事新能源系统设计、优化的研究人员和技术人员,尤其是关注离网风光储系统的人士。 使用场景及目标:适用于需要优化离网风光储系统容量配置的实际工程项目,旨在降低系统全生命周期成本并确保供电稳定性。具体目标包括减少缺电率、优化储能设备配置比例、提高系统经济性和可靠性。 其他说明:文中提到的技术细节如动态惯性权重调整、非线性递减曲线的应用等,对于理解和改进粒子群算法具有重要价值。同时,提供的代码片段有助于读者更好地理解算法的具体实现过程。
R300-点锡设备sw16可编辑_包括零件图_机械3D图可修改打包下载_三维3D设计图纸.zip
数据说明: 反欺骗数据集包括来自世界各地的实时录制反欺骗视频,通过全高清及以上分辨率的高质量网络摄像头捕捉。这些视频是通过捕捉展示欺骗的真实个人的面部,使用面部展示来收集的。该数据集提出了一种新颖的方法,可以学习和检测欺骗技术,从真实的面部图像中提取特征,以防止虚假用户捕获此类信息。 该数据集包含真实人类的图像和视频11个,具有各种视角和颜色,使其成为研究反欺骗技术的研究人员的综合资源。
(论文)土木工程施工中混凝土施工技术研究.docx