解决Java中OutOfMemoryError的问题
目前为止,我遇到使用Tomcat有三种情况:第一,使用Eclipse,在Eclipse中配置Tomcat。第二,直接在Tomcat中部署项目。第三将Tomcat安装为windows服务。
在这三种情况下,出现OutOfMemoryError.该怎么解决呢?这里我不得不提我被网上那些不负责任的文章害得很惨。各种设置内存的方法都试了,可就是不起作用。下面我说的这几种方法都是我亲自试验过的,没有问题。
第一种情况:
如图:我用红色框框出来的。其中Xms和Xmx是增加java虚拟机初始堆大小和最大堆大小参数,主要是解决由于Java Heap Space不足造成的原因。XX:PermSize和XX:MaxPermSize是增加初始永久保存区域大小和最大永久保存区域大小的参数,主要解决程序中使用了大量的jar或class,java虚拟机装载类的空间不够,与Permanent Generation space有关。
第二种情况:
直接把编译好的项目放在Tomcat中,采用startup.bat启动Tomcat服务。如下在Tomca的bin文件夹下:
这种情况下,我们要修改catalina.bat里面的参数。打开它。找到这两句:
rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
在这两句之上加上这句,一定要之上:set "JAVA_OPTS=-Xms512M -Xmx1024M -XX:PermSize=256m -XX:MaxPermSize=512m"
网上很多类似的,但是试过好多都不行,一定要注意:它的位置,和引号等细节。
第三种情况:
如果你的tomcat是注册为windows服务并且是以服务方式启动的,那么上面的方法就无效了,因为这时tomcat启动是读取注册表的参数,而不是读取批处理文件的参数,这时我们来这样设置jvm参数。:在Tomcat的bin目录下找到tomcat7w.exe,打开:
在java选项下:下方的Initial memory pool就是初始化堆内存大小,Maximun memory pool是最大堆内存大小。而要设置Perm Gen池的大小就要在Java Option里面加参数了,在里面加上:
-Dcatalina.base=%tomcat_home%
-Dcatalina.home=%tomcat_home%
-Djava.endorsed.dirs=%tomcat_home%\endorsed
-Djava.io.tmpdir=%tomcat_home%\temp
-XX:PermSize=256M
-XX:MaxPermSize=256M
-XX:ReservedCodeCacheSize=48M
-Duser.timezone=GMT+08
(每一行后面不要有空格)这种方法我试过了,管用呢。还可以通过直接在注册表中添加参数。这个就不介绍了,自己没试过。
其实解决Tomcat内存的问题并不难,难得是你怎么知道这是由于Tomcat内存溢出异常造成的。我们之前在这个问题上困扰了好久。如果使用Eclipse,console里会打印出错误信息,那么直接就可以判断是OutOfMemoryError,如果是直接部署到Tomcat中,以startup.bat启动,则也可以看到打印出来的错误信息。可是我们偏偏是把Tomcat服务安装成了Windows的服务,那么看不到任何错误的提示。项目启动后,一直都处于等待状态,很慢很慢,让人摸不着头脑, 正赶上数据库也弄罢工,就一直以为是数据库问题。总之一句话:经验不足。
以上就是关于解决Java中OutOfMemoryError的全部内容,希望对大家的学习有所帮助。
相关推荐
-
解析java中的error该不该捕获
写java程序时,通常会被提示捕获异常,而又有一些异常是不需要强制捕获的,这是一个被说烂了的话题.像我一样从其他语言转过来的人确实有点迷惑,那我以我的理解重新解释一遍吧. 异常的基类是Exception,Exception子类有RuntimeException和其它Exception.这些其它的Exception叫做Checked异常,RuntimeException叫做Unchecked异常. 只看名字不太好理解,说的通俗点,java为了程序能够稳定的运行,就提示开发者捕获已知异常.编译器知道
-
解决Eclipse add external jars运行出现java.lang.NoClassDefFoundError的方法
最近发现一个问题,有时候对一个Android项目反复的Add jar和remove jar,发现编译可以通过,但是运行起来当应用到外部jar的对象时,会抛出java.lang.NoClassDefFoundError异常.导致程序奔溃. 查看项目属性,发现java build path里比正常的项目少了Android Dependencies这一项: 通过和丢失之前的项目进行比对,发现差别在于工程根目录下的.classpath文件,<classpathentry exported="tru
-
c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法
错误为: Android.mk文件 c++的调用方法为: 复制代码 代码如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TestNdk LOCAL_CPP_EXTENSION :=com_ndk_test_JniClient.cpp include $(BUILD_SHARED_LIBRARY) c中的调用方法: 复制代码 代码如下: LOCAL_SRC_FILES := com_ndk_test_Jn
-
javascript window.onerror事件学习新收获
在捕获js错误时,我们通常使用try{}catch(e){}的方式,然后通过e.errorMessage等方式获取错误信息然后报告错误.但对于onerror事件可能很少问津,我们是否思考过如何报告错误所在的行号?如果想过这个是否也被这个问题所困扰过,是否认为在js里不可能捕获错误的行号呢?其实本人就遇到上述的几个问题,今日读某人写的一段js代码顿然发现了onerror事件,要说onerror这个时间也是n久以前就知道了,但对于其所带有的三个参数和其特殊性质却一直没有去了解过.经过自己的研究测试,
-
捕获和分析JavaScript Error的方法
如何捕获和分析 JavaScript Error 前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常信息.反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Page App 流行之前还是成立的.现在的 Single Page App 运行一段时间后状态复杂无比
-
JavaScript中的onerror事件概述及使用
1.Window.onerror事件 onerror事件用来协助处理页面中的JavaScript错误.当页面上出现异常时,error事件便在window对象上触发.例如: 在这种情况下,浏览器会显示错误信息: . 如果不希望浏览器在默认对话框中显示出错消息,让onerror方法返回true即可. 此外,onerror方法还提供了三个参数用来确定错误确切的信息,分别是: 1)message:一个字符串,声明了出现的错误的信息(不同的浏览器中返回的消息内容略有差异). 2)url:一个字符串,声明了
-
java进行error捕获和处理示例(java异常捕获)
下面给个小例子,来验证一下error的捕获. 复制代码 代码如下: public class TestCatchError extends Error{ private static final long serialVersionUID = -351488225420878020L; public TestCatchError(){ super(); } public TestCatchError(String msg){ super(msg); } p
-
JS高级调试技巧:捕获和分析 JavaScript Error详解
反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Page App 流行之前还是成立的.现在的 Single Page App 运行一段时间后状态复杂无比,用户可能进行了若干输入操作才来到这里的,说刷新就刷新啊?之前的操作岂不要完全重做?所以我们还是有必要捕获和分析这些异常信息的,然后我们就可以修改代码避免影响用户体验. 捕获异常的方式 我们自己写的 throw new Error() 想要捕获当然可以捕获
-
javascript Error 对象 错误处理
Error对象 Property: name: 错误名 number: 错误号 description: 描述 message: 错误信息,多同description FF Only 属性 fileName: 错误发生的文件 stack: 错误发生时的调用堆栈 Constructor: Error(){ this(0,"")} Error(description){ this(0,description)} Error(number,des
-
解决Java中OutOfMemoryError的问题
目前为止,我遇到使用Tomcat有三种情况:第一,使用Eclipse,在Eclipse中配置Tomcat.第二,直接在Tomcat中部署项目.第三将Tomcat安装为windows服务. 在这三种情况下,出现OutOfMemoryError.该怎么解决呢?这里我不得不提我被网上那些不负责任的文章害得很惨.各种设置内存的方法都试了,可就是不起作用.下面我说的这几种方法都是我亲自试验过的,没有问题. 第一种情况: 如图:我用红色框框出来的.其中Xms和Xmx是增加java虚拟机初始堆大小和最大堆大
-
完美解决java.lang.OutOfMemoryError处理错误的问题
原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 常见错误提示: 1.tomcat:java.lang.OutOfMemoryError: PermGen space 2.tomcat:java.lang.OutOfMemoryError: Java heap space 3
-
完美解决Java中的线程安全问题
给出一个问题,如下: 解决方案如下: public class Demo_5 { public static void main(String[] args) { //创建一个窗口 TicketWindow tw1=new TicketWindow(); //使用三个线程同时启动 Thread t1=new Thread(tw1); Thread t2=new Thread(tw1); Thread t3=new Thread(tw1); t1.start(); t2.start(); t3.s
-
解决Java中的强制类型转换和二进制表示问题
1.Java中用补码形式表示 2.第一位正负位,1表示负,0表示正. 3.原码:一个数的二进制表示. 3的原码00000011 -3的 原码 100000114.反码:负数原码按位取反(符号位不变).正数原码本身. 3的反码00000011 -3的反码111111005.补码:正数是原码本身.负数反码加1. 3的补码是00000011 -3的补码是11111101int占4个字节,32位 byte占1个字节,8位 所以强转时会截断.前24位 在内存中表示形式( 注意java中是以补码表
-
解决Java中由于数据太大自动转换成科学计数法的问题
1.java后台 (1)使用BigDecimal类 方式一:String str=new BigDecimal(num+"").toString(); 方式二:String str=new BigDecimal(num.toString()).toString(); (2)使用DecimalFormat类 //注意,这种方式是保留几位小数 String str=new DecimalFormat("0.00").format(num); 2.JSP页面 (1)使用j
-
解决Java中SimpleDateFormat线程不安全的五种方案
目录 1.什么是线程不安全? 线程不安全的代码 2.解决方案 ① 将SimpleDateFormat变为局部变量 ② 使用synchronized加锁 ③ 使用Lock加锁 ④ 使用ThreadLocal ⑤ 使用DateTimeFormatter 3.线程不安全原因分析 4.各方案优缺点总结 1.什么是线程不安全? 线程不安全也叫非线程安全,是指多线程执行中,程序的执行结果和预期的结果不符的情况就叫做线程不安全. 线程不安全的代码 SimpleDateFormat 就是一个典型的线程不安全事例
-
解决Java中properties文件编码问题
目录 1.properties文件显示乱码问题 2.读取properties文件乱码 3.Spring boot的@ConfigurationProperties读取properties文件乱码 总结 1.properties文件显示乱码问题 原因是因为properties默认使用ASCII码,就算在文件中填写了中文,再打开后依然会转换成ASCII码的形式.首先确定properties配置文件的编码格式,通常情况下properties的默认编码格式为ISO-8859-1.更改properties
-
解决Java中的java.io.IOException: Broken pipe问题
Java 中java.io.IOException: Broken pipe 认识broken pipe pipe是管道的意思,管道里面是数据流,通常是从文件或网络套接字读取的数据. 当该管道从另一端突然关闭时,会发生数据突然中断,即是broken. 对于文件File来说,这可能是文件安装在已断开连接的光盘或远程网络上. 对于socket来说,可能是网络被拔出或另一端的进程崩溃. 在Java中,没有具体的BrokenPipeException. 将此类错误包含在另一个异常,例如java.io.I
-
解决Java中socket使用getInputStream()阻塞问题
目录 socket使用getInputStream()阻塞 用线程解决Socket的getInputStream阻塞 1.背景 2.问题 3.原因 4.解决办法 5.Socket通信注意事项 socket使用getInputStream()阻塞 今天用socket进行编程练习时,发现程序到了getInputStream()这里就进行不下去了 Socket socket = new Socket("127.0.0.1", 800); ObjectInputStream reader =
-
如何解决java中遇到的for input string: "" 报错问题
做Java开发的人,一生至少该有一次或多次遇到[For input String: ""]这样的报错问题,原因通常都是出现在字符串强制转换成数值类型的时候报的错. 比如: String yanggb = ""; int num = Integer.parseInt(yanggb); 这段代码就会报出[For input String: ""]的错误信息. 这个时候的解决办法也很简单,只需要在类型转换的时候做一下空值处理就行了. String ya
随机推荐
- node.js中的http.response.getHeader方法使用说明
- 正则表达式u修饰符(支持UTF-16编码)
- Java class文件格式之访问标志信息_动力节点Java学院整理
- 中国地区三级联动下拉菜单效果分析
- 五段实用的js高级技巧
- 详解Hibernate注解方式的二级缓存
- Android开发之微信底部菜单栏实现的几种方法汇总
- C++实现“隐藏实现,开放接口”的方案
- JavaScript实现Sleep函数的代码
- 用于检测进程的shell脚本代码小结
- C++实现自顶向下的归并排序算法
- C#实现客户端弹出消息框封装类实例
- js 进度条实现代码
- PowerShell脚本开发之尝试登录ftp
- Shell脚本配合iptables屏蔽来自某个国家的IP访问
- MySQL 5.7 zip版本(zip版)安装配置步骤详解
- 可以保证单词完整性的PHP英文字符串截取代码分享
- python实现数据预处理之填充缺失值的示例
- 详解使用Spring Security OAuth 实现OAuth 2.0 授权
- python list元素为tuple时的排序方法