这是一个非常基本的问题.我将使用C和 Java来制定它,但它确实与语言无关.
考虑C中一个众所周知的问题:
struct Obj
{
    boost::shared_ptr<Obj> m_field;
};

{
    boost::shared_ptr<Obj> obj1(new Obj);
    boost::shared_ptr<Obj> obj2(new Obj);
    obj1->m_field = obj2;
    obj2->m_field = obj1;
}

这是一个内存泄漏,大家都知道:)解决方案也是众所周知的:应该使用弱指针来打破“引用联盟”.还知道这个问题原则上不能自动解决.解决这个问题的程序员是唯一的责任.

但是有一个积极的事情:程序员完全控制了refcount值.我可以在调试器中暂停我的程序,并检查obj1,obj2的引用,并了解有一个问题.我还可以在对象的析构函数中设置断点,并观察破坏时刻(或者发现该对象未被销毁).

我的问题是关于Java,C#,ActionScript和其他“垃圾回收”语言.我可能会错过一些东西,但在我看来他们是

不要让我检查物体的计数
>对象被破坏时,不要让我知道(当对象暴露于GC时可以)

我经常听到这些语言不允许程序员泄漏记忆,这就是为什么他们是伟大的.据我所知,他们只是隐藏内存管理问题,难以解决.

最后,问题本身:

Java的:

public class Obj
{
    public Obj m_field;
}

{
     Obj obj1 = new Obj();
     Obj obj2 = new Obj();
     obj1.m_field = obj2;
     obj2.m_field = obj1;
}

>是内存泄漏吗?
>如果是,我如何检测并修复它?
>如果否:为什么?

解决方法

托管内存系统是建立在您不想首先跟踪内存泄漏问题的假设的基础上的.不要让它们更容易解决,您可以尝试确保它们始终不会发生.

Java确实有一个“内存泄漏”的缺点,这意味着内存的任何增长可能会影响到你的应用程序,但从来没有一点,托管内存不能清理所有的内存.

JVM不使用引用计数的原因有很多

>如您所观察到的,它不能处理循环引用.
它具有显着的内存和线程开销以保持准确.
>管理内存处理这种情况有更好,更简单的方法.

尽管JLS不禁止使用引用计数,但它并不用于任何JVM AFAIK.

相反,Java跟踪一些根上下文(例如每个线程堆栈),并且可以根据这些对象是否可以很强地跟踪哪些对象需要保留,哪些可以被丢弃.它还提供弱引用的设施(只要对象没有被清除就保留)和软引用(通常不会被清理,但可以在垃圾收集器处理)

java – 垃圾回收与手动内存管理的更多相关文章

  1. 处理内存管理和iOS Cordova项目?

    任何人都可以告诉我如何处理基于iOSCordova的项目中的内存管理“收到内存警告”当我在iPhone或iPad上运行时,我在iOSCordova项目中收到此警告.我在我的应用程序中使用CDVlocation进行地理定位.我主要是在加载基于地图的视图时收到此消息.我正在使用基于ARC的Xcode项目任何帮助管理内存警告与cordova“收到内存警告”将不胜感激.谢谢你们解决方法在CDVPlugin.m中尝试这种方式

  2. ios – 为什么重复创建和删除SKShapeNode和SKNode导致内存泄漏?

    使用Xcode附带的spritekit模板,我修改场景如下:该应用程序似乎继续使用更多内存,直到它挂起或崩溃.使用泄漏和分配工具,我发现了以下内容:泄漏:分配:从图像中可以看出,存在大量使用内存的Malloc调用.我不直接调用Malloc–似乎这些调用是由SpriteKit完成的.同样,存在许多内存泄漏,这似乎也是由于SKShapeNode,SKNode或其他SpriteKit对象造成的.我如何解决或解决此内存(泄漏)问题?

  3. ios – Xcode显示内存泄漏,但仪器没有

    当我从Xcode运行我的应用程序时,很明显我有一个内存泄漏:当我提供一个自定义的ViewController时,内存增加,但是当我关闭它时,它不会退回.所以我也检查了使用仪器的分配工具,但这说明了一个不同的故事:可以看出,当我呈现ViewController时,仪器会显示尖峰,但是当内存使用被关闭时,内存使用率将恢复到以前的级别.我已经检查了我的代码至少15次,我个人无法找到任何内存泄漏,因此同意

  4. xcode – Swift 1.2中的神秘崩溃 – 仅在版本中构建

    我的理论是,Swift的内存管理在优化的版本编译中出现了一些问题,只是在NSArray从Cocoa到达的特定情况下,在我们的代码可以获得它们之前,我们将它们桥接到[AnyObject].这样的NSArray没有正确地穿过桥.但是通过转换到NSArray然后回到特定的[SomeType]Swift数组,问题就解决了.当然,我认为当苹果公司指出这一点时,他们会解决这个问题,然后我们可以停止使用这种解决方法.但直到那时,我的应用程序再次在Release版本中运行.

  5. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

  6. Xamarin.iOS在将C#编译为本机代码时对内存管理做了什么?

    什么Xamarin.iOS关于内存管理?使用通常的IL,我们有垃圾收集器,它处理未使用的对象和浮雕程序员调用删除.当Xamarin将代码编译为本机时,这是如何工作的?谁清理了不再使用的物体?这个问题回答了编译的工作原理,但没有解释内存管理部分:HowMonoTouchworks?

  7. ios – SBJson – 有内存泄漏?

    我刚刚克隆了SBJson框架的git存储库,并将源代码导入到我的应用程序中.跑了一个静态内存探查器,并从我看到的结果有点害怕.看图这怎么可能?我怀疑这个知名图书馆的开发者没有看到这个?事实上,如果运行内存配置文件,它会显示此库中的内存泄漏.有任何想法吗?

  8. swift语言的学习笔记六(ARC-自动引用计数,内存管理)

    Swift使用自动引用计数来管理应用程序的内存使用。当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。swift的ARC工作过程每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息。但是,如果ARC释放了正在被使用的实例,就不能再访问实例属性,或者调用实例的方法了。为了保证需要实例时实例是存在的,ARC对每个类实例,都追踪有多少属性、常量、变量指向这些实例。

  9. Swift内存管理概述

    Object-C的内存管理经历过2个阶段:手动引用计数内存管理MRC和自动引用计数内存引用管理ARC-MRC就是由程序员自己负责对象管理生命周期,负责对象的创建和销毁,ARC的程序员不用关心对象内存释放的问题,编译器在编译的时候在合适的代码位置插入内存释放代码。以C++和C为代表的手动内存管理模式,使用起来比较麻烦,经常导致内存泄露和内存过度释放等问题。

  10. Swift ARC-自动引用计数、内存管理

    当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。测试ARC输出结果从上面的例子来看,确实swift给我们自动管理了内存,很多时侯开发者都不需要考虑太多的内存管理。尽管ARC减少了很多内存管理工作,但ARC并不是绝对安全的。但是当无宿主引用所指实例被释放时,ARC并不能将引用值设置为nil,因为非可选类型不能设置为nil。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部