JAVA 查询数据库 out of memory报错问题

发布网友 发布时间:2022-04-20 01:48

我来回答

4个回答

热心网友 时间:2022-05-05 16:46

jvm与tomcat内存设置

linix系统平台大并发量下tomcat5.5优化策略(2009-03-11 12:45:24)
标签:linux tomcat5.5 优化策略 it 分类:java

在部署系统后,为了增加系统并发量,系统响应速度,做了一些工作;遂整理如下。

1、修改server.xml文件

<Connector port="80" protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000" minSpareThreads="75" maxSpareThreads="300"
enableLookups="false" redirectPort="8443" acceptCount="200"
connectionTimeout="50000" disableUploadTimeout="true"/>
主要修改了maxThreads、acceptCount。

引用
Google资料说“如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。”

2、增加tomcat启动初始内存设置;catalina.sh – 增加了参数内存设置

内存为2G情况:

JAVA_OPTS="-server -Xms1500M -Xmx1500M -Xss256K -Djava.awt.headless=true -XX:PermSize=M -XX:MaxPermSize=128m"

(补充:-Dfile.encoding=utf8 加入这个,是设置文件写入的编码方式)

引用

Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同
堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大*;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小*。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存*(最大值)
首先JVM内存*于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个*,这个*一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而bit以上的处理器就不会有*了。

-Djava.awt.headless=true

Java在图形处理时调用了本地的图形处理库。在利用Java作图形处理(比如:图片缩放,图片签名,生成报表)时,如果运行在windows上不会出问题。如果将程序移植到Linux/Unix上的时候有可能出现图形不能显示的错误。提示信息:"Can't connect to X11 window server"这是由于Linux的图形处理需要一个X Server服务器。解决办法就是设置参数。

Xss:每个线程的Stack大小。Stack的大小*着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。

Tomcat 怎么增加内存?

转载修改方法开始
打开bin目录,找到catalina.bat(windows系统)或catalina.sh(linux系统),在前边一堆的#号注释结束之后增加如下配置
windows的:
set CATALINA_OPTS="-server -Xms256m -Xmx256m -XX:PermSize=M -XX:MaxNewSize=256m -XX:MaxPermSize=128m"
linux的:
JAVA_OPTS=='-server -Xms256m -Xmx256m -XX:PermSize=M -XX:MaxNewSize=256m -XX:MaxPermSize=128m'
转载修改方法 结束

悬赏:3 发布时间:2008-08-14 提问人:rihoonet (初级程序员)
< > 猎头职位: 北京: 北京知名手机网站诚聘java高级程序员
报错:java.lang.OutOfMemoryError: Java heap space
TOMCAT版本 5.5.23
曾试过的方法。
/tomcat/bin/catalina.bat 加上下面的命令:
set JAVA_OPTS=-Xms32m -Xmx1024m --这样启动不了了。。奇怪。

采纳的答案
2008-08-14 小疯子 (资深程序员)
Java代码
set JAVA_OPTS=-Xms32m -Xmx1024m %JAVA_OPTS%

set JAVA_OPTS=-Xms32m -Xmx1024m %JAVA_OPTS%, 要引用原来的JAVA_OPTS, 不然把原来的覆盖了.

增加Tomcat虚拟内存大小

--------------------------------------------------------------------------------

JVM的大小设置(unix平台tomcat):调整 $ CATALINA _HOME \bin\catalina.sh文件。
elif [ "$1" = "start" ] ; then
shift
touch "$CATALINA_BASE"/logs/catalina.out
if [ "$1" = "-security" ] ; then
echo "Using Security Manager"
shift
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
else
"$_RUNJAVA" $JAVA_OPTS -Xms1024m -Xmx1024m $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
fi
注意红色部分–Xms1024m –Xmx1024m,这句话表示jvm的最小值为1024M,最大1024M,这个部分的调优需要根据web服务器主机硬件配置不同而调整,初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。

JVM的大小设置(windows平台tomcat):
1)停掉现在的Tomcat服务(假设已经启动)
net stop "Apache Tomcat 4.1"
2)卸载Tomcat服务
tomcat.exe -uninstall "Apache Tomcat 4.1"
3)重新配置启动参数
tomcat.exe -install "Apache Tomcat 4.1" "%JAVA_HOME%\jre\bin\server\jvm.dll" -Djava.class.path="%CATALINA_HOME%\bin\bootstrap.jar;%JAVA_HOME%\lib\tools.jar" -Dcatalina.home="%CATALINA_HOME%" -Xrs -Xmx512m -Xms512m -start org.apache.catalina.startup.Bootstrap -params start -stop org.apache.catalina.startup.Bootstrap -params stop -out "%CATALINA_HOME%\logs\stderr.log"
4)在服务中重新启动Tomcat服务,完成配置。
其中红色部分也是调整jvm的大小的地方。调整原则同上。

另外:查看jvm的方法:$webapp\cache.jsp。需要提醒的是,通过这个页面能看出大概的jvm使用数量大小,通常实际的jvm大小要比页面显示的偏大些。

-----------------------------------------------------------------------------------
秦敏:rem Set JVM Memery Size
set JAVA_OPTS=-Xms800m -Xmx1024m
-----------------------------------------------------------------------------------

windows中大家都知道,JAVA程序启动时都会JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。
所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明,一般的JAVA程序在运行都可以通过中-Xms -Xmx来调整应用程序的初始内存和最大内存:
如:java -Xmsm -Xmx128m a.jar.
tomcat的启动程序是包装过的,不能直接使用java -X..... tomcat.*来改变内存的设置。在Tomcat在改变这个设置
有两种方法:
1. 就需要在环境变量中加上TOMCAT_OPTS, CATALINA_OPTS两个属性,
如 SET CATALINA_OPTS= -Xmsm -Xmx512m;
ms是最小的,mx是最大,m, 512m分别是指内存的容量.
2. 修改Catalina.bat文件
在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% %ACTION% 中的%CATALINA_OPTS% 替换成-Xmsm -Xmx512m(把四行内的%CATALINA_OPTS%都替换掉,包括两边的%)

___________________________________________________________________________________________
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。

可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。

参数

描述

-Xms

JVM初始化堆的大小

-Xmx

JVM堆的最大值

这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。

Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:

JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'

需要把这个两个参数值调大。例如:

JAVA_OPTS='-Xms256m -Xmx512m'

表示初始化内存为256MB,可以使用的最大内存为512MB。

另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

Tomcat 5常用优化和配置

1、JDK内存优化:

Tomcat默认可以使用的内存为128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:

JAVA_OPTS='-Xms[初始化内存大小] -Xmx[可以使用的最大内存]

一般说来,你应该使用物理内存的 80% 作为堆大小。

2、连接器优化:

在tomcat配置文件server.xml中的配置中,和连接数相关的参数有:

maxThreads:

Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。

acceptCount:

指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。

minSpareThreads:

Tomcat初始化时创建的线程数。默认值4。

maxSpareThreads:

一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。

enableLookups:

是否反查域名,默认值为true。为了提高处理能力,应设置为false

connnectionTimeout:

网络连接超时,默认值60000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

maxKeepAliveRequests:

保持请求数量,默认值100。

bufferSize:

输入流缓冲大小,默认值2048 bytes。

compression:

压缩传输,取值on/off/force,默认值off。

其中和最大连接数相关的参数为maxThreads和acceptCount。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

3、tomcat中如何禁止和允许列目录下的文件

在{tomcat_home}/conf/web.xml中,把listings参数设置成false即可,如下:

...

listings
false

...

4、tomcat中如何禁止和允许主机或IP地址访问

...
allow="*.mycompany.com,www.yourcompany.com"/>
deny="192.168.1.*"/>
...

这是我们服务器的配置,具体文件不能给你,因为涉及到公司机密,所以那一行我给你,我拷贝下来了

JAVA_OPTS='-server -Xms512m -Xmx768m -XX:NewSize=128m -XX:MaxNewSize=192m -XX:SurvivorRatio=8'

热心网友 时间:2022-05-05 18:04

设置-Xmx768或者1024试试,如果还是不好使,你可以查看下你的程序中是否有内存泄露的问题。或者通过debug调试明确到底是哪一步导致的OUT OF MEMORY。

如果还未能解决,建议你贴出部分抛出异常的代码以及完整的异常信息,应该不难解决。

发现问题,解决问题,正是经验的积累,进步的关键!!

加油,仔细点查找原因吧,相信你能解决。

热心网友 时间:2022-05-05 19:39

-Xms256m 设置初始化堆的值,
-Xmx512m 设置最大值

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com