转自:http://hellojava.info/?p=176
参考:http://www.atatech.org/articles/41454
很多流量大的Java应用在重启的瞬间很容易出现负载比较高的现象,通常会看到的原因可能是GC线程、业务处理线程以及JVM编译线程耗CPU较多,这个问题在目前要解决其实是比较困难的,原因如下。
Java程序在启动的时候所有代码的执行都处于解释执行模式,只有在运行了一段时间后,根据代码方法执行的次数,或代码里循环的执行次数等达到一定的阈值才会编译成机器码,编译成机器码后执行效率会得到大幅提升,而随着执行时间进一步拉长,JVM的各种更高级的编译优化手段就会逐渐加上,例如if条件的执行状况,逃逸分析等,具体的更多信息可以看看以前撒迦写的Java执行的PPT。
因此Java程序要达到一个比较稳定的高效的代码执行是需要一定的时间的,为了解决这种问题,通常来说暂时可以采用的解决方法是:
1. 主动对Java程序进行热身
在启动完成后,主动的访问热点的代码入口,确保主要的热点代码编译成机器码后再放入流量,可通过-XX:+PrintCompilation来确认。
2. 逐步放进流量
通过apache/nginx转发等逐步的放入流量,用流量来完成Java程序的热身也是一种方法,但通常来说这个操作起来比较复杂。
对于特别重要的应用,建议用第一种方法,不过通常操作起来也比较折腾。
在写一些micro benchmark代码前也请一定要记得先做warm动作,避免测试结果偏差太大。
另外,Oracle JDK从JDK 6u25以后的版本支持了多层编译(-XX:+TieredCompilation),默认是不打开的(可以用jinfo -flag或-XX:+PrintFlagsFinal来确认是否打开),这个的好处是之前server都是采用c2高级编译的,会比较耗时且要运行一段时间才会触发编译,而c1编译是比较轻量的也比较快触发,因此在启用了多层编译后,可以在启动后更快的让部分代码先进入编译模式,感兴趣的同学可以自行找下关于多层编译的一些资料。
之前听到一个消息是,Oracle JDK为了解决某个问题做的一个改进,有可能能用于提升Java应用的启动速度,也算是无心摘柳柳成荫,:),不过暂时貌似还没有什么新的进展的消息。
另外,再啰嗦说下,传说中的大方法的执行效率更低,是有可能的…原因是inline优化,Oracle JDK会有默认的MaxInlineSize的控制,如果大于了这个值,在做Inline优化的时候就会跳过,从而导致在执行方法时要多几个指令,因此方法的大小还是要稍微控制下的。
关于Java程序执行的一些原理知识,推荐看下@rednaxelafx之前写的一个巨长的PPT,:)
昨天的调查结果让我还比较欣慰,结果显示订阅我这个账号的大部分是非阿里的,挺好,:),不过话说这是我这个公众账号一天收到的最多消息的一次,希望大家有什么问题,或希望看到分享的,或希望给其他人分享的都回复我,如果有希望给其他人分享的最好了,现在微信5.0已经支持在公众账号上写作者名字了。
最后推荐下阿里技术嘉年华的微信公众号:alibabatech 会有很多阿里各种技术的分享信息,阿里在技术上还是一家比较开放的公司,因此还是能得到一些信息的。
话说阿里技术嘉年华应该算是搞得很不错,干货很多的技术大会,尽管今年开始收费了(MM不收费,这个一定要继续保持下去,:)),但价格很便宜,所以能来参加的话我觉得还是值得参加下的(尽管我个人现在对各类技术大会都不感兴趣了…)。
=============================
题图来源于:http://img0.pcauto.com.cn/pcauto/1108/31/1624710_21.jpg
欢迎关注微信公众号:hellojavacases
关于此微信号:
分享Java问题排查的Case、Java业界的动态和新技术、Java的一些小知识点Test,以及和大家一起讨论一些Java问题或场景,这里只有Java细节的分享,没有大道理、大架构和大框架。
公众号上发布的消息都存放在http://hellojava.info上。
相关推荐
Java应用程序的启动速度优化是许多开发团队面临的关键挑战,特别是在处理大型项目时。当一个Java应用的jar包达到数百MB时,启动时间可能会延长至几分钟,这对于需要快速响应故障和扩展服务的情况尤为不利。以下是...
以下是一些针对MyEclipse启动速度优化的关键点: 1. **关闭自动验证**:在`Windows > Preferences > MyEclipse > Validation`中取消Build下的所有勾选,以减少启动时的验证过程。当需要验证特定文件时,可以右键...
### MyEclipse启动速度优化详解 #### 一、引言 MyEclipse作为一款非常流行的集成开发环境(IDE),在Java开发领域具有广泛的应用。然而,随着项目规模的增长及插件数量的增加,MyEclipse的启动速度可能会变得...
### MyEclipse启动和运行速度优化 在日常开发过程中,我们经常会遇到MyEclipse启动慢、运行卡顿等问题,这不仅影响工作效率,还可能导致代码编辑和调试效率降低。本文将针对这些问题提供一系列优化建议,帮助提升...
【Java 性能优化概述】 Java 作为一种跨平台的编程语言,自1990年代中期推出以来,凭借其“一次编写,到处运行”的特性获得了广泛赞誉,但也因其相对于C等语言的性能和运行效率问题受到诟病。尤其是在服务器端应用...
Java程序性能优化是每个开发人员都需要关注的重要领域,它涵盖了多个方面,旨在提高代码执行效率,减少资源消耗,以及提升应用程序的稳定性和响应速度。在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java...
- **JIT编译器**:HotSpot VM中的Just-In-Time(JIT)编译器能够在运行时将频繁执行的热点代码编译为本地机器码,提升执行速度。 - **并行和并发**:利用多核处理器的优势,通过并行计算和并发处理提高程序效率...
`-client`模式适用于客户端应用程序或PC应用,它以较快的启动速度为特点,但牺牲了运行时的性能和内存管理效率。相反,`-server`模式专为服务器环境设计,虽然启动较慢,但在运行时能提供更好的性能和内存管理,通常...
### Java和数据库性能优化策略详解 ...综上所述,Java和数据库性能优化涉及多方面考量,从数据库设计到Java编码,每一步都需要精心规划,才能确保应用程序在面对高并发和大数据量时仍能保持高效运行。
本文将深入探讨三种常见的Java程序设计性能优化策略,以帮助开发者提高代码的执行速度和整体系统性能。 首先,我们要理解的是“垃圾收集器优化”。Java中的垃圾收集机制是自动内存管理的关键,但如果不妥善处理,它...
### JAVA启动参数详解 #### 一、概述 Java 虚拟机 (JVM) 的启动参数对于调整和优化 Java 应用程序的性能至关重要。根据不同的应用场景和需求,合理选择和配置这些参数能够显著提升应用程序的运行效率。Java 启动...
理解JVM的工作原理,如堆内存分配、新生代与老年代的划分,以及垃圾回收器的工作机制(如CMS、G1、ZGC等),并根据应用特点调整合适的JVM参数,如-Xms、-Xmx、-XX:NewRatio等,能有效改善程序启动速度和运行时性能。...
Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够带来显著的业务优势。本资源包含一个PDF文档和相关的视频教程,旨在帮助你提升Java程序的速度和稳定性。 首先...
这种情况会影响用户体验,让用户感觉启动速度慢或是应用程序不稳定。 **原因分析:** 1. **Activity的初始化过程**:当Activity被创建时,系统需要执行一系列的操作,包括但不限于加载布局、初始化视图组件、绑定...
《Java性能优化》一书深入探讨了如何通过各种技术提升Java应用程序的效率和响应速度。以下是一些基于书籍源码和相关文件名的关键知识点: 1. **命令行脚本**: 文件`javas.cmd`和`allcmd.cmd`可能是用于运行和测试...
【使用JAVA内存数据库h2database性能优化】 在开发应用程序时,我们经常遇到性能瓶颈,特别是当涉及到大量的IO操作时。数据库访问是这类问题的主要来源,特别是在处理高并发、实时计算和海量数据监控的情况下。例如...
2. **减少启动加载的模块**:在`server.xml`中,可以通过注释掉不必要的Connector、Listener等元素,减少启动时加载的组件,加快启动速度。 3. **使用ClassPath优化**:通过 `-Djava.endorsed.dirs` 指定endorsed...
通过提前告知JVM所需的永久代内存,可以减少启动阶段的垃圾回收事件,从而提升启动速度。 ##### 5. **-XX:CompileThreshold=100** 此参数降低了即时编译器(JIT Compiler)的触发阈值,使得更多的方法在运行初期就...
如何优化提高 Tomcat 启动速度 Tomcat 是一个流行的开源 Java Web 服务器,它广泛应用于各种 web 应用程序中。然而,在实际应用中,我们经常遇到 Tomcat 启动速度缓慢的问题,这不仅影响了应用程序的性能,也影响了...