Java内存溢出主要有哪些类型?

 我来答
千锋教育
2015-12-07 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
主要有三种类型
第一种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线程个数很多的情况下容易发生
Kmars1985
2013-10-18 · TA获得超过1172个赞
知道小有建树答主
回答量:554
采纳率:0%
帮助的人:386万
展开全部
内存溢出类型
  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)内存溢出或者本地线程资源不足,属于这类吗?
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式