APP下载

JAVA程序内存低效使用问题的分析核心要点构架

2020-10-21刘红

科学与财富 2020年8期
关键词:Java语言分析

刘红

摘 要:JAVA语言拥有广泛的应用空间,由于技术成熟,上手简单效果稳定因此在很多程序开发中都选用JAVA语言开发程序。经过数代的更迭,其程序的完整性和拓展性得到了大大的提升,但纵观JAVA语言程序发展的过程,其内存的低效使用一直是导致其性能无法突破瓶颈的重要影响因素,本文结合作者实际的工作经验,对空闲空间、泄露空间、蚍蜉空间三类导致内存失效的情况进行分开介绍和分析希望能够帮助更多的程序开发者和从业人员能够更加全面深刻的了解造成JAVA语言程序内存低效的因素。

关键词:JAVA语言;内存低效;分析

1.JAVA语言概述

JAVA语言由于其平台独立性和面向普通消费者的特点,成为了使用最为广泛的编程语言之一,在大量的个人程序网站都占据重要的份额。JAVA语言编制成字码节后在JAVA虚拟机上进行运行,其内存回收工作由JVM提供的垃圾回收站完成。由于回收站的工作是自动进行的,所以程序员无需管理垃圾回收,减轻了程序员的精力,分散情况。很多人对Java内存回收缺乏认识,认为其通过自动垃圾回收处理的过程不会出现问题,事实上java也会存在内存泄漏的情况及有部分存在价值的对象无法被回收,而这些对象自身所占据的内存空间也无法得到释放和循环使用,导致一部分内存空间被占用。当这种情况持续累积下去,当gym无法再重新申请到足够的内存空间时,系统就会崩溃告警,对于一些大规模的应用程序,特别是持续时间长,需要提供关键服务的server端程序,这种崩溃即使持续时间短,也会对其服务质量和管理造成致命打击,因此是要严格杜绝这种情况出现。使用Java语言进行程序编程时,首先要对这个内在机理有明确的认识,只有在此基础上才能够有效规避内存低效使用的情况。

2.Java程序的内存低效使用

2.1泄露对象、蚍蜉对象、空闲对象

在使用Java语言进行程序编程时很多内存空间的应用是不定量的,需根据当时编译情况确定,由于变量的存在属于内存空间,需要强制一部分空闲空间用于,在高内存占用情况下予以空间填补。但如果是机械化的保留一定比例或固定容量的空间,又会使得内存容量受到限制,有时会产生内存空间被浪费的情况,因此需要在程序运行过程中采取动态分配的方式,让其在不需要提前预留空余空间时被释放出来,以提高可使用空间的总容量。Java语言内存机制的特点就是其内存回收工作完全是由jym提供的垃圾收集器自动进行的,这个过程无法进行人为的干预,所以如果gym垃圾处理程序自身出现了内存占用过多或内存使用不合理的情况,在外部机制下是无法对其进行控制的,所以也会给内存释放造成一定的困难。

Java语言编程的程序存在大量生存期较短的临时对象或者一次性对象,这些对象一般是未完成某程序运行,环境所添加的一次性产物,这些对象在后期使用中没有任何使用价值,理论上应该在使用之后就自动剔除,让出多余的内存空间,但是现实往往是这些对象长期存在占用大量的内存,导致GC频繁启动,消耗了大量的程序反应时间。编程人员一般将其称之为蚍蜉对象,这些对象在实际应用中用处极少,但是其存在所占有的内存空间却是长时间的,对于整个程序运作的内存动态管理会造成很大的困难。另一种情况是对象被分配后长时间处于空闲状态,而又没有相应的机制,对这种长期处于空闲状态的对象进行管理,导致其也许整个生命周期的使用场景只有很短的时间,而这类对象最后会被GC回收,但从分配到被回收之间需要很长的周期,90%以上的时间都处于不活动状态,所以这类事实上占据了内存空间,但是实际使用场景和比例极少的对象程序编程人员将其称之为空闲对象。这对象在处理的过程中前文所提及的蚍蜉对象有很多的相似之处。

2.2Java内存低效使用的影响

必须应用是需要一定的内存空间作为支持的,如果内存长期保持低效运用状态,那么可利用的内存容量就会被压缩,在程序运行过程中也许会瞬间用完内存空间导致gym所能申请的所有内存全部被使用完毕,导致jIm崩溃,另一种情况就是导致GC频繁回收,在回收过程中持续占用着机能,导致程序的运行效率受到了影响,通过对不同使用对象的处理和使用在内存低效上的对比,我们可以发现,Java程序对应泄漏对象时,泄漏对象不会对GC造成影响,但是会产生显著的空间效率影响和时间效率影响,但目前对其进行检测难度简单,但对其进行修正则需要花费大量的时间和资源。而蚍蜉对象其既能够改变GC同时对时间效率的影响很明显,但是在空间使用效率的影响方面却很轻微,目前对其进行检测的手段很多检测过程较为简单,同时修的难度也不大,空闲对象能够对GC产生影响,会对空间使用效率和时间使用效率都产生极大的影响,对其进行检测难度很大,同时对其进行处理的难度也很大。

通过对三种对象造成的影响进行对比,我们可以发现蚍蜉对象在GC启动之后就会被回收,所以来不及对空间效率造成太严重的影响,而泄露对象和空闲对象,则会由于持续占据内存,无法被循环利用,造成了空间效率的降低。但在实际的程序运行过程中蚍蜉对象的存在会导致回收机制频繁启动,这会造成时间效率的降低。而由于泄露对象和空闲对象会增加GC的检测时间,所以也在一定程度上降低了程序的时间效率。在检测修正的层面来分析,当gym关闭前,可以对泄漏对象进行检测,检测到的几率很大,而且由于其整体的检测难度较低,所以一般会保持很强的准确性。而泄露对象一般是由于自身的逻辑缺陷所造成的,所以对此类问题进行修正时,首先要对其行为逻辑进行分析,这就增加了修正的难度。蚍蜉对象一般是临时性出现的,所以通过在单位时间内对GC的活动频率进行检测,即可判断是否存在大量的相似對象,简单的对其进行创建位置进行修正,因此对其进行检测和修正的难度理论上来说都不大,对于空闲对象必须要对整个对象的生命周期的行为信息进行综合分析才能判断其活动其和空闲期所以对其进行检测数据化费的计算资源更多,所以用时更长而对其进行修正时,要考虑到对象的使用逻辑和行为逻辑,也要占用大量的资源和时间,所以对其进行修正的难度也很大。

3.当前的研究工作成果

很多的泄露对象都是在操作时被临时创建的,但是却在操作结束之后没有得到及时的回收,所以如果设定临时对象的期望生命周期和存货周期,如果其超过了期望生活周期,那么对象就是泄露对象,针对Java中的数组提出一个结合前项数据流分析和后项控制流分析的算法,就可以增加对此类对象的分析效率。

蚍蜉对象而生存周期较短,会引起频繁的GC启动,因此在进行程序检测时只要使用能够对GC程序启动敏感的程序就可以大概率的覆盖此类对象的所在区域。由于空闲对象的生存周期较长,对其进行检测需要符合更多方面的信息,所以对整个中其行为和对象活动都要进行检测,在目前看来还没有一个能够有效减少计算时间和资源的方式。

4.当前工作成效不足的原因分析

此前相关研究人员在进行对象研究时,对于泄露对象的研究方向集中在如何对其进行准确检测,在如何修正方面没有太多的资源投入,导致目前有效的解决方案数量较少,不能对空闲空间进行相应的修正和检测,多数工具都要用户对程序行为的实现具有基础了解,才能够发挥到工具的效果,我肯定会限制相应的工具普及和推广的速度和范围,同时也增加了更多的不确定性。

结束语:

虽然当前研究人员对一些可观察信息在一定程度上反映了对象行为和使用逻辑,禁行了行为勾勒,但是整个画像并不全面,如果想要对内存低效使用进行更加深入的检测和修正,就必须全面的对所有对象的行为逻辑和相应的产生信息进行覆盖,获取最全面的数据支持。

参考文献:

[1]柳永坡,贾晓霞,吴际, 等.Java程序内存低效使用问题的分析[J].计算机工程,2008,34(23):84-85,91. DOI:10.3969/j.issn.1000-3428.2008.23.031.

[2]李文杰.Java程序内存使用分析技术研究[D].江苏:中国矿业大学,2016.

[3]王志花.Java程序内存行为探究[J].硅谷,2012,(7):182-182,190.

猜你喜欢

Java语言分析
隐蔽失效适航要求符合性验证分析
电力系统不平衡分析
基于Android平台的健康医疗APP设计与开发
电力系统及其自动化发展趋势分析
计算机软件开发中的JAVA编程语言分析
用户隐私保护之手机密码保险箱
基于Java语言的手机软件开发技术分析
中西医结合治疗抑郁症100例分析
在线教育与MOOC的比较分析