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