1、Tomat性能优化性能优化 由Tomcat内存溢出,初步了解JVM架构 yuhy目录Tomcat内存溢出Tomcat性能优化hn-kehongJava体系介绍Java运行时内存区域Tomcat内存溢出硬件、网络带宽以及服务端操作系统的选择都会影响Tomcat的性能。hn-kehong 1.OutOfMemoryError:Java heap space Java堆溢出 2.OutOfMemoryError:PermGen space 永久保存区域溢出Tomcat性能优化hn-kehong1)OutOfMemoryError:Java heap space JVM堆的设置是指java程序运行过程
2、中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn-Xms-Xmx等选项可进行设置。Heap size 的大小是Young Generation 和TenuredGeneraion 之和。Tomcat性能优化hn-kehong2)OutOfMemoryError:PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Me
3、ta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。Tomcat性能优化硬件、网络带宽以及服务端操作系统的选择都会影响Tomcat的性能。hn-kehong
4、由于Tomcat 的运行依赖于 JVM,Tomcat的调整主要分为两种(1)外部性能调整)外部性能调整 调整非Tomcat 组件,如 Tomcat 运行的操作系统和运行Tomcat 的 Java 虚拟机。(2)自身性能调整)自身性能调整 修改 Tomcat 自身的参数,调整 Tomcat 配置文件中的参数。Tomcat性能优化 外部性能调整外部性能调整 hn-kehongTomcat 本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java 虚拟机。因次可以通过对JVM的优化,来提高Tomcat的运行效率1)JVM动态库版本的选择 client:针对桌面应用优化 特点:加载速
5、度快 server:针对服务器应用优化 特点:加载速度较慢,运行速度快 注意!注意!jvm client 中能运行的程序有可能在jvm server中运行出错,所以这样的话最好在开发、测试阶段都使用jvm server,保持和服务器相同。因此种问题目前不太常见,或者可在部署前利用server版进行验证测试后部署。Tomcat性能优化 外部性能调整外部性能调整 hn-kehongTomcat 本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java 虚拟机。因次可以通过对JVM的优化,来提高Tomcat的运行效率JVM动态库版本切换方法 修改%JAVA_HOME%/jre/li
6、b/i386/jvm.cfg 文件 Tomcat性能优化 外部性能调整外部性能调整 hn-kehong2)JVM内存设置 可以通过 java-XmxXXXXM version 命令 测试JVM支持的最大内存 如果执行正常就表示指定的内存大小可用,否则会打印错误信息 JVM初始化堆的大小 -Xms:虚拟机在启动时向系统申请的内存的大小。使用于应用程序在大负载的情况下会急剧地占用更多的内存,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。一般把-Xms 和-Xmx 设为一样大。JVM堆的最大值 Xmx:受限于系统可使用的物理内存,使用于
7、数据量较大的应用程序会使用持久对象,内存使用有可能迅速增长当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。一般建议堆的最大值设置为可用内存的最大值的 80%。Tomcat性能优化 外部性能调整外部性能调整 hn-kehong2)JVM内存设置 Tomcat 默认可以使用的内存为128MB;初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。startup.bat启动方式:启动方式:在文件tomcat_home/bin/catalina.bat 最前面添加 set JAVA_OPTS=-Xms128m-Xmx350m window
8、s服务启动方式服务启动方式 执行的是bintomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.修改注册表HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationProcrun 2.0Tomcat6ParametersJavaOptions 重起tomcat服务,设置生效。Tomcat安装方式:安装方式:1.“开始”-“Apache Tomcat 6”-“Configure Tomcat”2.选择 Java 标签,在“Initial memory pool(初始内存)”和“Maximum memory pool(最大内存
9、)”中输入你需要的内存参数即可。Tomcat性能优化 外部性能调整外部性能调整 hn-kehong2)JVM内存设置 要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。-Xms:初始值-Xmx:最大值-Xmn:最小值Java 提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。如果堆很大,那么完全垃圾收集就会很慢,但是频度会降低。如果堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。Tomcat性能优化 外部性能调整外部性能调整 hn-kehong5)Tomca
10、t与web服务器整合虽然 Tomcat 也可以作 Web 服务器,但处理静态 html 的速度比不上 Apache,且其作为 Web 服务器的功能远不如 Apache,因此我们想把 Apache 和 T omcat 集成起来,将 html与 JSP 的功能部分进行明确分工,让Tomcat只处理 JSP 部分,他的由 Apache、IIS 等这些 Web 服务器处理,由此大大节省了 Tomcat 有限的工作“线程”。6)Tomcat负载均衡 可以通过配置 T omcat 与 Apache 进行负载平衡,来提高 T omcat 的服务性能。Tomcat性能优化 自身性能优化自身性能优化 hn-ke
11、hong1)禁用 DNS 查询 当 Web 应用程序记录客户端的信息时,它也会记录客户端的 IP 地址或者通过域名服务器查找机器名转换为 IP 地址。DNS 查询需要占用网络,并且可能从很多很远的服务器或者不起作用的服务器上去获取对应的 IP,这样会消耗一定的时间。为了消除 DNS 查询对性能的影响,可以关闭 DNS 查询。方法是修改 server.xml 文件中的 enableLookups 参数值。关闭不仅节省了网络带宽、查询时间和内存,而且更小的流量也会使日志数据变得更少,显而易见也节省了硬盘空间。对流量较小的站点来说禁用 DNS 查询可能没有大流量站点的效果明显。Tomcat性能优化
12、自身性能优化自身性能优化 hn-kehong2)线程数配置 基本上可以解决连接数过大引起的死机。具体数值可跟据实际情况设置 maxThreads /最大线程数 minSpareThreads /初始化时创建的线程数 maxSpareThreads /一旦创建的线程超过这个值,Tomcat 就会关闭不再需要 的 socket 线程。acceptCount /指定当所有可以使用的处理请求的线程数都被使用时,可 以放到处理队列中的请求数,超过这个数的请求将不予处理 connnectionTimeout /网络连接超时时间,单位毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000
13、 毫秒 Tomcat性能优化 自身性能优化自身性能优化 hn-kehong2)线程数配置 配置公用线程池 多个 connector 公用 1 个线程池。Java虚拟机hn-kehongJava不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系。提供完整的用于软件开发和跨平台部署的支持环境,并广泛用于嵌入式系统、移动终端、企业服务器和大型机等各种场合。Sun官方定义的Java技术体系包括以下几个部分:认识认识Java体系体系java程序设计语言各种硬件平台上的Java虚拟机Class文件格式Java API类库来自商业机构和开源社区的第三方Java类库Java虚拟机hn-ke
14、hongJava技术体系所包括的内容Java虚拟机hn-kehong Java运行时内存区域运行时内存区域Java虚拟机hn-kehong 程序计数器程序计数器一块较小的内存空间。它的作用可以看做是当前线程所执行的字节码的行号指示器。”线程私有“的内存:Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,在任何一个确定的时刻,一个处理器只会执行一条线程中的指令。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储。唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。Java虚拟
15、机hn-kehong Java虚拟机栈“线程私有”,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame,方法运行期的基础数据结构)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成额过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。两种异常状况:StackOverflowError异常:线程请求的栈深度大于虚拟机所允许的深度OutOfMemoryError异常:如果虚拟机栈可以动态扩展,当扩展时无法申 请到足够的内存Java虚拟机hn-kehong本地方法栈同虚拟机栈类似 虚拟机栈为
16、虚拟机执行Java方法服务 本地方法栈为虚拟机使用的Native方法服务 虚拟机归法中对本地方法栈中使用的语言、使用方式与数据接口并没有强制规定,因此具体的虚拟机可以自由实现它。有的虚拟机(Sun HotSpot虚拟机)直接把本地方法栈和虚拟机栈合二为一。两种异常状况StackOverflowError异常:线程请求的栈深度大于虚拟机所允许的深度OutOfMemoryError异常:如果本地方法栈可以动态扩展,当扩展时无法 申请到足够的内存Java虚拟机hn-kehongJava堆Java堆是Java虚拟机所管理的内存中最大的一块,也是GC管理的主要区域。Java堆是被所有线程共享的一块内存区
17、域,在虚拟机启动时创建。该内存区域唯一的目的就是存放对象实例,几乎所有的对象实例都在这里分配内存 Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续的即可。在实现时,既可以实现成固定大小的,也可以是可扩展的,当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)OutOfMemoryError:如果在堆中没有内存完成实例分配,并且堆也无法再扩展时Java虚拟机hn-kehong方法区各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器变异后的代码等数据。内存回收目标主要是针对常量池的回收和对类型的卸载。OutOfMem
18、oryError:当方法区无法满足内存分配需求时运行时常量池 Class文件中除了类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用在类加载后存放到方法区的运行时常量池中。OutOfMemoryError 当常量池无法再申请到内存时Java虚拟机hn-kehong直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。本机直接内存的分配不会受到Java堆大小的限制,会受到本机总内存的大小及处理器寻址空间的限制。当各个内存区域的总和大于物理内存限制。动态扩展时出现抛出OutOfMemoryError异常感谢您的关注!后续内容1:JVM回收机制与内存分配策略后续内容2:Tomcat知识进阶(启动、类加载、框架、连接器、领域、阀、资源、解释器)下期预告HTML5 管网事业部