内存溢出

线程并发安全导致内存溢出

谁都会走 提交于 2019-12-27 03:47:44
整个网站访问不了,后台日志内存溢出,提出了个致命单,找到问题后,整理成了案例,供培训使用。 原因: 流量统计FlowUtil类使用两个static的List来装载流量信息实体bean。 用户每次点击都会将一个产生一个bean并加入到第一个List1中,当List1里的bean到一定数量时(可在后台配置缓存大小),List1将所有的实体bean复制到 List2中,然后List1清空继续接收新的bean,这时List2开启一个新线程异步去将bean插入数据库,然后清空。 Method add(bean){ list1 .add(bean); if ( list1 .size() >= cacheSize) { List2 .addAll( list1 ); list1 .clear(); new Thread({ try { insertDB(list2); list2.clear(); } catch (ApplicationException e) { } }).start(); } } 整个操作没有做同步锁定,如果并发量大,List2还没完成插入数据库的操作,List1又将新接收的bean全部加入到List2中,又发起一个新线程去插数据库,如果这个线程跑在之前那个线程前,因为这时List2之前的bean是没有被清空的,再插入数据库的时候,id就会重复,就会抛出违反唯一性约束异常

内存溢出

瘦欲@ 提交于 2019-12-21 00:41:48
1 内存溢出 1.1 堆内存溢出 ( outOfMemoryError:java heap space ) 堆中的内存是用来生成对象实例和数组的 ,堆主要由新生代( eden 区和两个 survivor 区组成)老年代、永久代。 a 、由内存泄露导致,内存溢出 b 、无法申请到足够的空间存放而导致的错误 1.2 方法区溢出 ( outOfMemoryError:PermGen space ) 方法区主要存放的是类信息、常量、静态变量等 , 如果应用会加载很多 class 或使用反射、 glibc (需要更多的空间保存增强的类) , 就很可能出现 PermGen space 错误。 1.3 线程栈溢出 ( java.lang.StackOverflowError ) 线程栈时线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误。 一般线程栈溢出是由于死循环、递归太深或方法调用层级过多导致的,如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出上面异常。 1.4 直接内存溢出 DirectMemory可以通过-XX:MaxDirectMemorySize指定,如果不指定,默认与Java堆的最大值(-Xmx指定)一样。 NIO会使用到直接内存,你可以通过NIO来模拟,也直接使用UnSafe来分配直接内存。 2 堆内存泄露原因和排查

内存溢出与内存泄漏

戏子无情 提交于 2019-12-21 00:40:04
一.内存泄漏    内存泄漏指对象已经没有被应用程序 使用 ,但是垃圾回收器无法移除它们,因为还在被引用着。   出现内存泄漏的情况和防止 : 长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。   1.当将HashMap,ArrayList,Vector等集合定义为静态的时候,他们的声明周期将会和应用程序一样长。他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。静态变量是全局的,GC不会回收。   2.事件监听器,当一个监听器在使用的时候被注册,但不再使用时被反注册,会出现内存泄漏。   3.如果一个类自己管理内存,常一些成员变量引用其他对象,初始化的时候需要置空。   4.JDK6中的 substirng() 方法容易导致内存泄漏。   5.各种连接 :   比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。    解决方法 :通过工具查看泄漏对象到GC Roots的引用链,就能找到泄露对象是怎样的路径与GC Roots相连并导致垃圾回收器无法自动回收。 二.内存溢出  

Java常见内存溢出异常分析

时间秒杀一切 提交于 2019-12-20 15:43:39
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而内存模型中不同的部分都会出现相应的OOM错误,接下来我们就分开来讨论一下。 栈溢出(StackOverflowError) 栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候栈的深度超过了虚拟机容许的最大深度所致。 出现这种情况,一般情况下是程序错误所致的,比如写了一个死递归,就有可能造成此种情况。 下面我们通过一段代码来模拟一下此种情况的内存溢出。 Java代码 import java.util.*; import java.lang.*; public class OOMTest{ public void stackOverFlowMethod(){ stackOverFlowMethod(); } public static void main(String... args){ OOMTest oom = new OOMTest(); oom.stackOverFlowMethod(); } } 运行上面的代码,会抛出如下的异常: 引用 Exception

jdk1.6中上传PNG图片内存溢出问题

我与影子孤独终老i 提交于 2019-12-19 04:25:05
商户在上传图片时发生内存溢出问题 开始以为是bufferReder没有关闭导致的,但是后来发现那个商户只要传一张图片就会内存溢出,图片见下图 原来是因为在jdk1.6中的PNGImageReder.java中670行中对没有找到匹配的16进制编码,导致死循环。不过此问题在后续的jdk版本中已经优化。 来源: CSDN 作者: xu1824950698 链接: https://blog.csdn.net/xu1824950698/article/details/103599387

Tomcat内存溢出解决办法

让人想犯罪 __ 提交于 2019-12-18 05:51:17
使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 解决办法: 理方法是 在myeclipse中设置TOMCAT的内存大小 Tomcat是目前应用十分广泛的一个Java servlet container与web服务器,但java.lang.OutOfMemoryError与java.lang.OutOfMemoryError: PermGen space的异常相信真正用过tomcat的人都遇到过(用户量大,应用使用频繁等),这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不够的,所以你可以给JVM分配上1G甚至更多,这样就可以避免内存溢出。 分配方法: 1)linux下 编辑tomcat的catalina.sh文件,在第一行的后面增加一句: JAVA_OPTS='-server

Tomcat内存溢出解决办法

霸气de小男生 提交于 2019-12-18 05:50:44
工作中,Tomcat内存溢出遇到两次了,就在网上找了些资料,将解决办法分享一下: 使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 解决办法: 理方法是 在myeclipse中设置TOMCAT的内存大小 Tomcat是目前应用十分广泛的一个Java servlet container与web服务器,但java.lang.OutOfMemoryError与java.lang.OutOfMemoryError: PermGen space的异常相信真正用过tomcat的人都遇到过(用户量大,应用使用频繁等),这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不够的,所以你可以给JVM分配上1G甚至更多,这样就可以避免内存溢出。 分配方法: 1)linux下

Tomcat内存溢出解决办法

风流意气都作罢 提交于 2019-12-18 05:50:18
使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 解决办法: 理方法是 在myeclipse中设置TOMCAT的内存大小 Tomcat是目前应用十分广泛的一个Java servlet container与web服务器,但java.lang.OutOfMemoryError与java.lang.OutOfMemoryError: PermGen space的异常相信真正用过tomcat的人都遇到过(用户量大,应用使用频繁等),这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不够的,所以你可以给JVM分配上1G甚至更多,这样就可以避免内存溢出。 分配方法: 1)linux下 编辑tomcat的catalina.sh文件,在第一行的后面增加一句: JAVA_OPTS='-server

Tomcat内存溢出解决办法

断了今生、忘了曾经 提交于 2019-12-18 05:49:52
使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 解决办法: 理方法是 在myeclipse中设置TOMCAT的内存大小 Tomcat是目前应用十分广泛的一个Java servlet container与web服务器,但java.lang.OutOfMemoryError与java.lang.OutOfMemoryError: PermGen space的异常相信真正用过tomcat的人都遇到过(用户量大,应用使用频繁等),这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不够的,所以你可以给JVM分配上1G甚至更多,这样就可以避免内存溢出。 分配方法: 1)linux下 编辑tomcat的catalina.sh文件,在第一行的后面增加一句: JAVA_OPTS='-server

递归

一个人想着一个人 提交于 2019-12-17 06:09:24
1、 有递归的结束时处理 2、  字节调用自己 好处: 不需要知道循环次数 弊端: 递归次数过多,容易导致栈内存溢出 public class test4_digui { public static void main(String[] args) { System.out.println(jiecheng(5)); } public static int jiecheng(int n) { if (n == 1) { return n; } else { return n*jiecheng(n-1); } } 来源: https://www.cnblogs.com/yaobiluo/p/11312527.html