当前位置:文档之家› Tomcat内存溢出的三种情况及解决办法分析

Tomcat内存溢出的三种情况及解决办法分析

Tomcat内存溢出的三种情况及解决办法分析
Tomcat内存溢出的三种情况及解决办法分析

Tomcat内存溢出的三种情况及解决办法分析

2009-08-24 15:25:08 来源: 作者:

在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。

Tomcat内存溢出的原因

在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。

这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况:

1.OutOfMemoryError: Java heap space

2.OutOfMemoryError: PermGen space

3.OutOfMemoryError: unable to create new native thread.

Tomcat内存溢出解决方案

对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms -Xmx -XX:PermSize -XX:MaxPermSize)

最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。

第一种:是堆溢出。

在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

没有内存泄露的情况下,调整-Xms -Xmx参数可以解决。

-Xms:初始堆大小

-Xmx:最大堆大小

但堆的大小受下面三方面影响:

1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在1.5G~2G;我在2003 server 系统下(物理内存:4G和6G,jdk:1.6)测试 1612M,64为操作系统对内存无限制。)

2.系统的可用虚拟内存限制;

3.系统的可用物理内存限制。

堆的大小可以使用 java -Xmx***M version 命令来测试。支持的话会出现jdk的版本号,不支持会报错。

-Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m

第二种:永久保存区域溢出

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这一部分用于存

放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区

域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你

的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。但目前的hibernate和spring项目中也很容易出现这样的问

题。https://www.doczj.com/doc/8818936128.html,/topic/80620?page=1 的帖子有讨论的这个问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,导致内存溢出。

这一个一般是加大-XX:PermSize -XX:MaxPermSize 来解决问题。

-XX:PermSize 永久保存区域初始大小

-XX:PermSize 永久保存区域初始最大值

这一般结合第一条使用,比如 set JAVA_OPTS= -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:PermSize=256M

有一点需要注意:java -Xmx***M version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的和比如系统支持最大的jvm堆大小事1.5G,那 -Xmx1024m -XX:PermSize=768M 是无法运行的。

第三种:无法创建新的线程。

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。

这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半

。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。

产生这种现象的原因如下(从这个blog中了解到原

因:https://www.doczj.com/doc/8818936128.html,/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html):

每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使

用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。

这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是

让JVM宿主在你的JNI代码里边。

给出一个有关能够创建线程的最大个数的估算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

对于jdk1.5而言,假设操作系统保留120M内存:

1.5GB JVM:(2GB-1.5Gb-120MB)/(1MB) = ~380 threads

1.0GB JVM:(2GB-1.0Gb-120MB)/(1MB) = ~880 threads

在2000/XP/2003的boot.ini里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。

因此这种情况需要结合操作系统进行相关调整。

因此:我们需要结合不同情况对tomcat内存分配进行不同的诊断才能从根本上解决问题

tomcat手动配置部署

Tomcat手动配置部署 刘晓涛讲授,孙娟总结 手动创建JSP项目 1.将外置Tomcat解压出来后,在Tomcat里面的webapps文件夹创建一个放JSP项目的文 件夹“MyWeb”,如图: 2.在“MyWeb”JSP项目中创建必须的WEB-INF文件夹,如图: 3.在WEB-INF文件夹中也要必须创建lib文件夹,classes文件夹与web.xml文件, 如图:

4.当我们创建好JSP项目必须的WEB-INF文件夹后,我们开始创建我们在项目中所需要 的静态文件,现在我们只创建一个jsp文件夹(此文件夹跟WEB-INF在同一目录下),用来存放jsp文件,如图: 5.在jsp文件夹中创建一个jsp文件,如图: 现在我们手动创建的JSP项目就创建成功了 如何将Tomcat中的文件进行修改 1.为了保护资源的安全,我们需要有用户通过验证才可以进入我们的程序,所以我们要将 Tomcat中的conf文件夹中的tomcat-users.xml文件进行修改,如图: 说明: Rolename:是角色 Username:用户名 Password:用户名的密码 整体讲:在XXX角色下,用户可以通过用户名及密码可以访问程序中的资源

修改完后,我们就有一个用户“shmily”可以进入程序了,密码是”shmily” 2.当我们设置了用户登陆后,我们还要返回到我们的JSP项目中去,修改我们的web.xml 文件,与我们刚刚设计好的用户登陆设置相关联,如图: 注意:有注释的地方都是需要修改的地方,也就是我们刚才在tomcat-users.xml中设置的角色名

现在我们就修改完成了,那么现在我们就开始运行我们的JSP项目了 如何运行JSP项目 1.在运行JSP项目之前我们要启动tomcat(在tomcat中的bin文件夹中的startup.bat),如 图: 2.启动完后,我们开始浏览器,输入http://localhose:8080/如图:

运维项目工作总结 参考

xxxx运维服务工作总结

目录 1概述....................................................................... 2运维项目背景............................................................... 3运维目标................................................................... 4运维人员配备............................................................... 5运维工作总结............................................................... 5.11-8月份................................................................... 5.1.1XXXX系统测试与部署 ................................................... 5.1.2协助XXXX机房搬迁..................................................... 5.1.3二线专家支撑.......................................................... 5.1.4XXXX系统优化 ......................................................... 5.29-12月份.................................................................. 5.2.1系统运维支撑.......................................................... 系统巡检方式............................................................ 远程方式............................................................. 现场方式............................................................. 系统维护巡检内容........................................................ 远程方式巡检内容..................................................... 现场方式巡检内容.................................................... 系统运行分析............................................................ 系统CPU分析......................................................... 系统内存分析......................................................... 系统硬盘空间分析..................................................... 系统进程运行分析..................................................... 系统故障分析......................................................... 现网作业工作............................................................ 5.2.2业务协维.............................................................. 系统业务管理............................................................ 运营支撑内容............................................................ ZS业务客户服务与支持..................................................... 运营数据分析............................................................ 5.2.3专家服务.............................................................. 运维体系的建立.......................................................... 输出文档 ............................................................... 运维、系统二线支撑......................................................

如何修改和查看tomcat内存大小

如何修改和查看tomcat内存大小 为了解决tomcat在大进行大并发请求时,出现内存溢出的问题,请修改tomcat的内存大小,其中分为以下两种方式: 一、使用catalina.bat 等命令行方式运行的tomcat 查看系统最大支持内存命令:java -Xmx1024m -version 1、修改tomcat\bin\Catalina.bat 文件 windows环境下: 在166行左右 rem Execute Java with the applicable properties ”以下每行 %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTI ON% 在%DEBUG_OPTS% 后面添加-Xms256m -Xmx512m linux环境下: 打开在Tomcat的安装目录的bin文件的catalina.sh文件,进入编辑状态. 在注释后面加上如下脚本: JAVA_OPTS='-Xms512m -Xmx1024m' JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=64M -XX:MaxPermSize=256m" 其中JAVA_OPTS='-Xms512m -Xmx1024m' 是设置Tomcat使用的内存的大小. -XX:PermSize=64M -XX:MaxPermSize=256m 指定类空间(用于加载类)的内存大小 保存后,重新以命令行的方式运行tomcat ,即可,然后通过最后面介绍的如何观察tomcat现有内存情况的方法进行查看是否已经变更成功。 二、使用系统中的“服务”,或者开始菜单的可执行程序运行的tomcat 1、关闭现在正在运行的tomcat

linux下tomcat的配置及项目的部署流程

Java的安装配置 1.在/etc/profile文件中配置相应的信息(如下) export JAVA_HOME=/usr/java/jdk1.6.0_20 export JRE_HOME=/usr/java/jdk1.6.0_20/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH 2.是配置文件生效命令:Source /etc/profile 3.输入javac –version查看配置是否成功 TOMCAT安装配置 1.修改tomcat/bin文件夹下的catalina.sh文件,增加如下的内容: export JAVA_HOME=/usr/java/jdk1.5.0_08 export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin export CATALINA_HOME=/usr/local/tomcat (红色可选部分) usr/local/tomcat/bin/catalina.sh start 在/etc/rc.d/rc.local中加入: /usr/local/tomcat/bin/startup.sh(实现自动启动) 2.修改tomcat/conf文件夹下的tomcat-users.xml文件,添加相应的用户角色(manager)及用户信息(用户名及密码),具体的添加详见文件中的模板:

运维项目工作总结参考

运维项目工作总结参考-CAL-FENGHAI.-(YICAI)-Company One1

xxxx运维服务工作总结

目录

1概述 2011年对于XXXX来说是具有历史意义的一年,XXXX成功上线到接入第一个业务系统:集团采购门户系统,揭开了XXXXXXXX认证的一个新的篇章,XXXX 公司作为XXXX的运维服务方,在历史的一年即将过去,通过对XXXX运维工作进行年度总结,从中发现工作中的不足,在以后的工作中逐渐改善。 2运维项目背景 3运维目标 XXXX公司为XXXX系统提供运行维护服务包括,XXXX软件系统、系统相关的主机设备、操作系统、数据库和存储设备的运行维护服务,保证XXXX系统整体的正常运行,降低整体管理成本,提高XXXX系统的整体服务水平。同时根据日常维护的数据和记录,提供XXXX系统的整体建设规划和建议,更好的为XXXX发展提供有力的支持。 同时XXXX公司为XXXX系统提供业务协维服务,包括业务系统接入前期业务支撑、业务系统接入后期业务支撑,为业务系统提供专业的业务指引、开发指引,方便各业务系统快速接入XXXX系统。 XXXX系统的组成主要可分为两类:硬件设备和软件系统。硬件设备包括网络设备、安全设备、主机设备、存储设备等;软件设备可分为操作系统软件、典型应用软件(如:数据库软件、中间件软件等)、业务应用软件等。 XXXX公司通过运行维护服务的有效管理来提升XXXX系统的服务效率,结合用户现有的环境、组织结构、IT资源和管理流程的特点,从流程、人员和技术三方面来规划用户的网络信息系统的结构。将用户的运行目标、业务需求与IT服务的相协调一致。 XXXX公司提供的服务的目标是,对用户现有的XXXX系统基础资源进行监控和管理,及时掌握网络信息系统资源现状和配置信息,反映XXXX系统资源的可用性情况和健康状况,创建一个可知可控的IT环境,从而保证XXXX系统的各类业务应用系统的可靠、高效、持续、安全运行。 4运维人员配备 XXXX运维人员梯队结构 人的因素是决定运维服务好坏的最重要的因素,合理的人力配置能够提高运维的质量和效率,保障运维工作的顺利开展, XXXX公司通过人力资源的整合

服务器配置总结

关于服务器配置的总结 工具:J2EE 服务器:Xampp Apache tomcat 时间:8.21-8.22 使用eclipse开发好JavaWeb后,需要将网站文件部署到服务器下才能够正常地使用浏览器进行访问。整个过程大概可以分为以下几个阶段。 一、确保Tomcat正常运行 正常运行的标志是在xampp集成环境中,单击Tomcat后的start按钮后,Tomcat给出如下反馈: 10:46:44 [Tomcat] Attempting to start Tomcat app... 10:46:46 [Tomcat] Status change detected: running 此阶不成功的原因主要是端口配置有误,所需的端口被其它程序占用,需要检查的端口有: 通常不能正常启动时,查看logs下的服务日志catalina.YYYY-MM-DD.log看那个端口被占用,若被占用就该为其它端口(比如加1减1),当Server port控制关闭的端口被占用时不容易发现。 二、确保网站配置正确 当Tomcat运行成功时,在浏览器中输入localhost:8080(配置的端口值),应该出现一个Apache的欢迎页面,如果没有出现,检查以下两个原因: 第一种情况是在webapps/ROOT/WEB-INF/web.xml中没有在标签对中写入index.jsp;第二种情况则是由于webapps/ROOT文件夹下没有Apache 提供的index.jsp文件。 这两个问题并不会的网站部署带来实质问题,但是可以通过检查此项,确认Tomcat是否正常运行,是否真正地配置成功了。 三、部署网站 网站的部署有多种方式,本人使用的是在server.xml中使用标签建立一个新主机,设置其docBase为网站所在的目录。然后再项目文件夹下配置

如何安装监控tomcat服务,防止tomcat死掉系统无法服务的问题

安装tomcat监控服务 安装tomcat监控服务的目的是为了随时监测tomcat的运行状况,若出现内存溢出或其它不能提供正常服务的情况,系统自动能重启tomcat服务,由此减少开发服务人员的工作量,也能提高服务质量。 安装设置分为以下四个步骤: 一、创建监控页面 在项目系统里添加一个提供监控系统访问的页面monitor.jsp,只需输出一句代码,代码如下: <% String s=”ok”; out.println(s.length()); %> 二、修改tomcat配置 若是系统自动安装的服务,可直接跳过这一步。但是需确定服务名称,以便在以后的步骤使用,如下图: 服务名称 若是手动为tomcat设置服务,请按以下步骤进行: 1、进入tomcat目录下的bin目录,用记事本打开service.bat文件,找到set SERVICE_NAME=TOMCA TXX这一句,把后面的值改成自己对tomcat设置的服务名,把PR_DISPLAYNAME的值设置为显示的服务名称,这个是在系统管理的服务里面中列表里显示的名字。

如设置信访系统,则设置为这样: Set SERVICE_NAME=xfgl Set PR_DISPLA YNAME=tomcat xfgl 保存。 2、在运行里输入“CMD ”,进入命令控制台,使用cd 命令转到tomcat 目录下的bin 目录,运行service.bat install 命令,把tomcat 设置为系统启动服务。 3、进入控制面板->管理工具->服务,在服务列表中找到“tomcat xfgl ”一项,双击弹出窗口,把启动类型改为“自动”,确定保存。 三、 设置监控脚本文件 新建一个vbs 脚本文件,用于访问tomcat 服务下的一个jsp 页面monitor.jsp 。脚本代码如下: 该脚本的目的是定时访问monitor.jsp 页面,判断页面返回的状态码,若状态不为200 ,

自动化运维项目总结报告

自动化运维系统研发项目 总结报告 一、项目背景 随着信息时代的持续发展,IT运维已经成为IT服务内涵中重要的组成部分。面对越来越多复杂的业务、多样化的用户需求,不断扩展的IT应用需要越来越合理的模式来保障IT服务能灵活便捷、安全稳定地持续保障,从初期的几台服务器发展到庞大的数据中心,单靠人工已无法满足在技术、业务、管理等方面的需求,那么标准化、自动化、架构优化、过程优化等降低IT服务成本的因素越来越被广大行业客户重视。 二、自动化运维研发阶段性 经过对市场背景的分析,在公司高层资源的支持下,2016年7月完成项目立项及成立研发项目团队,12月已完成初步框架认定工作,在对市场需求、业务环境调研过程中,认为自动化运维需满足架构独立、部署友好、可运维性、容错容灾、质量监控、性能成本、用户体验等特点。项目组经过半年的研发努力,项目研发有了阶段性的突破成果。 2.1架构独立 任何架构的产生都是为了满足特定的业务诉求,如果我们在满足

业务需求的同时,能够兼顾运维对架构管理的非功能性要求。那么我们有理由认为这样的架构是对运维友好的。站在运维的角度,所诉求的架构独立包含四个方面:独立部署、独立测试、组件规范、技术解耦等。 2.2部署友好 希望从端到端打通开发、测试、运维的所有技术环节,以实现快速部署和交付价值的目标。实现高效可靠的部署能力,要做好全局规划,要保证部署以及运营阶段的全方位运维掌控,从以上要求分析,有五个维度是对部署友好相关的:CMDB配置、环境配置、依赖管理、部署方式、发布自测等。 2.3可运维性 运维从脑海中是最理想的服务架构,首先想到的事可运维性强的那种类型。不具可运维的应用或架构,对运维团队带来的不仅仅是难题,还有阻止运维人员职业发展前进堵绊脚石,因为维护一个没有可运维性的架构,简直就是在浪费运维人员的时间。因为可运维性按操作和管理规范应归纳为以下几点:配置管理、版本管理、标准操作、进程管理、空间管理、日志管理、集中管控等。 2.4容错容灾 运维的四大职责:质量、效率、成本、安全。安全是一个运维团队首要保障的,运维人员立项的高可用架构设计应该包含以下几点:

常用java技巧总结

面向对象的思想特点 A:是一种更符合我们思想习惯的思想 B:可以将复杂的事情简单化 C:将我们从执行者变成了指挥者 面向对象: 我们怎么才能更符合面向对象思想呢? A:有哪些类呢? B:每个类有哪些东西呢? C:类与类直接的关系是什么呢? 开发,设计,特征 面向对象开发 就是不断的创建对象,使用对象,指挥对象做事情。 面向对象设计 其实就是在管理和维护对象之间的关系。 面向对象特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism) 继承:把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些内容。这个关系叫继承。 继承的好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类产生了一个关系,是多态的前提 继承的弊端: A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。 原则:低耦合,高内聚。 耦合:类与类的关系 内聚:自己完成某件事情的能力 B:打破了封装性 Java中继承的特点 A:Java中类只支持单继承 B:Java中可以多层(重)继承(继承体系) 继承的注意事项: A:子类不能继承父类的私有成员 B:子类不能继承父类的构造方法,但是可以通过super去访问 C:不要为了部分功能而去继承

多态:同一个对象在不同时刻体现出来的不同状态。 多态前提: A:有继承或者实现关系。 B:有方法重写。 C:有父类或者父接口引用指向子类对象。 多态中的成员访问特点 A:成员变量 编译看左边,运行看左边 B:构造方法 子类的构造都会默认访问父类构造 C:成员方法 编译看左边,运行看右边 D:静态方法 编译看左边,运行看左边 多态的好处 提高了程序的维护性(由继承保证) 提高了程序的扩展性(由多态保证) 多态的弊端 不能访问子类特有功能 静态的特点: A:随着类的加载而加载 B:优先与对象存在 C:被类的所有对象共享 这其实也是我们判断该不该使用静态的依据。 D:可以通过类名调用 静态变量和成员变量的区别 A:所属不同 静态变量:属于类,类变量 成员变量:属于对象,对象变量,实例变量 B:内存位置不同 静态变量:方法区的静态区 成员变量:堆内存 C:生命周期不同 静态变量:静态变量是随着类的加载而加载,随着类的消失而消失 成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失D:调用不同 静态变量:可以通过对象名调用,也可以通过类名调用 成员变量:只能通过对象名调用

一次使用EclipseMemoryAnalyzer分析Tomcat内存溢出

前言 在平时开发、测试过程中、甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题。我们需要找造成OutOfMemoryError原因。一般有两种情况: 1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案; 2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。 以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍的是使用Eclipse Memory Analyzer tool(MAT)工具分析的过程。 生成dump文件 通过jvm参数--XX:-HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出是Dump出当前的内存转储快照; 或者,用jmap生产dump文件,win通过任务管理器查看tomcat的进程pid,linux用ps命令查看进程pid,然后用jmap命令(Java5:jmap -heap:format=b ;Java6:jmap -dump:format=b,file= )。 我这里使用的是,我一生产环境项目,运行一段时间大概3周的样子,就会报OutOfMemoryError。(ps:这个项目出现这种情况已经有好长一段时间了,我们之前的做法是定期的重启tomcat,没有去分析它的原因。)JDK64位主要参数: -Xmx3078M -Xms3078M -XX:PermSize=1024M -XX:MaxPermSize=1024M,内存还是蛮大的。 MAT安装与介绍 下载地址:。 通过MAT打开dump出来的内存文件,打开后如下图: 从上图可以看到它的大部分功能。 1. Histogram可以列出内存中的对象,对象的个数以及大小。 2. Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。 consumers通过图形列出最大的object。 Suspects通过MA自动分析泄漏的原因。 Histogram如下图: Objects:类的对象的数量。 Shallow size:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。 Retained size:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。

Tomcat服务器性能调优几个方面

Tomcat性能调优几个方面 一、操作系统调优 对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU的处理能力越强,系统运行速度越快。。 【适用场景】任何项目。 二、Java虚拟机调优 应该选择SUN的JVM,在满足项目需要的前提下,尽量选用版本较高的JVM,一般来说高版本产品在速度和效率上比低版本会有改进。 JDK1.4比JDK1.3性能提高了近10%-20%,JDK1.5比JDK1.4性能提高25%-75%。因此对性能要求较高的情况推荐使用 JDK1.6。 【适用场景】任何项目。 三、Apache集成Tomcat Web服务器专门处理HTTP请求,应用服务器是通过很多协议为应用提供商业逻辑。虽然Tomcat也可以作web服务器,但其处理静态html的速度比不上Apache,且其作为web服务器的功能远不如Apache,因此把Apache和Tomcat集成起来,将html和Jsp的功能部分进行明确分工,让Tomcat只处理Jsp部分,其他的由Apache,IIS等web服务器去处理,由此大大提高Tomcat的运行效率。 如果一个项目中大量使用了静态页面、大量的图片等,并有有较大的访问量,推荐使用Apache集成Tomcat的方式来提高系统的整体性能。 Apache和Tomcat的整合有三种方式,分别是JK、http_proxy和ajp_proxy.其中JK方式是最常见的方式,JK本身有两个版本分别是1和2,目前1最新版本是1.2.8,而版本2早已经废弃了。http_proxy是利用Apache自带的mod_proxy 模块使用代理技术来连接Tomcat。Ajp_proxy连接方式其实跟http_proxy方式一样,都是由mod_proxy所提供的功能。只需要把配置中的http://换成ajp://,同时连接的是Tomcat的AJP Connector所在的端口。 相对于JK的连接方式,后两种在配置上比较简单的,灵活性方面也一点都不逊色。但就稳定性而言不像JK这样久经考验,所以建议采用JK的连接方式。Apache+JK+Tomcat配置:

Java Web项目开发总结

1、In Action (1)根据添加信息(insert)来考虑表中的字段,进行建表。使用PD画出ER图。要注意字段的数据类型的确定以及建表要满足三范式,减少数据冗余; (2)表建好后,根据表中各个字段来建pojo中的属性。要注意属性的数据类型和字段的数据类型要一致; (3)根据pojo中的属性确定bean的属性,直接拷贝即可,用于页面展示。在bean中,统一使用String类型变量接收前台页面传递的参数;每个HTML表单对应一个bean。HTML 表单中的字段和bean中的属性一一对应。 (4)自顶向下,依次定出action、manager、dao。先写出轮廓,跑通整个流程,再写具体实现,一点点累加,便于调试错误; (5)根据数据实体和具体业务逻辑,使用StarUML画类图,进行OOA和OOD,灵活运用设计模式。 (6)API命名: CRUD:add,get,update,delete,[list] 严格区分单复数形式,单数表示对象,复数表示对象集合。 对象、属性最好单个单词。 (7)前后台都要校验。 (8)按照资源方式组织数据接口,对前端开发帮助很大。即通过REST来实现资源的增、删、改、查。 (9)软件开发,思路最重要!代码开发多了,思路就有了。 a、一个版本一个版本递增的开发;每个版本增加一点内容; b、总结开发思路;第一步怎么做,下一步怎么做? c、用文档记录开发的思路,即第一个版本开发实现了什么功能以及开发步骤,下一个版本实现了什么功能等等?

d、程序员进行程序开发时,不要仅仅停留在代码,要深入到底层的运行机制,才可以对程序的运行机制有更准备的把握; (10)网页模板 request到template.jsp文件(此文件假设包括三个部分,即title、banner、body) web客户——> title banner———————>include:banner.jsp body————————>include:showcart.jsp (11)一步一步的定位。根据结果进行分析。 (12)分页控件 假分页: 基本思想是将所有的数据从数据库中取出,只显示有用的部分。靠的是程序的算法,实际上就是在ResultSet上进行操作。 真分页:(数据库中的一种实现) 任何数据库都会提供分页的函数操作:Oracle、MySQL(limit,即limit 开始的记录, 要查询的行数)、SQL Server(top) 基本思想是在数据库中编写特定的SQL语句。程序中只读取有用的部分,没用的部分不会加载到内存中。 (13) 2、TIPS

keil错误总结

KEIL编译错误信息表 错误代码及错误信息错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3: Unknown identifier 未定义的标识符 error 4: Duplicate identifier 重复定义的标识符 error 5: Syntax error 语法错误 error 6: Error in real constant 实型常量错误 error 7: Error in integer constant 整型常量错误 error 8: String constant exceeds line 字符串常量超过一行 error 10: Unexpected end of file 文件非正常结束 error 11: Line too long 行太长 error 12: Type identifier expected 未定义的类型标识符 error 13: Too many open files 打开文件太多 error 14: Invalid file name 无效的文件名 error 15: File not found 文件未找到 error 16: Disk full 磁盘满 error 17: Invalid compiler directive 无效的编译命令 error 18: Too many files 文件太多 error 19: Undefined type in pointer def 指针定义中未定义类型 error 20: Variable identifier expected 缺变量标识符 error 21: Error in type 类型错误 error 22: Structure too large 结构类型太长 error 23: Set base type out of range 集合基类型越界 error 24: File components may not be files or objectsfile分量不能是文件或对象error 25: Invalid string length 无效的字符串长度 error 26: Type mismatch 类型不匹配 error 27:error 27:Invalid subrange base type 无效的子界基类型 error 28:Lower bound greater than upper bound 下界超过上界 error 29:Ordinal type expected 缺有序类型 error 30:Integer constant expected 缺整型常量 error 31:Constant expected 缺常量 error 32:Integer or real constant expected 缺整型或实型常量 error 33:Pointer Type identifier expected 缺指针类型标识符 error 34:Invalid function result type 无效的函数结果类型 error 35:Label identifier expected 缺标号标识符 error 36:BEGIN expected 缺BEGIN error 37:END expected 缺END error 38:Integer expression expected 缺整型表达式

tomcat假死与异常监控

tomcat假死与异常监控 在开发的tomcat服务应用中,经常会遇到tomcat假死情况,除了每次出现假死时找出原因外,有时候由于业务的重要性,需要及时发现服务异常并及时解决。所以本人就想通过Linux定时任务定时监控的方式来预防这个问题,一旦发现及时通知告警并重启服务,然后才通过日志查明原因从根本上解决。 1)tomcat假死状态 处于假死状态时,后台日志不在生成,服务链接没有响应,但tomcat的进程是存在的,所以若要监控是否处于假死状态可以从日志和服务链接方面入手,但由于检测日志比较麻烦,本人选择的是通过选择某个服务链接获取其访问状态码http_code,若状态码不正常则确认为tomcat服务异常。 例如: url=“http://localhost/….” code=$(curl -o /dev/null --retry 3 -s -w %{http_code} $url) echo “${code}” 上面脚本中url变量为选择的适合的监控链接,code就是该链接正常时应该返回的返回码,正常是为200,有时候由于浏览器缓存可能返回302等也是正常的,所以建议最好选择那种后台的链接能够返回200的,这样检测起来比较方便。 2)tomcat异常监控 在tomcat运行日志中,经常会出现一些异常,对于有些异常我们可以不用管,但例如数据库链接异常、内存溢出异常等,这些异常会直接导致服务不能正常使用,所以需要对这些类型的异常进行监控,同样的本人也是通过Linux脚本实时检查tomcat运行日志的方式来检测服务状态。 脚本如下: errormessage1="https://www.doczj.com/doc/8818936128.html,ng.OutOfMemoryError" if cat ${tomcatpath}/logs/catalina.out |grep "$errormessage1">/dev/null then restartFlag="yes" 其实就是通过cat |grep 的方式来查找异常特征字符串是否在运行日志文件中存在,存在则代表出现了该类异常,当然这是需要程序对该类异常做了处理的(捕捉到并输出到控制台)。附带说明:语句 cat …加上了 >/dev/null是为了不输出具体查询的结果的 3)tomcat重启 检查出这些异常时,一般先通过重启服务的方式来优先恢复服务,则对tomcat进行脚本重启。tomcat重启的原理是:先通过命令获取tomcat进程id,然后kill掉该进程id,再重启tomcat命令即可,具体命令如: #tomcat部署路径 tomcatpath="/data/apps/tomcat" #获取tomcat进程id pid=$(ps -ef |grep java| grep ${tomcatpath} |grep -v grep | awk '{print $2}') kill -9 $pid cd ${tomcatpath} ./bin/startup.sh

Tomcat部署项目时启动报错总结

Tomcat部署项目时启动报错总结 1、虚拟机报错端口被占用 tomcat的默认端口是8080(或者其他自己设置的),可能已经被其他占用。 解决方法:在tomcat安装路径下conf文件夹中的server.xml中把断口号改掉!如果一台机 器上使用多个tomcat,则改掉所有相关的端口避免重复了,包括想如下 在server.xml中找到如下地方改掉port的值 ● ●(改完后看看和本机上正在用 的tomcat是不是有重复的port) 2、tomcat的启动窗口一闪而过 Tomcat启动的dos窗口一闪而过,如何看出错信息? 在DOS窗口运行STARTUP.BAT文件, 另外,吧startup.bat文件最后的 call "%EXECUTABLE%" start %CMD_LINE_ARGS% 改成: call "%EXECUTABLE%" run %CMD_LINE_ARGS% 分析原因1:jdk的环境变量没有配置好 解决方法:检查jdk环境变量的配置是否正确,或者重新配置jdk的系统环境变量JDK环境变量配置的步骤如下: 1.我的电脑-->属性-->高级-->环境变量. 2.配置用户变量: a.新建JAVA_HOME C:\Program Files\Java\j2sdk1.5.0(JDK的安装路径) b.新建 PATH (注意:把java的配置放在path的最前面) %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin c.新建CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 3.测试环境变量配置是否成功: 开始-->运行--〉CMD 键盘敲入:JAVAC JAVA 出现相应的命令,而不是出错信息,即表示配置成功! 环境变量配置的理解: 1. PATH环境变量。作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin 目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。 2. CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPTH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。 3. JAVA_HOME环境变量。它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。

软件测试总结

一、软件测试流程 整体流程:测试需求分析,测试计划编写,测试用例编写,测试执行,缺陷记录,回归测试,判断测试结束,测试报告提交。 测试流程依次如下: 1.需求:阅读需求,理解需求,与客户、开发、架构多方交流,深入了解需求。--testing team。一般而言, 需求分析包括软件功能需求分析、测试环境需求分析等 2.测试计划: 根据需求估算测试所需资源(人力、设备等)、所需时间、功能点划分、如何合理分配安排资 源等。---testing leader or testing manager。测试目的、测试环境、测试方法、测试用例、测试工具 3.用例设计:根据测试计划、任务分配、功能点划分,设计合理的测试用例。---testing leader, senior tester 4.执行测试:根据测试用例的详细步骤,执行测试用例。--every tester(主要是初级测试人员) 5.执行结果记录和bug记录:对每个case记录测试的结果,有bug的在测试管理工具中编写bug记录。--every tester(主要是初级测试人员) 6.defect tracking(缺陷跟踪):追踪leader分配给你追踪的bug.直到 bug fixed。--every tester 7.测试报告:通过不断测试、追踪,直到被测软件达到测试需求要求,并没有重大bug. 8.用户体验、软件发布等…… 总结:项目立项后,开始写测试计划,根据需求编写测试需求,根据测试需求编写测试用例,根据测试用例执行测试,把没用通过的测试用例写成测试缺陷报告,进行回归测试,直到测试的结束编写测试总结,这每个步骤都需要审核通过。 二、软件测试方法 1、黑盒测试 概念:完全不考虑程序或软件的内部逻辑结构和处理过程的情况下,根据需求分析编写并执行测试用例,在程序或软件的界面上进行测试。 主要目的:(1)是否有不正确的或者遗漏的功能。(2)能都正确输入和输出结果。(3)是否有数据结构错误或外部信息访问错误。(4)性能上是否满足要求。(5)是否有初始化或终止行错误。 优点:(1)即使程序发生变化,之前的测试用例依然可以使用;(2)测试用例和软件开发可以同时进行,加快了测试和开发的速度。 局限性:(1)难以查找问题的原因和位置;(2)黑盒测试的依据是需求分析,所以无法发现需求分析上的错误。 测试方法: (1)等价类划分 包括有效等价类(符合需求规格说明)和无效等价类(违反需求规格说明)。 a)确定输入取值范围:可以确定一个有效等价类和两个无效等价类 b)确定输入某个值:可以确定一个有效等价类和两个无效等价类

JAVA重点知识总结

CoreJava部分 1简述下java基本数据类型及所占位数,java基本数据类型:4类8种 整数类型:byte(1byte),short(2byte),int(4byte),long(8byte) 浮点类型:float(4byte),double(8byte) 字符类型:char(2byte) 逻辑类型:boolean(false/true1byte) 2说出5个启动时异常 ------RunTimeException ------NullPointerException ------ArrayIndexOutOfBoundsException ------ClassCastException ------NumberFormatException 3HashMap和HashTable的区别: 1HashMap允许空键值对,HashTable不允许 2HashMap不是线程安全的,HashTable是 3HashMap直接实现Map接口,HashTable继承Dictionary类 4.ArrayList,Vector,LinkedList存储性能和区别 它们都实现了List接口 ArrayList和Vector都是基于数组实现的 LinkedList基于双向循环链表(查找效率低,添加删除容易) ArrayList不是线程安全的而Vector是线程安全的,所有速度上ArrayList高于Vector 5.Collection和Collections的区别 Collection是集合类的上级接口,继承与他的接口主要有Set和List Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。 6List、Map、Set三个接口,存取元素时,各有什么特点? List以特定次序来持有元素,可有重复元素。 Set无法持有重复元素,内部排序 Map保存key-value值,value可多值。 7final,finally,finalize的区别 Final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承Finally是异常处理语句结构的一部分,表示总是执行 Finalize是Object类的一个方法,在垃圾收集时的其他资源回收,例如关闭文件等。8Overload和Override的区别。Overload的方法是否可以改变返回值的类型? 方法的重写Override和重载Overload是Java多态的不同表现。 重写Overriding是父类与子类之间多态的一种表现,方法名,参数列表返回值类型都得与父类的方法一致。 重载Overloading是一种类中多态的一种表现。重载的方法是可以改变返回值类型的。9用一句话总结一下冒泡排序 依次比较相邻的两个数,将小数放在前面,大数放在后面。 10实现线程安全的两种方式 1)synchronized方法:通过在方法声明加入synchronized关键字来声明synchronized方法

相关主题
文本预览
相关文档 最新文档