性能优化篇

性能优化

性能优化相关概念

如何理解JDK、JRE和JVM?
  • JDK(Java Develop Kit):Java开发工具。编译成对应特定机器码。

  • JRE(Java Resource Environment):Java运行环境。只能运行.class文件,不能编译.class文件。

    JRE + 各种Java工具(javac/java/jdb等) + Java基础的类库(即Java API 包括rt.jar) 等效于 JDK。
    其中,rt.jar是基础类库。
    
  • JVM(Java Virtual Machine):Java虚拟机。编译成.class文件。

    JVM + 类库lib 等价于 JRE。
    
  • 简单来说就是:JDK包含JRE,JRE包含JVM的关系。

如何理解Java语言的一次编译,到处运行?
  • 机器码(machine code/native code):电脑CPU能读懂的语言。底层,执行快,晦涩难懂。

  • 每个操作系统的指令是不同的,即:不同操作系统机器码不同。(不同的语言体系哦!)

  • JDK(Java Develop Kit)是区分了操作系统的,即:不同操作系统,针对其特定的机器码,有不同的JDK。

  • JVM(Java Virtual Machine):运行在操作系统之上。结合字节码文件,在软件层面,屏蔽了不同操作系统在底层硬件与指令上的区别。

  • Java字节码文件(.class文件):中间状态(中间码)的二进制代码(文件),源码经过Java编译器转为字节码,字节码经过虚拟机内嵌的解释器将字节码转为机器码。运行在JVM之上,且都统一标准,遵守JVM规范。

  • 所以,操作系统<->机器码<->JDK,是一一对应的关系。即:字节码可以理解为统一了不同操作系统机器指令的上层抽象标准(JVM规范),JVM是字节码的翻译官,不同JDK是其对应操作系统指令的编译官。

  • 操作系统的机器指令执行从自说自话变为都说普通话。代价是中转了一层字节码(性能减分),好处是一次编译,到处运行(便捷加分)。亦是一种取舍,一种智慧。

Java是编译执行还是解释执行?
  • 编译执行:将高级语言的源码编译成机器语言的目标程序,以此作为编译和执行的粒度,进行执行。编译执行有点批量预处理的感觉,先把执行前的准备工作一次性搞定,后面执行无需兼顾其他,有了前期的铺垫,所以执行阶段快。在程序运行时,随着时间的推移,编译器逐渐发挥作用根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。
  • 解释执行:将高级语言的源码一句一句的翻译,计算机一句一句的执行,无目标程序产生。解释执行好处是一次编译(整体编译为字节码文件,再由字节码一句一句编译为机器码),到处运行(便捷加分),且在启动阶段省去了编译的时间,立即执行。缺点除了中转了一层字节码(性能减分),在安全层面,字节码文件更容易被反编译破解,因为和存粹的机器指令相比,字节码更易懂。当程序需要迅速启动的时候,解释器可以首先发挥作用,省去了编译的时间,立即执行。解释执行占用更小的内存空间。同时,当编译器进行的激进优化失败的时候,还可以进行逆优化来恢复到解释执行的状态。
  • Java即有编译执行,也有解释执行。Why?往下看。
什么是JIT?
  • 如果把.class文件的生成看作是编译(只不过不是直接编译成机器指令形成目标文件而已),那么,将该过程理解为编译执行也未尝不可。但是,其中的.class文件执行过程是解释执行的,也就是一句一句的翻译。
  • 如果.class文件一行语句解释执行一次,好像影响不大。
  • 但是,也会有需要执行多次的代码,比如,for循环、热点代码块等。每次都重复字节码解释成机器指令的过程是一种浪费。怎么解?缓存。
  • 既然你总被调用,那就将你直接编译成机器码缓存起来,随用随取
  • 简单理解,上面描述的就是即时编译的思想。Just In Time,简称JIT。
  • 那么,问题来了,如何判断是否需
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tomcat是一个开源的Java Servlet容器,用于处理Java Servlet和JSP(Java Server Pages)请求。为了提高Tomcat的性能,我们可以采取以下一些优化措施: 1. 调整内存设置:Tomcat的性能受到内存的影响较大,可以根据服务器的硬件和预期的负载来配置JVM(Java虚拟机)的内存参数,如-Xms(初始堆大小)和-Xmx(最大堆大小)。合理配置内存可以有效地避免内存溢出和频繁的垃圾回收。 2. 合理配置线程池:Tomcat使用线程池来处理并发请求,可以通过调整线程池的大小和配置参数来提高性能。可以根据服务器的硬件配置,预估的请求数量和处理时间来合理配置线程池的大小,避免线程过多或过少的情况发生。 3. 优化静态资源的处理:静态资源(如图片、CSS和JavaScript文件)可以通过使用CDN(内容分发网络)或将其存储在独立的服务器上来提高访问速度。同时,可以启用GZIP压缩和浏览器缓存,以减少传输的数据量和渲染时间。 4. 优化数据库访问:在应用程序中,数据库访问是一个非常常见且需要优化的环节。可以使用连接池来减少数据库连接的开销,同时尽量减少不必要的SQL查询和使用合适的索引。此外,将频繁查询的数据缓存到内存中,可以大大提高性能。 5. 调整Tomcat的配置参数:Tomcat的性能也受到其自身的配置参数的影响,可以根据具体情况来调整一些重要的参数,如连接超时时间、最大请求数量、缓冲区大小等。 6. 监控和识别性能问题:在优化Tomcat性能的过程中,及时监控和识别性能问题非常重要。可以使用一些性能监控工具,如JVisualVM、JProfiler等来识别潜在的性能瓶颈和热点。 综上所述,通过调整内存设置、线程池配置、静态资源优化、数据库访问优化、调整Tomcat配置参数以及监控问题识别,我们可以有效地优化Tomcat的性能,提升应用程序的响应速度和并发处理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值