0 0

tomcat + hibernate + spring 运行 内存溢出20

本人最近做的一个项目中,需要使用hiberante映射将近400张表,相应的spring也要配置400个dao manger,tomcat启动后内存占用非常大,页面上有的时候随便点两下服务就挂了,请问有什么解决的方法?
2011年1月28日 10:30

6个答案 按时间排序 按投票排序

0 0

采纳的答案

1.加大你的内存
2.优化你的代码
3.退出这个项目

2011年1月29日 14:09
0 0

比较简单的,,就是添加硬件设备,或者以上的tomcat调优,,

系统一大,使用hibernate,不谨慎的话,很容易出现问题,,,

况且spring默认一开始就加载你那么多的对象

2011年1月28日 16:53
0 0

callmexingye 说得好全面。。。。。

2011年1月28日 16:09
0 0

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项目中也很容易出现这样的问题。http://www.iteye.com/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中了解到原因:http://hi.baidu.com/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内存分配进行不同的诊断才能从根本上解决问题



2011年1月28日 14:55
0 0

升级 tomcat版本试试

2011年1月28日 13:52
0 0

1、可立即见效的方法
在保证有足够的物理内存的前提下,增加Java可使用的内存,修改%TOMCAT_HOMT%\bin\startup.bat文件,最前面增加:
set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dcom.sun.management.jmxremote
注:
(1)相关的数值可根据需要进行修改;
(2)数值之间有约束关系,修改之前可参考相关的文档;
(3)Windows系统下,相关数值的总和有限制(2GB,但实际测试大约1.5G);

2、针对系统的相关性能进行优化
(1)减少使用频率较少的数据持久化,可采用JDBC代替;
(2)使用性能检查工具,如MAT,查看相关代码是否存在内存泄漏;

2011年1月28日 11:00

相关推荐

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

    对于那些使用大量动态加载类的应用,如Hibernate和Spring框架,可能会遇到 PermGen space 溢出的问题。 PermGen space 存储的是类的元数据,而非实例数据。由于GC不会在运行时清理PermGen space,当加载的类数量过多...

    Tomcat安装包+教程

    8. **集成其他应用服务器或框架**:例如与Spring Boot、Hibernate等框架的集成。 9. **故障排除**:遇到常见的启动问题、内存溢出问题或其他异常时的处理方法。 10. **Tomcat的扩展和升级**:如何添加新的Servlet...

    eclipse 内存溢出解决办法

    假设在使用Spring框架结合Hibernate持久层技术时遇到PermGen Space内存溢出的问题,通常是因为Spring AOP使用了CGLIB动态代理技术,这会动态生成大量类,进而消耗更多的PermGen Space资源。解决此类问题时,除了增大...

    Tomcat出现_PermGen_space解决方案

    例如,Spring、Hibernate等框架在运行时可能会动态生成类,从而增加 PermGen space 的压力。但解决此类问题不应仅仅停留在框架层面,而应深入理解JVM的工作机制,适当地调整内存配置。 总结而言,优化Tomcat的内存...

    Java常见异常集-Java,Hibernate,Tomcat异常

    3. **Hibernate 映射配置文件异常**:当在映射文件中错误配置`outer-join`属性时,可能会导致内存溢出(heap space)异常。正确设置外连接加载策略以减少内存消耗是避免这类问题的关键。 4. **IOException: java.io...

    java异常解决方案.docx

    + 解决方案:检查 Tomcat 的 JVM 参数设置,是否存在内存溢出的问题,尝试增加 JVM 的内存大小或使用其他 JVM 参数来解决问题。 三、Java 基本异常解决方案 * java.lang.ClassCastException: + 解决方案:检查...

    adminstore:一个简单的项目初始化模板,集成shiro,spring,hibernate,spring mvc,ehcache,disconver,bootstrap。搭建项目时候不错的一个选择!,后台采用AdminLte

    AdminStore ...SSH (Spring、SpringMVC、Hibernate) 安全权限 Shiro 缓存 Ehcache 视图模板 freemarker 工作流引擎 activiti 定时任务 quartz AdminLTE bootstrap 搭建步骤 创建数据库。如使用MySQL

    java架构师面试问题

    内存泄露是指程序中已分配的内存无法正常释放,导致内存持续消耗,而内存溢出是系统可用内存不足,无法为新分配的内存块找到空间。内存泄露通常发生在长时间运行的应用中,当不再需要的对象仍然被引用,无法被垃圾...

    Myeclipse快捷键和常用问题经验总结操作手册打包

    此外,MyEclipse还支持多种Web技术,如JavaEE、Spring、Struts、Hibernate等,开发者需要了解这些框架的原理和使用方式。在实际开发中,还需要掌握数据库设计、接口调试、单元测试等相关技能,以确保应用的稳定性...

    后台管理系统

    更低版本的JDK6、JDK7可能需要设置Java内存-XX:PermSize=128M -XX:MaxPermSize=512M,否则可能出现这种类型的内存溢出:java.lang.OutOfMemoryError: PermGen space。 Servlet2.5或更高版本(如Tomcat6或更高版本)。...

    面试题问题合集.docx

    5. **Web环境初始化**:如果是Web应用,则Spring Boot 会自动配置Web环境,并启动嵌入式的Tomcat、Jetty或Undertow等服务器。 6. **Spring容器初始化**:完成上述步骤后,Spring 容器将被初始化,所有的Bean会被...

    迅雷最新面试题.doc

    内存泄露是指程序中已分配的内存无法释放,而内存溢出则是指程序申请内存时,没有足够的内存空间供其使用。 5. **亿级数据存储**:对于每天1亿条记录的存储,可以考虑使用分布式数据库,如Hadoop HDFS配合MapReduce...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.24.docx

    它内置了 Tomcat 服务器和默认配置,使得项目可以直接运行,无需额外配置。此外,Spring Boot 对 Spring Cloud 等微服务生态系统的支持使得它成为微服务开发的理想选择。在微服务架构中,每个服务都是独立的,Spring...

    计算机笔试题库集(含有答案)

    7. **JVM原理**:Java虚拟机(JVM)是运行Java字节码的虚拟机,负责类加载、内存管理、执行字节码等。内存泄露是指程序中已不再使用的对象无法被垃圾收集器回收,可能导致内存溢出。内存溢出则是指程序申请内存时,...

    spring-boot-and-all-all-all

    - **内存调优**:理解JVM内存模型,避免内存溢出。 总结,Spring Boot通过其简洁的配置、自动化的特性,使得Java开发者能够更加专注于业务逻辑,而非基础设施的搭建。随着Spring Boot的广泛应用,它已经成为了现代...

    迅雷技术招聘java试题

    内存泄露是指程序中已分配的内存无法释放,而内存溢出则是指程序请求的内存超过了系统能提供的。内存泄露通常在程序持续运行时逐渐积累,最终可能导致系统资源耗尽。 【数据库设计】 对于大量数据存储,考虑使用...

Global site tag (gtag.js) - Google Analytics