这首歌分享给大家,无论怎样,感谢17有你,你的18有我,新的一年,祝一切都好,想你。
现实里可能没有完美无缺的代码。如果有,那么,过来,我写一段代码给你看。
Java已经成为了编程语言的骄子。 Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,越来越多的企业在数据结构、算法分析、软件开发等研究设计时,都选择以Java语言作为载体。这说明Java语言已经是人们构建软件系统时主要使用的一种语言。如何让Java程序运行是一回事,而如何然它们跑的快又是另外一回事了......
或许听了太多关于java性能优化的故事。这些故事俨然成为了程序员的典范。用我的话来说,这别人本来就不容易听进去的东西,有点随着时间、压力和现实的摧毁下,慢慢成了一种消失的文化。
本文以一个开发者的角度,分析、总结和整理了一些Java性能优化的原因和方法,在此和大家浅浅的交流一下,不喜勿喷。
1
问题
为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了?也许,你经常会抱怨这些问题。其实并不是每个Java程序都需要调优的。如果一个程序可以表现的和预期差不太多,就不必付出额外的精力去提高它的性能。
但是,理想和现实总是有差别的。由于以下原因都会导致:
1、框架搭建的不完善、程序设计上的缺失;
2、客户咄咄逼人的需求修改;
3、随着上线时间的临近,考虑时间优先原则,放弃了原有的开发原则;
4、程序员的盲目自信,感觉自己做的已经相当完美了;
5、现代化设备的先进性,导致开发人员忽略资源合理利用的问题。
这些都导致了程序质量的下降,速度变慢甚至系统崩溃的原因。所以在某些不可控制的因素下,Java程序的性能优化显得尤为重要,弥补上述的不足。就好比你拍完了照片,需要ps修饰之后才发布在你的朋友圈是一样的道理。
2
准备
每个程序都有它自己独特的运作方式和不同的资源使用方式。正因如此,调优比写程序需要更多基础知识。例如,你需要熟悉虚拟机、操作系统和计算机架构。而当你面对在这些知识基础上编写的程序时,就能成功地对它进行调优。一般大致应该了解一下信息:
调优方向:设计调优 、代码调优 、JVM调优 、数据库调优 、操作系统调优
基本原则:Java程序在业务响应时间要求内执行计算任务的能力,程序在高容量下执行业务功能的能力,并具有可靠性高和延迟低的特点。
参考指标:执行时间、CPU时间、内存分配、磁盘吞吐量、网络吞吐量、响应时间
服务器资源:磁盘I/O、网络操作、CPU、内存
3
了解和处理
这里针对JVM调优进行一个简单的叙述。
知识总结:
1、什么是JVM
一个JVM是一个软件模块,用于执行Java应用字节码并且把字节码转化到硬件,操作系统特殊指令。通过这样做,JVM允许Java程序在第一次编写后可以在不同的环境中执行,并不需要更改原始的代码。Java的可移植性是通往企业应用语言的关键:开发者并不需要为不同平台重写应用代码,因为JVM负责翻译和平台优化。
2、JVM运行原理
Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,就可以在多种平台上不加修改地运行。
3、JVM基本结构
JVM主要包括四个部分:
1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中。
2.执行引擎:负责执行class文件中包含的字节码指令。
3.内存区(也叫运行时数据区):是在JVM运行的时候操作所分配的内存区。
4.本地方法接口:主要是调用C或C++实现的本地方法及返回结果。
JVM主要物理结构,如下图所示:
简单调优:
1、选择一个正确的GC(GargageCollection)。
GC的性能主要有2个方面的指标:吞吐量throughput和暂停pause。选择正确的GC可以达到两个目的:一个是将转移到老年代的对象数量降到最少,另一个是减少Full GC的执行时间。JAVA5 以后,开始自带了好几种GC机制,你可以选择一个适合你的种类。有以下四种Serial Collector,Parallel collector,Concurrent Collector,Train Collector。最常用的GC类型是Serial GC。
2、正确设置内存大小。
设置JVM内存的参数有四个:
-Xmx:Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-Xms:Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
-Xmn:Java Heap Young区大小,不熟悉最好保留默认值;
-Xss:每个线程的Stack大小,不熟悉最好保留默认值;
如果你能够准确的预估到应用需要消耗的Java堆空间,可以通过设定-Xmx和-Xms来作为这个步骤的起点。如果你不知道该设定什么值,就让JVM来选择吧,反正后面,都会根据实际情况进行优化调整。
3、减小类的使用量,注意类的load和unload。
类实际上也是对象,会直接分配perm区域里,即使Full GC也会很少收集。如果perm过大,超过XX:MaxPermSize值,会发生 OutOfMemoryError:PermGen space异常。
4、其它注意事项
(1)手动将生成的无用对象,中间对象置为null,加快内存回收。
(2)考虑采用对象池来较少对象的生成。如果有空闲的对象就从对象池中取出使用,没有再生成新的对象,大大提高了对象的复用率。
(3)配置JVM的参数来提高垃圾回收的速度
(4)充分利用单例机制。
谢谢你因为我看到这篇不算文章的文章。至于是不是废文,就看你自己的判断了,如果某一句话会对你有用,那就可以了。
关于IDEADATA
IDEADATA专注于从数据到信息的有效管理与应用,是领先的商业信息服务技术提供商,是数据仓库及大数据技术和应用的先行实践者。
联系客服