引自http://blog.csdn.net/axman/article/details/5591301
前段时间公司打造了自己的WEB开发框架新版,性能比以前的两个版有很大提高。在性能基准测试时,某个测试的业务场景为
18000个TPS左右。
但是后来增加了session序列化模块后,一下子下降低到6000个TPS左右,就是因为这个模块性能一下子降低三倍。
jvisualvm监视查看到其中的加密方法占用了47%的CPU处理时间,于是重点测试这个方法。
这个方法做了三件事。
1.加密,
2.压缩,
3.base64编码成可见字符
加密过程虽然消耗了一定的系统资源,但经百万次循环测试性能是可以接受的。
BASE64这个可以放心,测试过N次了。
于是测试压缩算法,单线程1万次循环时耗时在秒级,我想1百万次也就应该是两三分钟吧。
结果一跑以后,系统差点死掉,响应非常慢,看看后台非JAVA线程在十几秒内竟然一下子吃掉10G的内存,大量的磁盘交换产生。
不用说,肯定是有内存泄漏,生产系统中是因为采用CMS策略来进行GC的。因为不断进行回收,所以不会出现瞬间内存都被吃光的
情况。但是对于依赖finalize来做回收的情况,虽然对象最终会被回收,但利用率大大地打了下降了。
这是最简单的道理,就比如一个连接,在finalize中调用了close()方法,你即使不手工调用 close()方法它最后也被回收了,但它
利用率却下降低了好多倍,假设系统只允许1个连接,从产生到JVM回收它的过程是1秒,那么在1秒内如果你每次只使用100ms,然后手工close(),那么其它线程有9次机会重新产生连接,而如果利用finalize在1秒内只有一次使用机会,这还是因为CMS策略的GC,如果是
暂停式GC策略,利用率将打更大的折扣。
所以最终关注压缩的代码,其实只有三行:
DeflaterOutputStream dos = new DeflaterOutputStream(byteArrayOutputStream,new Deflater(Deflater.BEST_ COMPRESSION,false));
ObjectOutputStream out = new ObjectOutputStream (dos);
out.write(加密数据);
byte[] data = byteArrayOutputStream.toByteArray();
//close等收尾工作。
对于输出流这种常规操作,打造平台的大牛们不可能犯低级错误,而大量的内存泄漏应该和压缩参数无关,于是直接分析
Deflater类(因为之前大多数是直接使用GZipOutputStream,对Deflater类本身并不是很熟悉)。发现文档中有对于end方法的说明是:
end
public void end()
关闭解压缩器并放弃所有未处理的输入。此方法应该在不再使用该压缩器时调用,但是也可以由 finalize() 方法自动调用。调用此方法后,Deflater 对象的行为将是不确定的。
其实jdk自己的例子就给人一个误导:
- // Encode a String into bytes
- String inputString = "blahblahblah??";
- byte[] input = inputString.getBytes("UTF-8");
- // Compress the bytes
- byte[] output = new byte[100];
- Deflater compresser = new Deflater();
- compresser.setInput(input);
- compresser.finish();
- int compressedDataLength = compresser.deflate(output);
- // Decompress the bytes
- Inflater decompresser = new Inflater();
- decompresser.setInput(output, 0, compressedDataLength);
- byte[] result = new byte[100];
- int resultLength = decompresser.inflate(result);
- decompresser.end();
- // Decode the bytes into a String
- String outputString = new String(result, 0, resultLength, "UTF-8");
在这个例子中,压缩的代码并没有调用compresser.end,因为仅调用一次,最后肯定会在对象被回收时调用finalize来调用end();
这在偶尔调用一两次的情况下也没有大问题。
另外,对于DeflaterOutputStream构造方法中,如果你没有传入Deflater,它自己new了一个Deflater,并使用useDefaultDeflater标记来
在close()中调用Deflater的end(),但如果是你自己传入的Deflater,因为可能在外部会多次复用,本着谁生产谁负责的原则,它没有为你调用
end()。
凡是在finalize中调用方法说明一定要保证被回收,而在密集调情况下一定不能依赖finalize,上面已经说过道理。所以一定要在用完后立即调用它以“尽早地立即回收”。所以这里应该有一个手工调用的参与,于是修改为:
Deflater def = new Deflater(Deflater.BEST_ COMPRESSION,false);
DeflaterOutputStream dos = new DeflaterOutputStream(byteArrayOutputStream,def);
ObjectOutputStream out = new ObjectOutputStream (dos);
out.write(加密数据);
byte[] data = byteArrayOutputStream.toByteArray();
在finally语句中执行{
def.end();
close();
}
结果,呵呵,不用多说了..................................
相关推荐
通过对性能瓶颈分析方法的详细介绍,我们可以看到,性能瓶颈分析不仅是一种技术手段,更是一种系统性思维。它要求我们在面对问题时能够从全局出发,逐步深入地解决问题。希望本文能够帮助读者更好地理解和掌握性能...
性能测试中如何定位性能瓶颈 性能测试是一种测试方法,旨在帮助我们的功能更好地运行,提高...性能测试中需要通过多个方面的监控和分析来确定性能瓶颈的位置,然后进行更详细的分析和定位,以提高系统的性能和稳定性。
- **DiskTime**:反映磁盘活动所占时间的比例,如果这个值较高,表明磁盘可能已经成为性能瓶颈。 - **Disksec/Transfer**:反映每次磁盘读写操作所需的时间,通常情况下,这个值越小,磁盘的性能就越高。 #### 三、...
《Linux实时性能瓶颈分析》这篇文章主要探讨了Linux操作系统在实时性能方面的问题,以及与RT-Linux和VxWorks两款硬实时操作系统的对比。在实时系统中,任务调度、信号量和消息队列的效率对系统性能有着重大影响。 ...
### 常见Web性能瓶颈及分析 #### 引言 随着互联网技术的快速发展与普及,Web应用已经成为人们日常生活中不可或缺的一部分。然而,随着Web应用的复杂度不断提高,其性能问题也日益凸显出来。本文旨在深入探讨Web性能...
### 服务器性能瓶颈分析方法详解 #### 一、引言 服务器性能的高效稳定是确保业务顺畅的关键。当服务器出现响应缓慢或无法处理更多请求的情况时,就需要进行性能瓶颈分析,找出导致性能下降的根本原因,并采取相应...
随着业务规模的不断扩大和技术复杂性的增加,如何有效地识别并解决系统性能瓶颈成为了一个关键课题。本文将深入探讨如何通过一系列的方法和技术手段来找出并解决这些性能问题。 #### 二、性能测试与分析概述 性能...
《找出系统性能瓶颈:企业级系统性能分析实践》是一份深度解析如何在企业级系统中识别与解决性能瓶颈的专业文档。以下是对该文档所涵盖的关键知识点的详细解读: ### 标题与描述 标题和描述均指向“找出系统性能...
【性能瓶颈分析方法1】 ...总的来说,性能瓶颈分析是一个综合性的过程,需要结合错误日志、监控数据和系统设计多个层面进行深入探究。通过细致的分析,可以有效地定位和解决性能问题,提升系统整体效率。
### LoadRunner-Linux测试性能瓶颈分析 #### 一、Linux系统瓶颈分析概述 在进行LoadRunner测试时,针对Linux系统的性能分析尤为重要。性能优化的目标在于识别并解决系统处理中的瓶颈,确保系统的稳定运行与高效...
软件系统性能检测与瓶颈分析是IT领域中一项至关重要的任务,尤其在中国软件评测中心的培训课程中占有显著地位。这个过程旨在确保软件系统的稳定性和效率,以满足用户需求和业务目标。性能检测是为了评估系统在特定...
* 轻松发现和消除性能瓶颈 * 查找问题代码 * 节省后续硬件及开发投入 * 增加应用发布信心 * 与开发过程集成,改善应用性能 JProbe Suite是一种能节省开发时间、降低开发费用、改善Java应用运行速度及和扩展能力的...
在"网络协议栈及性能瓶颈分析1"中,主要探讨了在高性能计算(HEP)领域,如何高效、可靠地处理日益增长的海量数据传输问题。随着网络传输速度的快速提升,处理器技术的进步却相对缓慢,导致网络协议处理的开销相对于...
本文档旨在提供一个全面的性能瓶颈分析方法论,并通过具体的案例总结来加深理解。性能瓶颈是指在系统运行过程中出现的制约整体性能的关键因素。识别并解决这些瓶颈是提高系统效率、保障用户体验的重要手段。 #### ...
4. **代码级性能探查**:JProbe允许在代码级别进行性能分析,可以查看每个方法的调用次数、执行时间和资源消耗,这对于定位性能瓶颈非常有帮助。 5. **JVM监控**:JProbe还可以监控JVM的运行状态,包括类加载、垃圾...
在分布式系统性能瓶颈分析中,自适应遗传算法通过逐步增加系统负载压力,利用遗传算法中染色体的概念,将服务器的关键性能指标值组合成染色体,构建系统适应度函数。适应度函数在这里反映了这些关键性能指标值变化对...
本项目是一个集成了性能分析的数据分析工具,使用Python的cProfile模块来识别数据处理过程中的性能瓶颈。项目包括数据加载、清洗、处理和分析的完整流程,并通过性能分析报告提供优化建议。 使用人群: 数据分析师...
5. **性能瓶颈分析**: - 通过收集和分析各种性能数据,PerformaSure能识别出系统中的瓶颈,可能是硬件资源不足、代码执行效率低或数据库查询问题等。 - 对于代码层面的问题,它能提供方法级别的调用链分析,定位...