Java的内存溢出
在java中,内存溢出主要分为以下三种情况:
1. outofmemoryerror: permgen space
permanent generation space 这个区域主要用来保存加来的class的一些信息,在程序运行期间属于永久占用的,java的gc不会对他进行释放,所以如果启动的程序加载的信息比较大,超出了这个空间的大小,就会发生溢出错误;
解决的办法无非就是增加空间分配了——增加java虚拟机中的xx:permsize和xx:maxpermsize参数的大小,其中xx:permsize是初始永久保存区域大小,xx:maxpermsize是最大永久保存区域大小。
2. outofmemoryerror:java heap space
heap 是java内存中的堆区,主要用来存放对象,当对象太多超出了空间大小,gc又来不及释放的时候,就会发生溢出错误。java中对象的创建是可控的,但是对象的回收是由gc自动的,一般来说,当已存在对象没有引用(即不可达)的时候,gc就会定时的来回收对象,释放空间。但是因为程序的设计问题,导致对象可达但是又没有用(即前文提到的内存泄露),当这种情况越来越多的时候,问题就来了。
针对这个问题,我们需要做一下两点:
(1) 检查程序,减少大量重复创建对象的死循环,减少内存泄露。
(2) 增加java虚拟机中xms(初始堆大小)和xmx(最大堆大小)参数的大小。
3. *error
stack是java内存中的栈空间,主要用来存放方法中的变量,参数等临时性的数据的,发生溢出一般是因为分配空间太小,或是执行的方法递归层数太多创建了占用了太多栈帧导致溢出。
针对这个问题,除了修改配置参数-xss参数增加线程栈大小之外,优化程序是尤其重要。
参考博文:https://www.jianshu.com/p/8c31ef19983a
推荐阅读
-
java用两个栈实现队列的push和pop
-
科普知识:内存 vs 硬盘的区别
-
Android Studio启动报错Java 1.8 or later is required的解决方法
-
HBase 系列(六)——HBase Java API 的基本使用
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java 学习之路让我帮助很大的书籍
-
Java内存模型之有序性问题
-
天下代码一大抄,整个案例的搬是什么鬼!疑似冒充蚂蚁金服高级Java开发工程师?你大爷
-
Java连载68-数组的拷贝、二维数组
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全