java虚拟机(四)--内存溢出、内存泄漏、SOF
学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了
解内存溢出和内存泄露是很有必要的,一方面是为了面试,更重要是的在工作中能够快速定位错误原因并且解决
内存溢出分类:
1、java.lang.OutOfMemoryError: Java Heap space
通过后面的提示信息知道应该堆区发生内存溢出,几乎所有的对象都保存在堆区,所以只要不断的生成对象,并且保证其可达性,就可以达到
堆区的OOM,可以通过下面参数最大、最小堆空间控制堆的大小
/**
* -Xms20m -Xmx20m
*/
public class TestUnit { static class OOMObject { } public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
list.add(new OOMObject());
}
}
}
2、栈内存溢出(HotSpot只有栈,没有虚拟机栈和本地方法栈,可以通过-Xss设置,而-Xoss对应本地方法栈是无效的)
关于栈,虚拟机规范中描述了两种异常:
①.如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常
②.如果虚拟机在拓展栈时无法申请到足够的内存空间,则抛出OutofMemoryError异常
但是单线程一般情况下只会抛出StackOverflowError异常,多线程环境下可以抛出OutofMemoryError异常。栈中保存着栈帧,可以通过递归,
不断生成栈帧,从而打成内存溢出
/**
* -Xss128k
*/
public class TestUnit { private int stackLength = 1;
public void stackLeak() {
stackLength++;
stackLeak();
} public static void main(String[] args) throws Throwable{
TestUnit test = new TestUnit();
try {
test.stackLeak();
} catch (Throwable e) {
System.out.println("stack Length:" + test.stackLength);
throw e;
}
}
}
3、java.lang.OutOfMemoryError: PermGen space
通过名称可以知道和Permanent Generation Space相关,也就是永久代。这个异常在jsp进行预编译的时候有遇到过,或者大量引入第三方jar包
一般情况就是增加方法区大小,例如XX:PermSize=256M -XX:MaxPermSize=512m。只有HotSpot通过永久代实现方法区,而在jdk1.8之后就放弃了
永久代,改有本地内存实现。
4、方法区内存溢出(jdk1.7之前的版本,因为常量池从方法区移到堆中,String.intern()发生变化)
/**
* -XX:PermSize=10M -XX:MaxPermSize=10M
*/
public class TestUnit { public static void main(String[] args) {
List<String> list = new ArrayList<>();
int i = 1;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
}
5、java.lang.OutOfMemoryError:GC over head limit exceeded
系统进行高频的GC,回收效果不佳,就会出现这个错误,个人没遇到过。
内存泄露:
是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。内存泄露有时
不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。
static class OOMObject{ } public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
OOMObject object = new OOMObject();
list.add(object);
object = null;
}
}
类似这样的代码,list还是保存着object的引用,object不会被回收的,可以把list设置为null解决
内存泄露可以参考这篇文章:https://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/
java虚拟机(四)--内存溢出、内存泄漏、SOF的更多相关文章
- Java虚拟机解析篇之---内存模型
今天闲来无事来,看一下Java中的内存模型和垃圾回收机制的原理.关于这个方面的知识,网上已经有非常多现成的资料能够供我们參考,可是知识还是比較杂的,在这部分知识点中有一本书不得不推荐:<深入理解 ...
- Java虚拟机垃圾收集器与内存分配策略
Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.1.内存区域
1.内存区域 根据<Java虚拟机规范(Java SE 7版)> 的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示. 程序计数器 当前线程所执行的字节码的行号指 ...
- 深入理解java虚拟机读书笔记1--java内存区域
Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...
- 内存溢出,内存泄漏,CPU溢出区别
内存溢出 out of memory,就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用 ...
- 《深入理解 Java 虚拟机》学习笔记 -- 内存区域
<深入理解 Java 虚拟机>学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分: 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 如图所示: 1. 程序计数器(线程私有 ...
- 转载: Java虚拟机:运行时内存数据区域、对象内存分配与访问
转载: https://blog.csdn.net/a745233700/article/details/80291694 (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼 ...
- 实战Java虚拟机之一“堆溢出处理”
从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...
- java虚拟机内存溢出和泄漏实例
测试参数设置: 1.循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space, 虚拟机参数:-Xms1M -Xmx1M -XX:+Hea ...
随机推荐
- 【web开发学习笔记】Structs2 Result学习笔记(二)动态结果集
Result学习笔记(二) - 动态结果集 动态结果 一定不要忘了为动态结果的保存值设置set get方法 第一部分:代码 //前端 <% String context = reques ...
- The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory的解决方法
An error occurred at line: [31] in the generated java file: [/data/tmisnt/work/Catalina/localhost/_/ ...
- MySQL-修改数据(REPLACE)
MySQL-REPLACE语句 功能介绍:用于向数据库表插入或更新数据. REPLACE语句的工作原理: 如果给定行数据不存在,那么MySQL REPLACE语句会插入新行. 如果给定行数据存在,则R ...
- JDK和TOMCAT的安装与配置环境变量
一.JDK该怎么安装与配置环境变量 步骤1.安装JDK选择安装目录,安装jdk1.8.0_77过程中会出现安装提示. 步骤2.(1)安装jdk随意选择目录 只需把默认安装目录\java之前的目录修改即 ...
- JBOSS和EJB学习一
1.使用软件 IDE:Eclipse4.3(开普勒) EE版本 服务器:jboss EAP 6.2 eclipse-jboss plugin:jbosstools-Update-4.1.2.Final ...
- lvm调整分区大小
1 问题 /home分区占用空间比较大,而/var分区比较小,它们位于同一个磁盘上.该系统安装了lvm. 2 减少/home分区空间 2.1 卸载/home umount /home 2.2 检查文件 ...
- centos7 安装8188eu驱动小记
最小化安装把lsusb和lspci装上 使用lsusb 和lspci的命令, centos上的安装命令: yum -y install usbutils yum -y install pciutils ...
- C#与excel互操作的错误无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制
C#与excel互操作的错误无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制 如果您使用的电脑要操作的是office2 ...
- 多台Mac电脑使用同一个apple开发者账号测试
因为公司有苹果一体机,家里有macbook和黑苹果台式机,多台电脑用同一个开发者账号,每次真机调试时都是选择直接reset,回到另外一台电脑,又要重新设置,太麻烦了.直到最近才设置三台电脑都可以,分享 ...
- 关于Dubbo中一些小众但很实用的功能
dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能: 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要 ...