消除反复编译困扰-优化效率-释放Java开发潜能 (消除反复编译命令)
在开发过程中,反复编译是一个常见的问题,特别是在大型项目或者需要频繁修改代码的情况下。每次修改代码后都需要重新编译整个项目,这样耗费了大量的时间和资源,降低了开发效率。为了解决这个问题,我们可以采取以下方法来解开 Java 反复编译的困扰,从而优化开发效率。
一、使用构建工具
构建工具如 Maven、Gradle 等可以帮助我们管理项目依赖、自动编译和构建项目。通过配置构建脚本,我们可以只编译和构建修改过的代码文件,而不必重新编译整个项目。这样可以大大减少编译时间,提高开发效率。构建工具还可以自动化执行其他任务,如运行测试、生成文档等,进一步提升开发流程的效率。
二、模块化开发
将大型项目拆分成多个独立的模块,每个模块只包含相关的功能和代码。这样,在修改某个模块的代码时,只需要重新编译该模块,而其他无关的模块可以保持不变。模块化开发可以减少编译的范围,提高编译速度。同时,模块化还有助于代码的可维护性和重用性。
三、使用增量编译工具
增量编译工具可以检测源代码的变化,并只编译发生变化的部分。这样,即使只修改了一个文件,也只需要重新编译该文件,而不必重新编译整个项目。一些常用的增量编译工具有 JRebel、Eclipse 的 IncrementalBuilder 等。通过使用增量编译工具,可以显著减少编译时间,提高开发效率。
四、合理使用 IDE 的自动编译功能
现代集成开发环境(IDE)如 Eclipse、IntelliJ IDEA 等都提供了自动编译功能。在 IDE 中修改代码后,IDE 会自动检测并编译修改的文件。合理利用 IDE 的自动编译功能,可以及时地获取反馈,快速修复代码问题,并且减少手动编译的次数。
五、使用热部署技术
热部署技术可以在应用程序运行时动态加载和替换代码,而无需重新启动应用。通过使用热部署技术,可以避免反复编译和部署应用的过程,加快代码的调试和验证。一些常见的热部署技术包括 JRebel、SpringLoaded 等。
六、合理使用缓存机制
在开发过程中,一些中间结果的缓存可以帮助减少重复编译的次数。例如,编译过的类文件可以缓存在本地,下次编译时可以直接使用已经编译好的结果,而不必重新编译。还可以使用代码生成工具生成一些重复性的代码,避免手动编写相同的代码。
七、使用轻量级的框架和工具
在选择框架和工具时,尽量选择轻量级的,避免过度复杂的配置和依赖。精简的框架和工具通常有更好的性能,减少了编译和构建的时间。
结论
通过使用构建工具、模块化开发、增量编译工具、合理使用 IDE 的自动编译功能、热部署技术、缓存机制以及选择轻量级的框架和工具,我们可以解开 Java 反复编译的困扰,优化开发效率。这些方法可以减少重复编译的次数,提高代码的调试和验证效率,加快开发过程,让开发人员更加专注于代码的质量和功能的实现。
java 编译优化问题
java编译的结果是字节码而不是二进制,所以在运行时vm的优化才是重要的,包括VM的回收策略、分配给VM内存的大小都能在一定程度上影响性能。 Sun的VM支持热点编译,对高频执行的代码段翻译的2进制会进行缓存,这也是VM的一种优化。 IBM JVM处理数学运算速度最快,BEA JVM处理大量线程和网络socket性能最好,而Sun JVM处理通常的商业逻辑性能最好。 不过Hotspot的Server mode被报告有稳定性的问题。 Java 的最大优势不是体现在执行速度上,所以对Compiler的要求并不如c++那样高,代码级的优化还需要程序员本身的功底。 贴个java的运行参数:Usage: java [-options] class [args...] (to execute a class) orjava [-options] -jar jarfile [args...] (to execute a jar file) where options include:-client to select the client VM-server to select the server VM-hotspotis a synonym for the client VM[deprecated]The default VM is client. -cp <class search path of directories and zip/jar files>-classpath <class search path of directories and zip/jar files>A ; separated list of directories, JAR archives,and ZIP archives to search for class files.-D<name>=<value>set a system property-verbose[:class|gc|jni]enable verbose output-versionprint product version and exit-version:<value>require the specified version to run-showversionprint product version and continue-jre-restrict-search | -jre-no-restrict-searchinclude/exclude user private JREs in the version search-? -helpprint this help message-Xprint help on non-standard options-ea[:<packagename>...|:<classname>]-enableassertions[:<packagename>...|:<classname>]enable assertions-da[:<packagename>...|:<classname>]-disableassertions[:<packagename>...|:<classname>]disable assertions-esa | -enablesystemassertionsenable system assertions-dsa | -disablesystemassertionsdisable system assertions-agentlib:<libname>[=<options>]load native agent library <libname>, e.g. -agentlib:hprofsee also, -agentlib:jdwp=help and -agentlib:hprof=help-agentpath:<pathname>[=<options>]load native agent library by full pathname-javaagent:<jarpath>[=<options>]load Java programming language agent, see -Xmixed mixed mode execution (default)-Xint interpreted mode execution only-Xbootclasspath:<directories and zip/jar files separated by ;>set search path for bootstrap classes and resources-Xbootclasspath/a:<directories and zip/jar files separated by ;>append to end of bootstrap class path-Xbootclasspath/p:<directories and zip/jar files separated by ;>prepend in front of bootstrap class path-Xnoclassgc disable class garbage collection-Xincgc enable incremental garbage collection-Xloggc:<file>log GC status to a file with time stamps-Xbatch disable background compilation-Xms<size>set initial Java heap size-Xmx<size>set maximum Java heap size-Xss<size>set java thread stack size-Xprofoutput cpu profiling data-Xfutureenable strictest checks, anticipating future default-Xrsreduce use of OS signals by Java/VM (see documentation)-Xcheck:jni perform additional checks for JNI functions-Xshare:off do not attempt to use shared class data-Xshare:autouse shared class data if possible (default)-Xshare:onrequire using shared class data, otherwise 虚拟机(JVM)参数配置说明 在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能。 JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。 但是在生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能。 另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory”类型的错误。 呵呵,这其中很可能就是JVM参数配置不当或者就没有配置没意识到配置引起的。 为了说明这些参数,还需要说说JDK中的命令行工具一些知识做铺垫。 首先看如何获取这些命令配置信息说明:假设你是windows平台,你安装了J2SDK,那么现在你从cmd控制台窗口进入J2SDK安装目录下的bin目录,然后运行java命令,出现如下结果,这些就是包括工具的和JVM的所有命令都在里面。 -----------------------------------------------------------------------D:\j2sdk15\bin>javaUsage: java [-options] class [args...] (to execute a class) orjava [-options] -jar jarfile [args...] (to execute a jar file) where options include:-client to select the client VM-server to select the server VM-hotspotis a synonym for the client VM[deprecated]The default VM is client. -cp <class search path of directories and zip/jar files>-classpath <class search path of directories and zip/jar files>A ; separated list of directories, JAR archives,and ZIP archives to search for class files.-D<name>=<value>set a system property-verbose[:class|gc|jni]enable verbose output-versionprint product version and exit-version:<value>require the specified version to run-showversionprint product version and continue-jre-restrict-search | -jre-no-restrict-searchinclude/exclude user private JREs in the version search-? -helpprint this help message-Xprint help on non-standard options-ea[:<packagename>...|:<classname>]-enableassertions[:<packagename>...|:<classname>]enable assertions-da[:<packagename>...|:<classname>]-disableassertions[:<packagename>...|:<classname>]disable assertions-esa | -enablesystemassertionsenable system assertions-dsa | -disablesystemassertionsdisable system assertions-agentlib:<libname>[=<options>]load native agent library <libname>, e.g. -agentlib:hprofsee also, -agentlib:jdwp=help and -agentlib:hprof=help-agentpath:<pathname>[=<options>]load native agent library by full pathname-javaagent:<jarpath>[=<options>]load Java programming language agent, see -----------------------------------------------------------------------在控制台输出信息中,有个-X(注意是大写)的命令,这个正是查看JVM配置参数的命令。 其次,用java -X 命令查看JVM的配置说明:运行后如下结果,这些就是配置JVM参数的秘密武器,这些信息都是英文的,为了方便阅读,我根据自己的理解翻译成中文了(不准确的地方还请各位博友斧正)-----------------------------------------------------------------------D:\j2sdk15\bin>java -X-Xmixed mixed mode execution (default)-Xint interpreted mode execution only-Xbootclasspath:<directories and zip/jar files separated by ;>set search path for bootstrap classes and resources-Xbootclasspath/a:<directories and zip/jar files separated by ;>append to end of bootstrap class path-Xbootclasspath/p:<directories and zip/jar files separated by ;>prepend in front of bootstrap class path-Xnoclassgc disable class garbage collection-Xincgc enable incremental garbage collection-Xloggc:<file>log GC status to a file with time stamps-Xbatch disable background compilation-Xms<size>set initial Java heap size-Xmx<size>set maximum Java heap size-Xss<size>set java thread stack size-Xprofoutput cpu profiling data-Xfutureenable strictest checks, anticipating future default-Xrsreduce use of OS signals by Java/VM (see documentation)-Xcheck:jni perform additional checks for JNI functions-Xshare:off do not attempt to use shared class data-Xshare:autouse shared class data if possible (default)-Xshare:onrequire using shared class data, otherwise fail. The -X options are non-standard and subject to change without notice.----------------------------------------------------------------------- JVM配置参数中文说明:-----------------------------------------------------------------------1、-Xmixed mixed mode execution (default) 混合模式执行 2、-Xint interpreted mode execution only 解释模式执行 3、-Xbootclasspath:<directories and zip/jar files separated by ;>set search path for bootstrap classes and resources 设置zip/jar资源或者类(文件)存放目录路径 3、-Xbootclasspath/a:<directories and zip/jar files separated by ;>append to end of bootstrap class path 追加zip/jar资源或者类(文件)存放目录路径 4、-Xbootclasspath/p:<directories and zip/jar files separated by ;>prepend in front of bootstrap class path 预先加载zip/jar资源或者类(文件)存放目录路径 5、-Xnoclassgc disable class garbage collection 关闭类废品回收功能 6、-Xincgc enable incremental garbage collection 开启类的废品回收功能 7、-Xloggc:<file>log GC status to a file with time stamps 记录废品回日志到一个文件。 8、-Xbatch disable background compilation 关闭后台编译 9、-Xms<size>set initial Java heap size 设置JVM初始化堆内存大小 10、-Xmx<size>set maximum Java heap size 设置JVM最大的堆内存大小 11、-Xss<size>set java thread stack size 设置JVM栈内存大小 12、-Xprofoutput cpu profiling data 输入CPU概要表数据 13、-Xfutureenable strictest checks, anticipating future default 执行严格的代码检查,预测可能出现的情况 14、-Xrsreduce use of OS signals by Java/VM (see documentation) 通过JVM还原操作系统信号 15、-Xcheck:jni perform additional checks for JNI functions 对JNI函数执行检查 16、-Xshare:off do not attempt to use shared class data 尽可能不去使用共享类的数据 17、-Xshare:autouse shared class data if possible (default) 尽可能的使用共享类的数据 18、-Xshare:on require using shared class data, otherwise fail. 尽可能的使用共享类的数据,否则运行失败 The -X options are non-standard and subject to change without notice.
可以提高千倍效率的Java代码小技巧
Java提高千倍效率小技巧
1、尽量指定类、方法的final修饰符
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法内联对干提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。
2、尽量重用对象
特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行废品回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。
3、尽可能使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的废品回收。
4、及时关闭流
Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。
5、慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象Throwable接口的构造函数调用名为filllnStackTrace(的本地同步方法,filllnStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
6、不要在循环中使用··,应该把其放在最外层。
除非不得已。如果毫无理由地这么写了,只要你的领导资深一点、有强迫症一点,八成就要骂你为什么写出这种废品代码来了。
7、不要将数组声明为public static final
因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变。
8、尽量在合适的场合使用单例。
使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:
(1)控制资源的使用,通过线程同步来控制资源的并发访问;
(2)控制实例的产生,以达到节约资源的目的;
(3)控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
9、及时清除不再需要的会话
为了清除不再活动的会话,许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多的会话时,如果内存不足,那么操作系统会把部分数据转移到磁盘,应用服务器也可能根据MRU(最近最频繁使用)算法把部分不活跃的会话转储到磁盘,甚至可能抛出内存不足的异常。
如果会话要被转储到磁盘那么必须要先被序列化,在大规模集群中,对对象进行序列化的代价是很昂贵的。因此,当会话不再需要时应当及时调用HttpSession的invalidate()方法清除会话
10、使用同步代码块替代同步方法
这点在多线程模块中的synchronized锁方法块一文中已经讲得很清楚了,除非能确定一整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。
11、将常量声明为static final,并以大写命名。
这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名,也可以方便区分出常量与变量。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。