java性能调优的基本知识
- 格式:doc
- 大小:63.50 KB
- 文档页数:11
篡霎Ⅵ渊黛疆J ava虚拟机垃圾回收算法分析与性能调优宿敬肖杨志云张燕(石家庄法商职业学院信息科学系河北石家庄050091)【摘要】阐述Java垃圾回收的作用。
介绍垃圾同收算法的优缺点,基于垃圾回收提出调优方法。
最后给出编码建议。
【关键词]Java虚拟机垃圾回收性能调优中图分类号:TP309.05文献标识码:^文章编号:1671—7597(2008)0910044—0l垃圾回收(G ar bage c011e ct i on,G c)是Java程序设计中内存管理的核心概念,J ava虚拟机(JⅧ)的内存管理机制被称为垃圾回收机制,用以跟踪正在使用的对象和发现并回收不再使用的对象。
该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。
垃圾回收机制的。
I=作原理是:垃圾回收器通过监控每一个对象的运行状态(包括申请、引用、被引用、赋值等),准确及时地释放对象,释放对象的根本原则是该对象不再被引用。
Java采用有向图的方式进行内存管理,垃圾I口】收器从有向图的根接点(Ja va程序中整个生存周期始终存在的那些类)开始,遍历被引用的所有接点,判断哪些接点符合垃圾收集的条件(即根接点不可达),然后把符合条件的对象删除,释放内存。
垃圾回收算法的选择和垃圾回收系统参数的合理调节直接影响着系统性能,因此需要开发人员做比较深入的了解。
一、垃圾回收算法分析Ja va虚拟机可以使用多种垃圾回收算法。
任何一种垃圾回收算法都具备如下两种功能:发现无用信息对象;回收被无用对象占用的内存空间,使得该宅间可被程序再次使用。
(一)垃圾回收的基本算法引用计数法、标记清除法和节点复制法是3种基本的垃圾收集算法。
引用计数是一种简单但速度很慢的垃圾同收技术。
每一个对象都含有一个引用计数器。
当有引用连接到对象时。
引用计数加l,当原有的引用离开作用域或置nul l时,引用计数减1,当某个对象的引用计数减为O时,就可以认为该对象为垃圾对象,可以予以回收。
第1篇一、Java基础知识1. 请简述Java语言的特点。
2. 什么是Java虚拟机(JVM)?它有什么作用?3. 什么是Java的内存模型?请解释Java内存模型中的几个关键概念:堆、栈、方法区、程序计数器、本地方法栈。
4. 什么是Java中的反射机制?请举例说明反射在Java中的应用。
5. 什么是Java中的泛型?请解释泛型的原理和作用。
6. 请简述Java中的四种访问控制符:public、protected、default、private。
7. 什么是Java中的继承和多态?请举例说明继承和多态在实际开发中的应用。
8. 什么是Java中的封装?请举例说明封装在实际开发中的应用。
9. 什么是Java中的接口和抽象类?它们之间有什么区别?10. 什么是Java中的异常处理?请解释try-catch-finally语句的执行顺序。
二、Java集合框架1. 请列举Java集合框架中的常用集合类及其特点。
2. 请简述ArrayList、LinkedList、HashMap、HashSet的区别。
3. 什么是Java中的泛型集合?请举例说明泛型集合的应用。
4. 什么是Java中的迭代器(Iterator)和枚举器(Enum)?请比较它们的区别。
5. 什么是Java中的List、Set、Map的遍历方法?6. 请解释Java中的ArrayList和LinkedList的内部实现原理。
7. 什么是Java中的HashMap的扩容机制?8. 什么是Java中的HashSet的内部实现原理?9. 请解释Java中的线程安全集合类,如CopyOnWriteArrayList、ConcurrentHashMap。
三、Java多线程与并发1. 什么是Java中的线程?请解释线程的创建、调度和同步。
2. 请简述Java中的线程状态,如新建、就绪、运行、阻塞、等待、超时等待、终止。
3. 什么是Java中的同步机制?请解释synchronized关键字的作用。
java 技术标准Java技术标准是指在Java开发过程中遵循的一系列规定和约定,用于确保Java应用程序的可靠性、安全性、可维护性以及可移植性。
Java技术标准的制定旨在提高Java开发的效率和质量,使Java应用程序具备良好的可扩展性和互操作性。
以下是Java技术标准的一些具体内容:1. Java编码规范:包括对变量、方法、类、包等命名规则的约定,以及对代码格式、注释、排版等书写风格的统一要求,以提高代码的可读性和可维护性。
2. 异常处理:Java技术标准规定了一套异常处理的约定,包括异常的声明、抛出、捕获和处理。
通过合理地处理异常,可以提高程序的稳定性和健壮性。
3. 线程安全:Java技术标准要求Java程序员在编写多线程程序时必须考虑线程安全问题,并提供了同步机制、线程锁等工具来保证线程安全。
4. 数据持久化:Java技术标准规定了数据持久化的规范,包括对数据库连接、SQL语句、事务处理等内容的约定,以保证数据的安全和一致性。
5. 安全性:Java技术标准要求Java应用程序必须具备一定的安全性,包括对密码学、加密算法、安全协议等方面的要求。
6. 跨平台性:Java技术标准要求Java应用程序必须具备良好的跨平台性,能够在不同的操作系统、硬件平台上运行,并保持一致的行为和性能。
7. 性能优化:Java技术标准还涉及性能优化方面的规范,包括内存管理、垃圾回收、性能调优等方面的约定和建议。
以上内容只是Java技术标准的一部分,实际上Java技术标准涵盖了Java 开发过程中的各个方面,还包括许多其他的规范和约定。
遵循这些标准可以提高Java应用程序的质量和可靠性,并使Java应用程序具备良好的可维护性和可移植性。
java程序员开发降本增效措施Java程序员开发降本增效措施作为Java程序员,开发降本增效是我们不断追求的目标。
随着技术的快速发展与竞争的日益激烈,我们需要寻找一些有效的措施来提高开发效率,减少开发成本,以便在市场中立于不败之地。
在本文中,将介绍一些关于降本增效的实践措施。
一、优化开发流程优化开发流程是提高开发效率的关键步骤之一。
对于Java程序员来说,以下是一些可以优化的开发流程:1.需求分析:在开始开发之前,充分理解客户需求。
与客户进行沟通,了解他们的期望,以便明确项目目标和要求。
2.项目规划:对项目进行详细的规划。
确定优先级和时间表,将项目分解成可管理的小任务,并确保项目进展按计划进行。
3.代码管理:使用版本控制工具(如Git)进行代码管理。
每个开发人员都应采用分支的方式进行开发,以便能够并行开发和合并代码。
4.自动化构建:利用构建工具(如Maven或Gradle)来管理项目的依赖和构建过程。
通过自动化构建,可以减少人工操作,提高构建速度和准确性。
二、提高编码效率编码是Java程序员最基本的工作之一。
以下是一些提高编码效率的实践措施:1.选择优秀的开发工具:选择合适的集成开发环境(IDE)来提高编码效率。
常用的IDE有Eclipse、IntelliJ IDEA等,它们提供了许多便捷的功能,比如自动补全、代码导航、重构等,可以帮助开发人员更快地编写高质量的代码。
2.遵循最佳实践:遵循Java编程的最佳实践,使用有效的命名规范和注释,编写可读性强的代码。
良好的编码规范可以提高代码的可维护性和可读性,并减少后续开发和调试工作。
3.代码复用:合理利用现有的代码库,积累和管理常用的代码模块。
通过代码复用,可以避免重复编写相似的功能代码,提高开发效率。
4.持续学习:不断学习新的技术和框架,了解行业最佳实践和趋势。
关注并参与社区,与其他开发人员交流经验和技巧,以提高自己的编码水平。
三、性能优化与测试性能优化和测试是保障项目质量和用户体验的重要环节。
jvm 性能调优⼯具之jmap 命令详解jmap 名称:Java Memory Map (内存映射)官⽅⽂档:https:///javase/1.5.0/docs/tooldocs/share/jmap.html功能描述:内容太多,直接看前辈们的总结:java 命令--jmap 命令使⽤(这篇⽂章写得⾮常好)Java 虚拟机的内存组成以及堆内存介绍Java GC ⼯作原理JVM 内存区域划分Eden Space 、Survivor Space 、Tenured Gen ,Perm Gen 解释JDK,JRE,JVM 区别与联系【JVM 】12_空间分配担保(没看懂?)下⾯是我的⼀个⼩⼩实践:1.使⽤ jmap -dump:format=b,file=filename pid 命令将堆快照⽂件下载到本地1234567[root@hadoop ~]# jmap -dump:format=b,file=/root/heap.hprof 3346 #导出堆快照⽂件Dumping heap to /root/heap.hprof ...Heap dump file created[root@hadoop ~]# ll #查看total 8572-rw------- 1 root root 4365247 Apr 9 08:15 heap.hprof[root@hadoop ~]# sz heap.hprof #将⽂件下载到本地2.使⽤JVM ⾃带的JVisualVM ⼯具查看堆快照⽂件在%JAVA_HOME%/bin ⽬录下双击jvisualvm.exe 打开-->⽂件-->装⼊-->选择Dump ⽂件类型-->找到堆快照⽂件-->打开在类栏中找到你要查看的类名双击进⼊实例数栏-->查看统计出的实例化的对象数⽬,分析对象的引⽤找到是谁在实例化此对象,从⽽找到产⽣⼤对象的原因。
性能调优的基本步骤部署在WAS上的J2EE应用程序,其性能是由多个因素决定的。
例如网络、数据库、内存分配、WAS服务器的配置以及应用程序的设计。
对于一个标准的 J2EE 应用,一个请求到来时,往往需要经过多次转发:网络 > Web服务器Web容器 > EJB容器 > 数据库。
而每一次转发,都可能造成请求处理的瓶颈,使得应用程序整体性能下降。
如果我们把每一次转发的待处理资源都看成一个队列,如图3:待处理资源队列对于WAS调优,要记住的一个基本原则就是,使得在队列中等待的请求的数量最小化。
在实践中我们发现,为了达到这个目的,最有效的配置方式就是使得队列成为一个“漏斗”。
也就是说,越靠近客户端的队列,其容量越大,而后面的队列,其容量要略小于或等于前面的队列。
按照这个原则,调优的基本步骤如下:∙设置的是Web Server的最大并发用户:o这个设置是在conf/httpd.conf这个文件里面配置的。
在Unix系统中,对应的属性是MaxClient;在Windows系统中,对应的属性是ThreadsPerChild。
∙设置Web Container的最大、最小并发用户:o在管理控制台中点击应用程序服务器> server1 > 线程池>WebContainer,根据观察的性能情况和应用情况输入合适的最小、最大进程数。
o Web容器线程池要点就是:“通常,对于每个服务器CPU,5 至10 个线程将会提供最佳吞吐量”(现在的一个cpu可以用核来代替)。
比如你的PcServer有2块CPU,每块CPU都是4核,那么你一个Application Server可以设置的最小值和最大值可以分别为40、80。
但是一般考虑到能充分利用CPU和Memory,或者为不同的应用启用不同的application server,一台PcServer上并不仅有这么一个appserver,而且还有别的进程在占用着CPU,所以默认的10到50(Linux 系统上25 个)是一个比较合适的值,当然更准确的值需要通过性能测试来确定。
第1篇第一部分:基础知识1. Java基本概念(1)请解释Java中的面向对象编程(OOP)的特点。
解析:面向对象编程的特点包括封装、继承和多态。
封装是指将数据和对数据的操作封装在一个类中;继承是指允许一个类继承另一个类的属性和方法;多态是指同一个方法在不同对象上表现出不同的行为。
(2)简述Java中的四种访问控制符及其作用范围。
解析:Java中的四种访问控制符分别是public、protected、默认(不写)和private。
public可以访问任何类;protected可以在同一个包内和子类中访问;默认访问(不写)只能在同一个包内访问;private只能在类内部访问。
2. Java基本数据类型(1)请列出Java中的基本数据类型,并说明其特点和取值范围。
解析:Java中的基本数据类型包括byte、short、int、long、float、double、char和boolean。
byte和short为有符号整数类型,取值范围分别为-128到127和-32,768到32,767;int为基本整型,取值范围为-2,147,483,648到2,147,483,647;long为长整型,取值范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807;float和double为浮点数类型,取值范围分别为-3.4E38到3.4E38和-1.8E308到1.8E308;char为字符类型,取值范围为0到65,535;boolean为布尔类型,取值为true或false。
(2)简述Java中的自动装箱和拆箱。
解析:自动装箱是指将基本数据类型自动转换为包装类型(如int自动转换为Integer);自动拆箱是指将包装类型自动转换为基本数据类型。
在装箱和拆箱过程中,如果数据类型不匹配,会抛出ClassCastException异常。
3. Java关键字(1)请解释Java中的关键字final、static和synchronized。
第1篇一、Java基础1. 请简述Java的基本数据类型和引用数据类型。
2. 请解释Java中的继承和多态。
3. 请描述Java中的异常处理机制。
4. 请简述Java中的接口和抽象类。
5. 请解释Java中的反射机制。
6. 请描述Java中的集合框架,包括List、Set和Map等。
7. 请解释Java中的泛型。
8. 请简述Java中的多线程。
9. 请描述Java中的同步机制。
10. 请解释Java中的序列化机制。
二、Java Web1. 请简述Servlet的生命周期。
2. 请描述JSP的基本语法和原理。
3. 请解释JDBC的基本原理和使用方法。
4. 请简述Java Web中的会话管理和Cookie。
5. 请描述Java Web中的过滤器(Filter)和监听器(Listener)。
6. 请解释Java Web中的MVC模式。
7. 请简述Java Web中的AJAX。
8. 请描述Java Web中的RESTful API。
9. 请解释Java Web中的Spring框架。
10. 请描述Java Web中的MyBatis框架。
三、数据库1. 请简述数据库的基本概念,如数据表、索引、视图等。
2. 请解释SQL语言的基本语法。
3. 请描述关系型数据库的基本设计原则。
4. 请简述数据库的规范化理论。
5. 请解释数据库的并发控制机制。
6. 请描述数据库的备份和恢复策略。
7. 请简述MySQL和Oracle等常见数据库的特点和区别。
8. 请解释数据库的事务管理。
9. 请描述数据库的存储过程和触发器。
10. 请简述数据库的性能优化方法。
四、计算机网络1. 请简述计算机网络的基本概念,如OSI七层模型和TCP/IP四层模型。
2. 请解释TCP和UDP的区别。
3. 请描述HTTP协议的基本原理。
4. 请简述DNS的工作原理。
5. 请解释IP地址和MAC地址。
6. 请描述路由器的工作原理。
7. 请简述防火墙的基本原理。
java idea设置内存的方法一、背景介绍Java是一种广泛使用的计算机编程语言,而IDEA是一种由JetBrains公司开发的集成开发环境,用于Java、Groovy和Kotlin等编程语言。
在使用IDEA进行Java开发的过程中,经常会遇到需要设置内存的情况,以确保程序能够正常运行和提高性能。
本文将针对这一问题进行介绍和解答。
二、设置内存的重要性在进行大型Java项目的开发时,往往需要配置较大的内存空间,以确保程序能够正常运行。
如果内存配置不足,可能会导致程序运行时频繁发生内存溢出等问题,影响开发效率和程序的性能。
正确设置内存是非常重要的。
三、IDEA设置内存的方法在IDEA中,设置内存的方法主要有两种:一种是通过编辑配置文件,另一种是通过IDEA的图形界面进行设置。
下面将分别介绍这两种方法的具体步骤。
3.1 通过编辑配置文件设置内存第一步:打开IDEA的安装目录,找到bin目录下的idea.exe.vmoptions文件。
第二步:用文本编辑器打开该文件,找到-Xms和-Xmx参数。
第三步:分别修改-Xms和-Xmx参数的数值,以设置初始堆内存和最大堆内存的大小。
第四步:保存文件并重启IDEA,使修改生效。
3.2 通过IDEA的图形界面设置内存第一步:打开IDEA,进入“Help”菜单,选择“Edit Custom VM Options”。
第二步:在弹出的窗口中,找到并编辑-Xms和-Xmx参数的数值。
第三步:保存设置并重启IDEA,使修改生效。
四、常见问题及解决方法在设置内存的过程中,可能会遇到一些常见问题,下面将针对这些问题提供解决方法。
4.1 如何确定需要设置多大的内存?答:通常来说,内存的设置取决于项目的大小和复杂度。
一般建议将初始堆内存(-Xms)和最大堆内存(-Xmx)设置为相同的数值,以避免在运行过程中频繁发生垃圾回收。
具体的数值可根据项目的具体情况进行调整。
4.2 如何避免内存溢出的问题?答:除了适当设置内存大小外,还可以通过优化程序代码和进行内存泄漏的检测来避免内存溢出的问题。
java开发简历工作技能Java开发工程师是计算机领域中的一个重要角色,需要具备扎实的编程能力和丰富的实践经验。
以下是我对Java开发工程师工作技能的一些详细介绍。
一、编程能力:1.扎实的Java语言基础:熟悉Java的基本语法、面向对象思想和常用类库,了解Java的特性和内存模型。
2.熟悉常用的Java开发工具:如Eclipse、IntelliJ IDEA等,能够熟练使用这些工具进行项目开发、调试和性能优化等。
3.熟悉常用的Java开发框架和技术:如Spring、Hibernate、MyBatis等,具有使用这些框架开发项目经验。
4.熟悉常用的Java开发模式:如单例模式、工厂模式、观察者模式等,具备良好的面向对象设计和编程习惯。
二、Web开发技能:1.熟悉Web开发相关的技术:如HTML、CSS、JavaScript等,能够编写优雅的前端页面和交互效果。
2.熟悉常用的Web开发框架:如Spring MVC、Struts2等,能够利用这些框架进行Web应用的开发和维护。
3.熟悉常用的Web服务技术:如RESTful、SOAP等,能够设计和实现基于这些技术的Web服务接口。
三、数据库技能:1.熟悉关系型数据库的基本概念和操作:如MySQL、Oracle等,能够编写SQL语句进行数据库的操作和优化。
2.熟悉常用的数据持久化技术:如JDBC、Hibernate、MyBatis等,具备开发数据访问层的经验。
3.了解NoSQL数据库的基本概念和使用:如MongoDB、Redis等,能够根据需求选择和使用适当的非关系型数据库。
四、分布式系统与微服务技术:1.了解分布式系统的基本原理和设计思想:如分布式数据一致性、负载均衡、分布式事务等,具备分布式系统开发经验。
2.熟悉常用的分布式系统框架和技术:如Dubbo、Spring Cloud 等,能够利用这些框架构建可靠、高可用的分布式系统。
3.熟悉微服务架构的基本概念和实践:如服务注册与发现、服务治理、服务监控等,具备微服务应用开发和部署经验。
调试工程师知识点总结作为一名调试工程师,你需要掌握各种技能和知识来识别和解决软件和硬件问题。
以下是一些关键的知识点总结,这些知识点将帮助你在调试过程中更加高效和准确地找到并解决问题。
1. 编程语言和算法作为一名调试工程师,你需要精通至少一种编程语言,比如C++、Java、Python等。
你需要了解算法和数据结构,以便在分析和解决问题时能够运用合适的算法。
你还需要了解操作系统和网络原理,以便在调试过程中更好地理解问题的根本原因。
2. 软件开发工具和技术在调试过程中,你需要熟悉各种软件开发工具和技术,比如调试器、版本控制系统、构建工具等。
你需要知道如何使用这些工具来追踪问题、复现问题、修复问题,并确保改动不会引入新的问题。
3. 软件测试和质量保证了解软件测试和质量保证的基本原理和技术是调试工程师的基本要求。
你需要知道如何编写和执行测试用例,如何进行自动化测试,如何进行质量分析和风险评估,以及如何进行问题追踪和管理。
4. 硬件和电子设备调试工程师通常需要处理一些硬件和电子设备的问题,比如嵌入式系统、传感器、电路板等。
因此,你需要了解电子设备的基本原理和组成结构,了解如何进行电路分析和故障排除,以及如何使用硬件调试工具和仪器。
5. 故障排除和问题解决故障排除和问题解决是调试工程师最基本的技能之一。
你需要懂得如何定位问题的根本原因,如何识别各种类型的问题,如何进行逻辑推理和实验验证,以及如何进行问题的追踪和记录。
6. 性能优化和系统调优调试工程师通常需要对软件和硬件进行性能优化和系统调优。
因此,你需要了解性能优化和系统调优的基本原理和技术,以及如何使用性能检测工具和分析工具。
7. 安全性和可靠性最后,调试工程师还需要了解安全性和可靠性的基本原理和技术。
你需要知道如何进行安全性分析和风险评估,以及如何设计和实施安全性和可靠性测试。
总的来说,作为一名调试工程师,你需要具备扎实的编程基础、广泛的软硬件知识、熟练的故障排查和问题解决能力,以及良好的团队合作和沟通能力。
java维洛克详细参数(原创实用版)目录1.Java 维洛克概述2.维洛克详细参数介绍3.维洛克参数的应用场景4.维洛克参数的优缺点分析正文【Java 维洛克概述】Java 维洛克(Java Viro)是一款流行的 Java 虚拟机(JVM)监控和性能分析工具。
通过收集和分析 JVM 的运行状态,Java 维洛克能够帮助开发者深入理解应用程序的性能瓶颈和潜在问题。
这对于优化应用程序性能和提高系统稳定性具有重要意义。
【维洛克详细参数介绍】Java 维洛克提供了丰富的参数,用于监控和分析 JVM 的运行状态。
以下是一些重要的维洛克参数:1.类加载器(Class Loader):类加载器参数用于监控和分析类加载器的加载状态,包括类的加载、链接、初始化等过程。
2.线程(Thread):线程参数用于监控和分析 JVM 中的线程活动,包括线程的创建、终止、状态等。
3.垃圾回收(Garbage Collection):垃圾回收参数用于监控和分析JVM 的垃圾回收活动,包括垃圾回收器的选择、垃圾回收的时间、垃圾回收的次数等。
4.内存(Memory):内存参数用于监控和分析 JVM 的内存使用情况,包括堆内存、栈内存、方法区等。
5.JIT 编译器(Just-In-Time Compiler):JIT 编译器参数用于监控和分析 JIT 编译器的编译活动,包括编译器的状态、编译的时间、编译的次数等。
6.系统(System):系统参数用于监控和分析 JVM 的系统活动,包括JVM 的启动、关闭、PID 等。
【维洛克参数的应用场景】Java 维洛克的参数在以下场景中具有广泛的应用:1.性能调优:通过分析维洛克参数,开发者可以发现应用程序的性能瓶颈,进而优化代码和配置,提高系统性能。
2.故障排查:当应用程序出现异常时,通过分析维洛克参数,可以定位问题发生的原因,帮助开发者快速解决问题。
3.系统监控:通过实时监控维洛克参数,可以了解 JVM 的运行状态,预防潜在的系统问题。
Java堆是指在程序运行时分配给对象生存的空间。
通过-mx/-Xmx和-ms/-Xms来设置起始堆的大小和最大堆的大小。
根据自己JDK的版本和厂家决定使用-mx和-ms或-Xmx和-Xms。
Java堆大小决定了垃圾回收的频度和速度,Java堆越大,垃圾回收的频度越低,速度越慢。
同理,Java堆越小,垃圾回收的频度越高,速度越快。
要想设置比较理想的参数,还是需要了解一些基础知识的。
Java堆的最大值不能太大,这样会造成系统内存被频繁的交换和分页。
所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。
而且堆设置的太大,造成垃圾回收的时间过长,这样将得不偿失,极大的影响程序的性能。
以下是一些经常使用的参数设置:1) 设置-Xms等于-XmX的值;2) 估计内存中存活对象所占的空间的大小,设置-Xms等于此值,-Xmx四倍于此值;3) 设置-Xms等于-Xmx的1/2大小;4) 设置-Xms介于-Xmx的1/10到1/4之间;5) 使用默认的设置。
大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。
除了-Xms和-Xmx两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾收集的算法,所以可能因为JDK的版本和厂家而有所不同。
但这些参数一般在Web 开发中用的比较少,我就不做详细介绍了。
在实际的应用中注意设置-Xms和-Xmx使其尽可能的优化应用程序就行了。
对于性能要求很高的程序,就需要自己再多研究研究Java虚拟机和垃圾收集算法的机制了。
可以看看曹晓钢翻译的《深入Java虚拟机》一书。
Java程序性能调优的基本知识和JDK调优一基本知识1.1 性能是什么在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过Java的人都能列出几点,甚至可以夸夸其谈。
在《Java TM Platform Performance》一书中,定义了如下五个方面来作为评判性能的标准:1) 运算的性能——哪一个算法的执行性能最好?2) 内存的分配——程序运行时需要耗费多少内存?3) 启动的时间——程序启动需要多长时间?这在Web项目中的影响不大,但要注意部分程序需要部署或运行在客户端时的情形(比如applet程序)。
4) 程序的可伸缩性——在压力负载的情况下,程序的性能如何?5) 性能的感知——用户在什么情况下会觉得程序的性能不好?以上五个方面,在具体的使用场景可以有选择的去评判。
至于这五方面的性能调优,在后续的章节中将会陆续的给以相应的性能调优策略。
1.2 调优的规则我们只需要关心对我们程序有影响,可以察觉到的性能问题,而不是每一个类中的每一个方法我们都需要想方设法的提高性能。
如果程序的性能没有达到我们所期望的要求,我们才需要考虑如何优化性能。
同样的,晦涩的代码虽然提高了程序的性能,但同时可能带给我们的是维护的噩梦。
我们需要折中的考虑以上两种情况,使得程序的代码是优美的,并且运行的足够快,达到客户所期望的性能要求。
优化代码甚至会导致不良的结果,Donald Knuth(一位比较牛比较有影响的人物,具体是谁,我也忘了,谁知道,可以告诉我一下,谢谢!)曾说过,“Premature optimization is the root of all evil”。
在开始性能调优前,需要先指出不优化代码的一些理由。
1) 如果优化的代码已经正常工作,优化后可能会引入新的bug;2) 优化代码趋向于使代码更难理解和维护;3) 在一个平台上优化的代码,在另一个平台上可能更糟;4) 花费很多时间在代码的优化上,提高了很少的性能,却导致了晦涩的代码。
确实,在优化前,我们必须认真的考虑是否值得去优化。
1.3 调优的步骤一般我们提高应用程序的性能划分为以下几个步骤:1) 明确应用程序的性能指标,怎样才符合期望的性能需求;2) 在目标平台进行测试;3) 如果性能已经达到性能指标,Stop;4) 查找性能瓶颈;5) 修改性能瓶颈;6) 返回到第2步。
二 JDK调优2.1 选择合适的JDK版本不同版本的JDK,甚至不同厂家的JDK可能都存在着很大的差异,对于性能优化的程度不同。
一般来说,尽可能选择最新发布的稳定的JDK版本。
最新的稳定的JDK版本相对以前的JDK版本都会做一些bug的修改和性能的优化工作。
2.2 垃圾收集Java堆的优化垃圾收集就是自动释放不再被程序所使用的对象的过程。
当一个对象不再被程序所引用时,它所引用的堆空间可以被回收,以便被后续的新对象所使用。
垃圾收集器必须能够断定哪些对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。
如果对象不再被使用,但还有被程序所引用,这时是不能被垃圾收集器所回收的,此时就是所谓的“内存泄漏”。
监控应用程序是否发生了内存泄漏,有一个非常优秀的监控工具推荐给大家——Quest公司的JProbe工具,使用它来观察程序运行期的内存变化,并可产生内存快照,从而分析并定位内存泄漏的确切位置,可以精确定位到源码内。
这个工具的使用我在后续的章节中还会做具体介绍。
Java堆是指在程序运行时分配给对象生存的空间。
通过-mx/-Xmx和-ms/-Xms来设置起始堆的大小和最大堆的大小。
根据自己JDK的版本和厂家决定使用-mx和-ms或-Xmx和-Xms。
Java堆大小决定了垃圾回收的频度和速度,Java堆越大,垃圾回收的频度越低,速度越慢。
同理,Java堆越小,垃圾回收的频度越高,速度越快。
要想设置比较理想的参数,还是需要了解一些基础知识的。
Java堆的最大值不能太大,这样会造成系统内存被频繁的交换和分页。
所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。
而且堆设置的太大,造成垃圾回收的时间过长,这样将得不偿失,极大的影响程序的性能。
以下是一些经常使用的参数设置:1) 设置-Xms等于-XmX的值;2) 估计内存中存活对象所占的空间的大小,设置-Xms等于此值,-Xmx四倍于此值;3) 设置-Xms等于-Xmx的1/2大小;4) 设置-Xms介于-Xmx的1/10到1/4之间;5) 使用默认的设置。
大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。
除了-Xms和-Xmx 两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾收集的算法,所以可能因为JDK的版本和厂家而有所不同。
但这些参数一般在Web开发中用的比较少,我就不做详细介绍了。
在实际的应用中注意设置-Xms和-Xmx使其尽可能的优化应用程序就行了。
对于性能要求很高的程序,就需要自己再多研究研究Java虚拟机和垃圾收集算法的机制了。
可以看看曹晓钢翻译的《深入Java虚拟机》一书。
Web 应用程序调优指南时间:2009-09-09 22:45:36来源:网络作者:未知点击:120次一.成功的应用都是相似的,失败的应用各有各的失败一.成功的应用都是相似的,失败的应用各有各的失败对于Web应用来说,影响性能的集中体现在网络/CPU/内存/IO/数据库/缓存这6个环节的处理上。
一个稳定应用的特征应该包括:1. 网络流量平稳,连接数保持稳定2. 低CPU负载3. 内存曲线平稳4. IO高响应5. 数据库的低负载,高响应简单的来说,对于每个不稳定的应用来说,都会有一个瓶颈,通过以上的工具分析,加上自己的判断,找到那个瓶颈,解决它!我们可以通过以下监控工具可监控到应用的各项指标1. 网络监控工具Cacti ,可以监控到整个服务器的流量/硬盘/CPU负载等情况2. JVM 监控JConsole (JDK 1.5 以上版本自带), %JA V A_HOME%\bin\jconsoleJava 启动加上一下参数:-Dcom.sun.management.jmxremote.port=5004 (监控端口)-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false3. Visual VM (JDK 1.6_07 以上版本自带) %JA V A_HOME%\bin\jvisualvm配置方法同JConsole , Visual VM 比JConsole 多了一个实用功能Thead Dump.4. Kill -3 来获取Thead DumpTheadDump可以很清晰的告诉你JVM当前正在做什么,内存里有哪些进程,是否有死锁。
重点观察RUNNABLE 和LOCK 是否有死锁。
5. 数据库查看MySql 的show processlist命令二.调优手段和策略1. 网络层优化不同类型的应用所能承受的网络负载各不相同,对于长连接应用来说,比如下载应用,所能承受的连接数就相对低,对于短链接应用,比如计数应用,所能承受的连接数就相对高,对于一般有数据库的应用来说,每秒的连接数保持在700以下都是没问题的。
这里调优的方面包括:1)Linux可以优化网络的TCP参数,提高网络的响应,2)增加服务器实现负载均衡,目的降低单台服务器流量3)优化程序,尽可能的减少处理的时间,如果一定有长时间处理的场景,可以采用异步方式处理。
先返回一个请求ID,然后客户端再通过这个ID来获得结果。
2. CPU优化就目前的硬件环境来看,CPU都不会是一个瓶颈。
如果CPU出现负载高,基本上都是程序处理不当引起,比如有深度递归或者循环或者频繁写磁盘,一旦出现高负载,会引起一系列的连锁反应,响应降低,连接数增加。
这个环节主要是优化程序:1)减少循环和递归2)减少synchronized 的用法。
对于多服务器场景,要实现锁机制,用synchronized 不一定适合。
Synchronized 使用不当,极容易造成死锁。
3)减少死锁发生的可能性。
JConsole提供了一个检测死锁的方法,TheadDump 也可以分析死锁。
3. 内存优化对于Java应用来说,内存调优是关键。
先来认识一下Java内存的构成和垃圾回收的机制:堆是应用程序使用的主要部分,一旦堆满,应用程序就会抛出Out Of Memory错误。
具体关于堆的构成以及垃圾回收算法,可以参考文档:/logs/4712392.html这个环节的优化:1) 增加JVM内存,使得可使用的堆内存尽可能多,延长垃圾回收的时间。
需要注意的是,一般来说,回收1G内存所需要的时间是7秒左右,如果这个时间访问量比较高,极容易导致应用停止响应,所以并非是越大内存越好。
通过增加XX:+PrintGCDetails 参数可以观察到垃圾回收的频率和时间2) 调整垃圾回收策略,加快JVM的回收,因为Web应用响应高,很多都是无用内存,加快回收可以保证有效堆会更多,这种方式会消耗更多的CPU。