之前参与了系统调优,感觉挺有收获了,现在记录一下。

处理xml时,理清楚报文格式,避免使用jdom解析

我们在做压测的时候,发现有一个程序响应非常慢,使用jstack定位到慢的地方:解析xml报文。xml报文存储的是数据信息,存储的格式很简单。但是为啥这里会出现问题?我想可能是tps高的情况下,使用jdom解析xml时,会将整个xml报文整理成对象,这个操作即耗cpu又耗内存。我们就尝试使用最简单的字符串截取的方法,实现xml解析,tps果然提高了很多。

收获

在不同系统间做交互时,如果传递的信息比较简单,建议使用格式化的字符串,避免使用xml,json。

避免使用正则

我们在做一个功能的时候需要将一个以\t分隔的字符串的第某一位取出来。实现方法是:使用Stirng的split方法,将字符串转成数组,然后根据下标位置取出需要的数据。因为split底层还是使用的正则做的字符串分隔,这是非常消耗cpu的。我们尝试使用字符串截取的方式,实现了这个功能,tps得到了很大的提升。

收获

让你舒服的方法肯定不是性能最好的。

避免new对象,尽量可以控制创建对象的数量

我们格式化日期是经常使用simpledateformat对象,当时写的方法是每一次调用格式化日期都会new一个对象,高tps的情况下,new的对象多,多次gc,对影响程序的响应速度。我们尝试修改成单例,即每种日期模式只对应new一个对象,程序tps也得到了一定的提升。

收获

控制程序中实例化对象的数量。

错误的释放内存导致内存泄露

我们在压测的时候,出现的情况很奇怪,刚开始一切正常,但是逐渐程序变慢,到最后直接卡死,不响应请求。我们看了gc日志,发现程序不断的在gc。我们猜测应该是内存被撑爆了。顺着这个思想,找到释放缓冲这块代码,怀疑没有成功释放缓存。缓存是存储在map里,释放缓存是通过new的方式来实现了,这样是不能够释放缓存的。map中还有一个方法是clear(),这个方法可以释放内存吗?看一下源码:

public void clear() {

modCount++;

Entry[] tab = table;

for (int i = 0; i < tab.length; i++)

tab[i] = null;

size = 0;

}

调用clear 方法后没有将entry清除掉,只是将每一个entry置空。这样hashmap的大小是不变的。

那么应该怎么将map的清空呢,最简单的方法就是清除所有对map里面entry的的引用即可。

参考代码

private static void releaseMap(Map map) {

if (map==null) {

return;

}

if (map.entrySet()==null) {

return;

}

Iterator iterator=map.entrySet().iterator();

if (iterator==null) {

return;

}

while(iterator.hasNext()){

Object key=iterator.next();

iterator.remove();

}

}

收获

一个优秀的开发者总是会很好的控制自己使用的内存。

java tps 优化_高tps下,java性能调优相关推荐

  1. 字节青训营第三课之高质量编程与性能调优实战的笔记和总结

    这是字节青训营第三课:高质量编程与性能调优实战的笔记和总结 概要 准备 尝试使用 test 命令,编写并运行简单测试 尝试使用 -bench参数,对函数进行性能测试 推荐阅读Go代码Review建议. ...

  2. mysql性能调优与架构设计_了解架构设计远远不够!一文拆解 Tomcat 高并发原理与性能调优

    来源 | 码哥字节 上帝视角拆解 Tomcat 架构设计,在了解整个组件设计思路之后.我们需要下凡深入了解每个组件的细节实现.从远到近,架构给人以宏观思维,细节展现饱满的美.关注「码哥字节」获取更多硬 ...

  3. Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解

    前言 在JVM性能调优时有三个组件: 堆大小调整(内存最够大的话,尽量搞大点) 垃圾收集器调整 JIT 编译器(比较深,需要掌握源码才能更好的优化更加底层) 大多数调优选项都与调整堆大小和为您的情况选 ...

  4. 2020年薪30W的Java程序员都要求熟悉JVM与性能调优!

    前言 作为Java程序员,你有没有被JVM伤害过?面试的时候是否碰到过对JVM的灵魂拷问? 一.JVM 内存区域划分 1.程序计数器(线程私有) 程序计数器(Program Counter Regis ...

  5. 了解架构设计远远不够!一文拆解 Tomcat 高并发原理与性能调优

    来源 | 码哥字节 上帝视角拆解 Tomcat 架构设计,在了解整个组件设计思路之后.我们需要下凡深入了解每个组件的细节实现.从远到近,架构给人以宏观思维,细节展现饱满的美.关注「码哥字节」获取更多硬 ...

  6. nginx代理转发_学了三年的性能调优,你还不懂Nginx?怎么跳槽涨薪

    前言 根据 Netcraft 公布的最新的(2019年10月)Web 服务器调查报告,Nginx 的市场份额达到了 32.69%,毫无争议地成为了最流行的 Web 服务器.这主要得益于 Nginx 在 ...

  7. java 并发xmind_多线程+高并发+操作系统+网络+基础+调优+源码等xmind图整理好了

    前言 多线程并发问题,基本是面试必问的. 今年刚刚毕业准备找实习的同学或者经历过最近一段时间面试的朋友们,相应你们应该都有一个相同的问题被问到,那就是多线程与高并发 因为最近和腾讯.阿里包括字节和京东 ...

  8. mysql 服务器优化_如何对MySQL服务器进行调优

    如今,社会讲求的就是快速,什么事都要有效率,当然服务器也是要有效率.开发人员不断地开发和部署使用LAMP(?.Apache.MySQL 和 PHP/Perl)架构的应用程序.但是,服务器管理员常常对应 ...

  9. mysql执行计划中性能最差的是_面试中:mysql性能调优-执行计划explain

    mysql的sql调优大家都不陌生,可是调优前都会先看下执行计划,这个是必须的. 插播图片: explain 这个是关键字执行如下: explain select * from user 结果如下: ...

最新文章

  1. Java基础概念性的知识总结
  2. [VS2010]在C#工程中设置Reference的相对路径
  3. 最小生成树(MST)
  4. zookeeper分布式锁代码实例
  5. 安卓Android面试题大全
  6. JAVA中整型常量的长度_以下的 能正确表示Java语言中的一个整型常量。_学小易找答案...
  7. aodv协议C语言代码,AODV协议入门必读
  8. 计算机信息专业致谢词,计算机专业毕业论文致谢词
  9. python金融编程入门_python金融实务从入门到精通完整版
  10. 芯片,建立在沙粒上的帝国!
  11. CPU内核和逻辑处理器的区别
  12. 计算机瞬间关闭所有程序的方法,Win10如何设置关机时快速关闭所有程序
  13. AndroidStudio|读取SD卡中的sqlite数据
  14. 玻色量子CEO文凯受邀出席首经贸金融学院系列讲座
  15. java 数组声明并初始化_Java数组的声明与初始化
  16. vue如何新建一个项目(详细步骤)
  17. sed命令详解及运用
  18. 计算机三级网络技术分值占比,大一能考计算机三级吗?计算机三级考试题型分析...
  19. matlab中长整数表示,matlab – 整数的因式分解
  20. ATOS阿托斯比例阀

热门文章

  1. 多方位角极化SAR数据处理与信息提取方法
  2. SQLZOO练习题 (8)
  3. 固定光束扫描器行业研究及十四五规划分析报告
  4. BATCH: A Scalable Asymmetric DiscreteCross-Modal Hashing--文献翻译
  5. 微软员工揭秘 Linux 子系统研发全过程
  6. 计算机远程桌面在哪里打开,电脑开启远程桌面的方法
  7. Android 中图片占用内存分析
  8. 第7章 PKI和密码应用
  9. 多线程的两种实现方法
  10. PPP协议HDLC协议