引自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();
}
结果,呵呵,不用多说了..................................
相关推荐
一些html知识点小计,复习看
资料链接: https://pan.quark.cn/s/c589f1a1982b 前几日,清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室博士后团队出版了一本《DeepSeek:从入门到精通》的ai使用手册,长达104页。该教程堪称国产AI工具DeepSeek学习的标杆指南,既适合新手快速掌握基础操作,也为进阶用户提供系统性方法论。另外,手册还深入探究了如何设计提示语的策略,充分发挥DeepSeek的推理与生成能力,包括任务分解、逻辑链构建、多模态信息处理等高级技巧等。完整版手册我已经帮大家整理好,在最上方,限时免费分享。
auto_gptq-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
2013年12月,中共中央办公厅印发的《关于培育和践行社会主义核心价值观的意见》指出,党的十八大对社会主义核心价值观的凝练和概括,“与中国特色社会主义发展要求相契合,与中华优秀传统文化和人类文明优秀成果相承接,是我们党凝聚全党全社会价值共识作出的重要论断”。 二十四字社会主义核心价值观反映了中国特色社会主义发展的本质要求,凝结着社会主义先进文化的精髓,是中国特色社会主义道路、理论体系和制度的价值表达。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
fasttext-wheel-0.9.2-cp35-cp35m-win-amd64.whl
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
用deepseek变现实操流程,小白必看。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
智慧园区技术总集服务解读.pptx
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
界面就相当于是聊天界面,然后是你和AI的界面 打开小程序后会自动全网推送几个表情包给你 然后你可以点击下方的说你还要然后又会随机发给你 当然你也可以输入关键词然后会自动发送与你关键词有关的表情包给你 另外有时候发送表情包的时候还会有小惊喜就是随机推送一个流量主 广告还能你不注意就点击了 另外呢保存表情包的时候支持激励视频保存(没有流量主的用户的话会自动跳过直接保存) 另外还有插屏广告(几个广告都是高收益的) 所以总体来说这款小程序还是挺好玩的 安装方法: 使用微信开发者工具打开源码 有流量主的用户根据广告配置里面的ID搜索替换成 你的(PS:如果没有流量主的 用户忽略这一步) 然后设置合法域名(合法域名在压缩包里面) 然后就可以上传提交审核了
2022Carbon sequestration of Chinese forests from 2010 to 2060-w.pdf