深入理解jvm-outofmemory

引用

就是虚拟机栈中有个reference的数据他的值是某个对象的地址起始点就称这个reference是某个对象或者说某个内存的引用

引用还被分为强引用,软引用, 弱引用,虚引用,引用强度依次减弱

强引用就是类似于 object A = new object();这类引用是永远不会被回收的

软引用是用类softreference来进行引用,这类引用将在内存将要溢出时,进行回收,

弱引用是用weakrefenrce 类进行引用,这类引用将在下次发生垃圾回收时被回收

虚引用phanreference这类引用没什么实质的作用,就是起到一个通知对象的作用,肯定会被回收的

对象已死判断

java虚拟机通过两种方式判断是否对象是否已死,对象引用变量数量,和GCroots遍历

第一种对象引用变量就是在对象中定义一个引用自己的变量的数量,有人引用自己就加1,少一个引用就减一,但是这种方式有一个缺点就是无法回收循环引用,因此很少有虚拟机是这样判断的

第二种是GCroots遍历,通过GCroots的根节点向下遍历整个对象图,没有遍历到的就是垃圾,可以作为GCroots对象的,类静态变量.常量引用.局部变量等

引用

就是虚拟机栈中有个reference的数据他的值是某个对象的地址起始点就称这个reference是某个对象或者说某个内存的引用

引用还被分为强引用,软引用, 弱引用,虚引用,引用强度依次减弱

强引用就是类似于 object A = new object();这类引用是永远不会被回收的

软引用是用类softreference来进行引用,这类引用将在内存将要溢出时,进行回收,

弱引用是用weakrefenrce 类进行引用,这类引用将在下次发生垃圾回收时被回收

虚引用phanreference这类引用没什么实质的作用,就是起到一个通知对象的作用,肯定会被回收的

生存还是死亡

如果对象在GCroots时没有可达性路径,那他将被第一次标记,这时候垃圾收集器将判断这个对象有没有必要执行finalize()方法,,没有的情况下就是开发人员没有重写这个finalize方法,或者这个方法已经不是第一次调用了,这样这个对象就是死亡的,但是对象可以在finalize方法中实现自救就是让一个变量重新引用this对象.

堆溢出

堆中存储的是大量的对象,所以我们只需要不断地添加对象到内存中,并且保证GCroots到对象之间有可达路径.

虚拟机栈和方法栈溢出

栈中主要存放的是栈帧,而栈帧的大小是在编译器就确定的,所以我们只需要不停的创建栈帧添加到栈中就会溢出,两种方式一种是增加栈帧的数量,不停的递归调用方法, 第二种是增加栈帧的大小,就是在方法中定义大量的变量,这样栈帧就大,也会导致溢出.

方法区和运行时常量区溢出

方法区主要存放类型信息,和运行时常量表,如果我们不停的加载类到方法区内那么方法区就会溢出,或者运行时常量区溢出,存放的是字面量和符号引用,符号引用我们几乎改变不了而字面量我们可以通过String.intern()的形式不停的添加字面量到方法区内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值