记一次JAVA程序的性能调优
来源:互联网 发布:网络舆情处置应急预案 编辑:程序博客网 时间:2024/06/01 08:08
背景
笔者最近一个阶段做一个大数据方面的项目。和其他大数据项目使用Spark,ES不同,这个项目使用存文件的方式。
写文件时把用户所需要的数据全部准备好,典型的以磁盘空间换用户查询时间的方式。
大概流程如下:数据进来-->原始数据落磁盘-->小时数据汇总成各种数据报表-->天数据汇总成各种数据报表-->月数据汇总成各种报表。
原始数据量为170亿每天,最终生成各种报表后大概为200G每天,并且要做到数据具有实时性。
一些经验
1. 写代码的时候不用考虑性能问题。当前的环境是机器便宜,人贵,为了速度,时间,上线,先出东西再说。
2. 使用监控工具,比如Munin,看性能瓶颈在什么地方,是内存,CPU还是IO。
- CPU的情况,需要找出热点地区,推荐使用VisualVM, 看CPU最长的线程,函数,找出来,看是否代码有问题,计算是否有优化空间,如果没有只有加硬件一个方法。
- 内存情况,笔者为了减少IO情况,刚开始的时候,为了减少写磁盘的次数,把100个甚至1000个原始数据文件放在内存中,然后集中写, 但这样再遇到其他线程同时执行写磁盘操作的时候,往往造成outofmemory error 。 所以,需要根据数据量来估计内存大小。
- 尽量集中写,对于同一个文件,尽量集中写,而不是多次写。
- 磁盘情况。内存的buffer对磁盘IO非常重要,如果java进程挤占太多系统内存,导致buffer比较小,这会造成写磁盘非常非常的慢。buffer为操作系统对写文件操作buffer的空间,如果这个空间变小,会造成每一次写磁盘都直接跟比较慢的磁盘打交道。
内存图中绿色部分为应用程序所用,蓝色部分为buffer。 CPU图中,蓝色部分为用户所用,紫色部分为IO等待的CPU消耗时间。两边对比,可看出,当内存buffer比较小的时候,CPU IO等待时间非常大,这直接造成CPU的浪费,和数据的积压。所有java的xms参数不能把系统内存吃的太多。
0 0
- 记一次JAVA程序的性能调优
- 一次java性能调优经验
- 一次性能调优的实战
- 一次性能调优的实战
- 一次性能调优的实战
- 一次性能调优的实战
- 一次性能调优的实战
- 记一次性能调优过程
- Java 程序性能优化《第一章》Java性能调优概述 1.2性能调优的层次
- 记一次 java程序优化
- Java程序性能调优的基本知识和JDK调优
- Java程序性能调优的基本知识和JDK调优
- Java程序性能调优的基本知识和JDK调优
- JProfiler入门教程-简单的java程序性能调优
- 一次线程池有关的性能调优之旅
- 一次真实项目性能测试与调优的总结
- 如何合理的规划一次jvm性能调优
- JAVA程序性能调优笔记(3)-有助于改善性能的技巧
- 第50章 读写内部FLASH—零死角玩转STM32-F429系列
- sspanel按月结算,修改go版代码【web api】
- 第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列
- 如何在程序中跳转到设置里的打开蓝牙界面
- HTC M8 Verizon版刷电信4G破解固件不能出3G的解决办法
- 记一次JAVA程序的性能调优
- 函数-轻松创建易于表达的链式(级联)方法
- 【转载】Mysql数据类型常用属性
- JavaSE 多线程 线程间通信示例-1
- ExecException: Process 'command 'C:\Program Files\Java\jdk1.7.0_79\bin\java.exe'' finished with non-
- fread函数小笔记
- CentOS---网络配置详解
- CSS教程
- 函数-Javascript中的高阶函数介绍