-
tomcat + hibernate + spring 运行 内存溢出20
本人最近做的一个项目中,需要使用hiberante映射将近400张表,相应的spring也要配置400个dao manger,tomcat启动后内存占用非常大,页面上有的时候随便点两下服务就挂了,请问有什么解决的方法?2011年1月28日 10:30
6个答案 按时间排序 按投票排序
-
比较简单的,,就是添加硬件设备,或者以上的tomcat调优,,
系统一大,使用hibernate,不谨慎的话,很容易出现问题,,,
况且spring默认一开始就加载你那么多的对象
2011年1月28日 16:53
-
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
-
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
相关推荐
对于那些使用大量动态加载类的应用,如Hibernate和Spring框架,可能会遇到 PermGen space 溢出的问题。 PermGen space 存储的是类的元数据,而非实例数据。由于GC不会在运行时清理PermGen space,当加载的类数量过多...
8. **集成其他应用服务器或框架**:例如与Spring Boot、Hibernate等框架的集成。 9. **故障排除**:遇到常见的启动问题、内存溢出问题或其他异常时的处理方法。 10. **Tomcat的扩展和升级**:如何添加新的Servlet...
假设在使用Spring框架结合Hibernate持久层技术时遇到PermGen Space内存溢出的问题,通常是因为Spring AOP使用了CGLIB动态代理技术,这会动态生成大量类,进而消耗更多的PermGen Space资源。解决此类问题时,除了增大...
例如,Spring、Hibernate等框架在运行时可能会动态生成类,从而增加 PermGen space 的压力。但解决此类问题不应仅仅停留在框架层面,而应深入理解JVM的工作机制,适当地调整内存配置。 总结而言,优化Tomcat的内存...
3. **Hibernate 映射配置文件异常**:当在映射文件中错误配置`outer-join`属性时,可能会导致内存溢出(heap space)异常。正确设置外连接加载策略以减少内存消耗是避免这类问题的关键。 4. **IOException: java.io...
+ 解决方案:检查 Tomcat 的 JVM 参数设置,是否存在内存溢出的问题,尝试增加 JVM 的内存大小或使用其他 JVM 参数来解决问题。 三、Java 基本异常解决方案 * java.lang.ClassCastException: + 解决方案:检查...
AdminStore ...SSH (Spring、SpringMVC、Hibernate) 安全权限 Shiro 缓存 Ehcache 视图模板 freemarker 工作流引擎 activiti 定时任务 quartz AdminLTE bootstrap 搭建步骤 创建数据库。如使用MySQL
内存泄露是指程序中已分配的内存无法正常释放,导致内存持续消耗,而内存溢出是系统可用内存不足,无法为新分配的内存块找到空间。内存泄露通常发生在长时间运行的应用中,当不再需要的对象仍然被引用,无法被垃圾...
此外,MyEclipse还支持多种Web技术,如JavaEE、Spring、Struts、Hibernate等,开发者需要了解这些框架的原理和使用方式。在实际开发中,还需要掌握数据库设计、接口调试、单元测试等相关技能,以确保应用的稳定性...
更低版本的JDK6、JDK7可能需要设置Java内存-XX:PermSize=128M -XX:MaxPermSize=512M,否则可能出现这种类型的内存溢出:java.lang.OutOfMemoryError: PermGen space。 Servlet2.5或更高版本(如Tomcat6或更高版本)。...
5. **Web环境初始化**:如果是Web应用,则Spring Boot 会自动配置Web环境,并启动嵌入式的Tomcat、Jetty或Undertow等服务器。 6. **Spring容器初始化**:完成上述步骤后,Spring 容器将被初始化,所有的Bean会被...
内存泄露是指程序中已分配的内存无法释放,而内存溢出则是指程序申请内存时,没有足够的内存空间供其使用。 5. **亿级数据存储**:对于每天1亿条记录的存储,可以考虑使用分布式数据库,如Hadoop HDFS配合MapReduce...
它内置了 Tomcat 服务器和默认配置,使得项目可以直接运行,无需额外配置。此外,Spring Boot 对 Spring Cloud 等微服务生态系统的支持使得它成为微服务开发的理想选择。在微服务架构中,每个服务都是独立的,Spring...
7. **JVM原理**:Java虚拟机(JVM)是运行Java字节码的虚拟机,负责类加载、内存管理、执行字节码等。内存泄露是指程序中已不再使用的对象无法被垃圾收集器回收,可能导致内存溢出。内存溢出则是指程序申请内存时,...
- **内存调优**:理解JVM内存模型,避免内存溢出。 总结,Spring Boot通过其简洁的配置、自动化的特性,使得Java开发者能够更加专注于业务逻辑,而非基础设施的搭建。随着Spring Boot的广泛应用,它已经成为了现代...
内存泄露是指程序中已分配的内存无法释放,而内存溢出则是指程序请求的内存超过了系统能提供的。内存泄露通常在程序持续运行时逐渐积累,最终可能导致系统资源耗尽。 【数据库设计】 对于大量数据存储,考虑使用...