首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 如何有效地避免OOM:善于利用软引用引用

想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用引用来有效地解决程序中出现的OOM问题。...下面是本文的目录大纲: 一.了解 强引用、软引用引用、虚引用的概念 二.进一步理解软引用引用 三.如何利用软引用引用解决OOM问题 一.了解 强引用、软引用引用、虚引用的概念 在Java...中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用引用了。...= new Object(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象...当运行至Object[] objArr = new Object[1000];这句时,如果内存不足,JVM会抛出OOM错误也不会回收object指向的对象。

70250
您找到你想要的搜索结果了吗?
是的
没有找到

Java中强、软、、虚四种引用详解

对于强引用对象,即使内存不足,JVM宁愿抛出OutOfMemoryError (OOM)错误也不会回收这种对象。...常常用于缓存操作,把某个对象标记为软引用时,当内存足够就不会回收,内存不足就会回收,比如网页缓存,图片缓存等。并且软引用都会保证在虚拟机抛出OutOfMemoryError之前已经被清除。 3. ...引用 WeakReference reference=new WeakReference(obj);   引用也是用来描述非必需对象的。...只使用WeakReference类修饰的对象就是一个引用对象(可达对象)。引用的对象相比软引用拥有更短暂的生命周期。无论内存是否足够,一旦下次垃圾回收器运行后扫描到引用,便会回收。 ...,它是最弱的一种引用关系,虚引用与软引用引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。

50040

js WeakSet的基本使用

WeakSet 中的“weak”(),描述的是 JavaScript 垃圾回收程序对待“集合”中值的方式。 基本API 1....尝试使用非对象设置值会抛出 TypeError。...可迭代对象中的每个值都会按照迭代顺序插入到新实例中: const val1 = { id: 1 }, val2 = { id: 2 }; const ws = new WeakSet([val1, val2]); 只要有一个值无效就会抛出错误...WeakSet中的对象都是引用: WeakSet 中对对象的引用不会被考虑进垃圾回收机制,这些值不属于正式的引用,不会阻止垃圾回收,即只要没有其他的对象引用该对象,则该对象就会被回收,而不管它在不在...因为不可能迭代,所以也不可能在不知道对象引用的情况下从集合中取得值。即便代码可以访问 WeakSet 实例,也没办法看到其中的内容。 WeakSet 没有size属性。

70020

引用、软引用引用、幻象引用有什么区别?

当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。...只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即JVM 会确保在抛出 OutOfMemoryError 之前,清理软引用指向的对象。...3 引用 引用通过WeakReference类实现。 引用的生命周期比软引用短。...在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有引用的对象,不管当前内存空间足够与否,都会回收它的内存。 由于垃圾回收器是一个优先级很低的线程,因此不一定会很快回收引用的对象。...引用可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。

54000

(十五)ThreadLocal的用法,如何解决内存泄漏

那为什么value不能被设置成引用呢? 如果vaule设计为引用,你可能获取到的是null ,毫无意义。 为什么要使用引用而不是强引用?...而强引用是造成Java内存泄漏的主要原因之一,内存空间不足时,Java虚拟机会抛出OutOfMemoryError ,使程序异常终止,但是注意,抛出错误也不会回收这些强引用的对象。...那为什么value不能被设置成引用呢? 如果vaule设计为引用,你可能获取到的是null ,毫无意义。 为什么要使用引用而不是强引用?...而强引用是造成Java内存泄漏的主要原因之一,内存空间不足时,Java虚拟机会抛出OutOfMemoryError ,使程序异常终止,但是注意,抛出错误也不会回收这些强引用的对象。...而强引用是造成Java内存泄漏的主要原因之一,内存空间不足时,Java虚拟机会抛出OutOfMemoryError ,使程序异常终止,但是注意,抛出错误也不会回收这些强引用的对象。

1.2K20

Java中的强引用、软引用引用、幻象引用有什么区别和使用场景

当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。...只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即JVM 会确保在抛出 OutOfMemoryError之前,清理软引用指向的对象。...引用 特点:引用通过WeakReference类实现。 引用的生命周期比软引用短。...引用可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。...引用(WeakReference)并不能使对象豁免垃圾收集,仅仅是提供一种访问在引用状态下对象的途径。

62020

JDK核心JAVA源码解析(3) - 引用相关

;只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。...System.out.println(testFinalizeObjectSoftReference.get()); try { //我们启动参数设置的是-Xmx16m,所以这里一定会抛出内存溢出的错误...System.out.println(testFinalizeObjectSoftReference.get()); try { //我们启动参数设置的是-Xmx16m,所以这里一定会抛出内存溢出的错误...放入队列后,才会真正被回收 引用 WeakReference 用来描述非必须的对象,但是它的强度比软引用更弱一些,被引用关联的对象只能生存到下一次垃圾收集发生之前。...,只要这个对象只有引用,就会被放入队列中。

25920

【必知必会】深入解析强引用、软引用引用、幻象引用

在强引用面前,即使JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),让程序异常终止,也不会靠回收强引用对象来解决内存不足的问题。...JVM会确保在抛出OOM前清理软引用指向的对象,而且JVM是很聪明的,会尽可能优先回收长时间闲置不用的软引用指向的对象,对那些刚构建的或刚使用过的软引用指向的对象尽可能的保留。...引用与软引用最大的区别就是引用比软引用的生命周期更短暂。垃圾回收器会扫描它所管辖的内存区域的过程中,只要发现引用的对象,不管内存空间是否有空闲,都会立刻回收它。...如同前面我说过的,具体的回收时机还是要看垃圾回收策略的,因此那些引用的对象并不是说只要达到引用状态就会立马被回收。 基于引用的这些特性,引用同样可以应用在很多需要缓存的场景。...但是有个问题,如果我们错误的保持了强引用(比如,赋值给了static变量),那么对象可能就没有机会变回类似引用的可达性状态了,就会产生内存泄露。

47020

js WeakMap用法

创建 可以使用 new 关键字实例化一个空的 WeakMap: const wm = new WeakMap(); 注意:映射中的键只能是 Object 或者继承自 Object 的类型,尝试使用非对象设置键会抛出...}, key2 = { id: 2 }; const wm = new WeakMap([ [key1, 1], [key2, 2] ]); 注意: 只要有一个键无效就会抛出错误...意思就是,这些键不属于正式的引用,不会阻止垃圾回收。但要注意的是,映射中值的引用可不是“地拿着”的。...因为没有指向这个对象的其他引用,所以当这行代码执行完成后,这个对象键就会被当作垃圾回收。然后,这个键/值对就从映射中消失了,使其成为一个空映射。...因为不可能迭代,所以也不可能在不知道对象引用的情况下从映射中取得值。即便代码可以访问 WeakMap 实例,也没办法看到其中的内容。

2.7K21

【JVM从小白学成大佬】3.深入解析强引用、软引用引用、幻象引用

在强引用面前,即使JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),让程序异常终止,也不会靠回收强引用对象来解决内存不足的问题。...JVM会确保在抛出OOM前清理软引用指向的对象,而且JVM是很聪明的,会尽可能优先回收长时间闲置不用的软引用指向的对象,对那些刚构建的或刚使用过的软引用指向的对象尽可能的保留。...对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。...如同前面我说过的,具体的回收时机还是要看垃圾回收策略的,因此那些引用的对象并不是说只要达到引用状态就会立马被回收。 基于引用的这些特性,引用同样可以应用在很多需要缓存的场景。...但是有个问题,如果我们错误的保持了强引用(比如,赋值给了static变量),那么对象可能就没有机会变回类似引用的可达性状态了,就会产生内存泄露。

46010

理解Java中的强引用,软引用引用,虚引用

在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用引用了...当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。...运行结果 当运行至Object[] objArr = new Object[Integer.MAX_VALUE]时,如果内存不足,JVM会抛出OOM错误也不会回收object指向的对象。...引用与软引用的区别在于:只具有引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有引用的对象,不管当前内存空间足够与否,都会回收它的内存。...引用还可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。

1.8K20

LeakCanary 详解

具体的检查操作是循环检查引用的返回是否为空,以及检查与引用相关的队列,如果引用被回收了,引用相关的WeakReference就会被加入到队列中。使用这个方式检查内存泄漏。...即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误 String str = "hello"; // 强引用 str = null;...// 取消强引用引用 在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收;只有在内存空间不足时,软引用才会被垃圾回收器回收。...SoftReference softName = new SoftReference("haha"); 引用 具有引用的对象拥有的生命周期更短暂。...因为当 JVM 进行垃圾回收,一旦发现引用对象,无论当前内存空间是否充足,都会将引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现引用对象。

17300

深入理解 LeakCanary

具体的检查操作是循环检查引用的返回是否为空,以及检查与引用相关的队列,如果引用被回收了,引用相关的WeakReference就会被加入到队列中。使用这个方式检查内存泄漏。...即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误 String str = "hello"; // 强引用 str = null;...// 取消强引用引用 在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收;只有在内存空间不足时,软引用才会被垃圾回收器回收。...SoftReference softName = new SoftReference("haha"); 引用 具有引用的对象拥有的生命周期更短暂。...因为当 JVM 进行垃圾回收,一旦发现引用对象,无论当前内存空间是否充足,都会将引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现引用对象。

23710

LeakCanary 原理

具体的检查操作是循环检查引用的返回是否为空,以及检查与引用相关的队列,如果引用被回收了,引用相关的WeakReference就会被加入到队列中。使用这个方式检查内存泄漏。...即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误 String str = "hello"; // 强引用 str = null;...// 取消强引用引用 在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收;只有在内存空间不足时,软引用才会被垃圾回收器回收。...SoftReference softName = new SoftReference("haha"); 引用 具有引用的对象拥有的生命周期更短暂。...因为当 JVM 进行垃圾回收,一旦发现引用对象,无论当前内存空间是否充足,都会将引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现引用对象。

30220

Java引用类型有哪些

从JDK1.2开始,Java中的引用类型分为四种,分别是: ①强引用(StrongReference) ②软引用(SoftRefernce) ③引用(WeakReference) ④虚引用(PhantomReference...,当内存不足时,宁愿抛出OutOfMemeryError异常也不会通过回收强引用的对象,因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。   ...引用-WeakReference   只有引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,引用都会被回收。...引用可以结合ReferenceQueue来使用,当由于系统触发gc,导致软引用的对象被回收了,JVM会把这个引用加入到与之相关联的ReferenceQueue中,不过由于垃圾收集器线程的优先级很低,...所以引用不一定会被很快回收。

1.1K10

Java引用类型具体解释

JVM  垃圾收集对不同类型的引用的有一种不同的方法。java对于它的对象。仅仅存在有引。它会一直存在于内存中。假设越来越多这样的对象,外JVM的内存量。JVM抛出OutOfMemory错。...当JVM中的内存不足的时候,垃圾回收器会释放那  些仅仅被软引用所指向的对象。假设所有释放完这些对象之后,内存还不足,才会抛出OutOfMemory错误。软引用很适合于创建缓存。...引用(weak reference) 引用(weak reference)在强度上于软引用,通过类 WeakReference来  表示。它的作用是引用一个对象,可是并不阻止该对象被回收。...假设使用一个强引用的话。仅仅要该引用存在。那么被引用的对象是不能被回收的。 引用则没有这个问题。 在垃圾回收器执行的时候,假设一个对象的全部引用都是引用的话,该对象会被回收。...引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。引用最常见的用处是在集合类中,尤其在哈希表中。 哈希表的接口同意使用不论什么Java对象作为键来使用。

29320

java 引用类型

java 中对象的引用类型分为四种:强引用引用引用、虚引用引用(StrongReference) 就是我们平时最常用的,Student stu=new Student();这里的引用就是个强引用...强引用有个特点,为什么说它强呢。就是你内存中的对象已经多到了一种地步。都抛出内存不足(OutOfMemoryError)的错误了,程序也不会释放你强引用的对象。...引用(WeakReference) 当时第一次接触是一个叫做WeakHashMap的东西,当时在想他有什么不一样,怎么还就Weak了呢。 它的引用强度要稍一些,或者说对与对象的牵制要一些。...它的作用是引用一个对象,但是并不阻止该对象被回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。引用则没有这个问题。...在垃圾回收器运行的时候,如果一个对象的所有引用都是引用的话,该对象会被回收。引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系.接触耦合关系,这一点蛮重要也是我们要利用的一点。

91410
领券