Java内存溢出主要都有哪些类型?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java内存溢出主要都有哪些类型?相关的知识,希望对你有一定的参考价值。
主要有三种类型第一种OutOfMemoryError: PermGen space
发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generation space有关。解决这类问题有以下两种办法:
1. 增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行:
JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"
如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。使用上述方法,我成功解决了部署ssh项目的tomcat服务器经常宕机的问题。
2. 清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。
第二种OutOfMemoryError: Java heap space
发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。解决这类问题有两种思路:
1. 检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。
我以前写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Java heap space的内存溢出问题,后来通过修改程序得到了解决。
2. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m
第三种OutOfMemoryError:unable to create new native thread
这种错误在Java线程个数很多的情况下容易发生 参考技术A 内存溢出类型
1 、 java.lang.OutOfMemoryError: PermGen space
JVM 经管两种类型的内存,堆和非堆。堆是给开辟人员用的上方说的就是,是在 JVM 启动时创建;非堆是留给 JVM 本身用的,用来存放类的信息的。它和堆不合,运行期内 GC 不会开释空间。若是 web app 用了多量的第三方 jar 或者应用有太多的 class 文件而正好 MaxPermSize 设置较小,超出了也会导致这块内存的占用过多造成溢出,或者 tomcat 热安排时侯不会清理前面加载的景象,只会将 context 更改为新安排的,非堆存的内容就会越来越多。
2 、 java.lang.OutOfMemoryError: Java heap space
第一种景象是个补充,首要存在题目就是呈如今这个景象中。其默认空间 ( 即 -Xms) 是物理内存的 1/64 ,最大空间 (-Xmx) 是物理内存的 1/4 。若是内存残剩不到 40 %, JVM 就会增大堆到 Xmx 设置的值,内存残剩跨越 70 %, JVM 就会减小堆到 Xms 设置的值。所以办事器的 Xmx 和 Xms 设置一般应当设置雷同避免每次 GC 后都要调剂虚拟机堆的大小。假设物理内存无穷大,那么 JVM 内存的最大值跟操纵体系有关,一般 32 位机是 1.5g 到 3g 之间,而 64 位的就不会有限制了。
重视:若是 Xms 跨越了 Xmx 值,或者堆最大值和非堆最大值的总和跨越了物理内存或者操纵体系的最大限制都邑引起办事器启动不起来。
垃圾收受接管 GC 的角色
JVM 调用 GC 的频度还是很高的,首要两种景象下进行垃圾收受接管:
当应用法度线程余暇;另一个是 java 内存堆不足时,会络续调用 GC ,若连气儿收受接管都解决不了内存堆不足的题目时,就会报 out of memory 错误。因为这个异常按照体系运行景象决意,所以无法预期它何时呈现。
按照 GC 的机制,法度的运行会引起体系运行景象的变更,增长 GC 的触发机会。
为了避免这些题目,法度的设计和编写就应避免垃圾对象的内存占用和 GC 的开销。显示调用 System.GC() 只能建议 JVM 须要在内存中对垃圾对象进行收受接管,但不是必须即速收受接管,
一个是并不克不及解决内存资料耗空的场合排场,别的也会增长 GC 的消费。追问
只有这两种吗?如果是本地(native)内存溢出或者本地线程资源不足,属于这类吗?
本回答被提问者和网友采纳block都有哪些类型
参考技术A block的类型block如何分类?其实blcok的分类主要是根据block的内存管理来说的,系统把Block分为3类:NSGlobalBlock,NSStackBlock, NSMallocBlock;
NSGlobalBlock :位于内存全局区
NSMallocBlock :位于内存堆区
NSStackBlock :位于内存栈区
内存五大区
栈区,堆区,静态区(全局区),常量区,代码区
动态数据区一般就是”堆栈”,栈是线性结构,堆是链式结构. 本地变量在堆栈中.通过堆栈的基地址和偏移量来访问本地变量
动态内存分配有系统根据程序需要即时分配,且分配的大小就是程序要求的大小.
全局变量(一般用static修饰的变量)和静态变量分配在静态区(需要预先分配存储空间)
静态内存分配:分配固定大小的内存分配方法,大多情况下会浪费大量的内存空间,少数情况下,当定义的数组不够大时,会引起越界.
以上是关于Java内存溢出主要都有哪些类型?的主要内容,如果未能解决你的问题,请参考以下文章