各位老铁们,大家好,今天由我来为大家分享Java里还有大约20%可用内存的情况下显示内存溢出,是怎么回事应该怎么办,以及java 内存溢出解决办法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
本文目录
- javaexcelpoi大数据量50W内存溢出
- java程序消耗内存太大怎么办应该如何解决
- Java里还有大约20%可用内存的情况下显示内存溢出,是怎么回事应该怎么办
- Java如何从数据库中导出100W的数据又快又不内存溢出
javaexcelpoi大数据量50W内存溢出
Workbookworkbook=newSXSSFWorkbook(1000);poi有个机制每次往内存中写1000条数据,这个1000你可以改的尽量别大于10000条数据,写完1000条数据后再重新写,这样就不会内存溢出了。
java程序消耗内存太大怎么办应该如何解决
首先与大多语言一样,Java内存也分为堆内存(Heap)和栈内存(Stack)。
Java有8种基本数据类型(int、short、byte、char、double、float、long、boolean)再加上对象引用(reference类型,它不等同于对象本身,而指向对象起始地址的引用指针。)基本数据存在栈中,对象数据存放在堆中。
Java以下两种内存异常情况:
1.如果线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常;2.如果虚拟机栈可以动态扩展,在扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
如果内存没有被及时回收造成内存占用失控主要有以下两种情况:
1.内存泄露(MemoryLeak):程序在申请内存后,对象没有被GC所回收,它始终占用内存,内存泄漏的堆积最终会造成内存溢出。
2.内存溢出(MemoryOverflow):程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。
所以,如果程序大量占用内存而无法释放,要么是内存泄漏要么是内存溢出。排查方式包括:
1.代码调试和日志排查,看哪里有循环引用、死循环、内存泄漏和溢出等情况。
2.利用Java的工具分析内存占用情况:
jinfo:可以输出并修改运行时的java进程的opts。
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。
jconsole:一个javaGUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
3.利用专门内存分析工具:
MAT(MemoryAnalyzerTool)
JProfiler
GCViewer
VisualVM
Profiler4J
程序占用内存大排查是个不容易的过程,需要一点耐心和经验。
Java里还有大约20%可用内存的情况下显示内存溢出,是怎么回事应该怎么办
JVM中的内存和计算机的内存不是一回事,JVM(JAVA虚拟机)只是运行在服务器中的一个进程,只占用一部分的内存,其中堆通常占了整个jvm内存的80%!
假设一下,计算机是8G内存只给jvm分配了4G内存,jvm占用了4G内存之后,虽然整个内存才使用50%(忽略其他的),jvm也将发生内存溢出!
jvm内存溢出有哪些可能情况呢?
①,堆溢出:堆用来存储实例对象!
可能原因一:设置的最大堆内存太小!解决方案:通过设置-Xmx调大最大堆内存!
可能原因二:循环创建对象导致对象来不及回收!解决方案:优化代码!
②,栈溢出:栈主要用来存放对象引用!
可能原因:递归调用方法等容易出现栈溢出!
解决方法:优化代码!
③,方法区溢出:通常是因为加载了大量的Class,jar等!
通常不会溢出,使用-XX:Permsize设置合适的永久代!
发现内存溢出之后,可使用jstamp,MATJAVA等进行内存分析
一直在持续分享JAVA方面的技术,有需要的朋友敬请关注。。
Java如何从数据库中导出100W的数据又快又不内存溢出
第一种方法,Java调用一下shell脚本,用shell脚本去执行导出CSV到一个文件夹,然后再下载,完事,因为用其它方式导出会更加高效,内存和速度都很快。
我记得以前在电信里面工作的时候,经常要导数据,数据量也不是很多,但是次数频繁,基本都是和运维合作搞一个脚本调用然后下载,shell的导出方式很快,内存占用不高,不过导出之后还要上传到应用目录下下载,调试过程比较麻烦。
第二种办法,就是用Java去导出来,但是导的时候要做一个处理,例如导出Excel或者TXT的时候,可以起两个线程,中间见一个队列,一个线程每次去读5000回来放队列里面,另一边每次消费1000条再去刷磁盘,不要一条刷一次,把读写分离开来,可以达到一个比较优化的地步,如果还想更优化的话,可以试试研究磁盘顺序写,那些mq就基本都是顺序写磁盘加快速度的。
其实不管用什么办法,都要结合自己团队和项目情况来,工期和效率要适中,毕竟还是要根据项目的目标来完成功能。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!