当前位置: 首页 > 网络应用技术

不同内存管理方法的聪明程度PK

时间:2023-03-07 12:37:45 网络应用技术

  该代码需要在计算机上运行,并且需要一系列计算机资源:内存,网络端口,打开文件等。这些资源将过程称为过程。

  该过程具有一个特殊的控制块来记录这些资源,称为过程控制块(PCB)。

  这些资源中最重要的是内存。当该过程启动时,它将适用于操作系统以进行某些内存。

  如果内存是无限的,那么我们将数据,代码等放置,不用担心,但不幸的是,内存是有限的。我们必须及时回收未使用的内存并使用它来放置其他物体。为了正常运行。

  内存分为代码区域,全局数据区域,堆区,堆栈区域等。这是操作系统可执行文件的内存模型。如果它是JavaScript和Java之类的解释语言,它也将成为您自己的一些部门。但总体而言,它们分为这些部分。

  内容基本上没有变化。

  在功能调用中库存局部变量。每个功能都有一个堆栈框架。它具有上限。呼叫级别太深了。

  存储全局变量。

  堆栈区域和全球数据区域中的大对象将存储在堆上,仅留下一个参考。

  存储动态分配的大型对象是内存最多的,我们的内存管理主要是管理堆内存。

  为了管理这三个点三点土地的堆叠内存,不同的语言具有不同的方式和不同程度的聪明程度。让我们看看谁更聪明:

  C,C ++的内存由程序员手动管理。例如,C ++类具有构造函数和破坏性函数,在构造函数中应用内存,并且驱动器释放这些内存。

  是否没有发布某些内存取决于程序员并查看程序员级别。

  Tencent曾经使用C ++使用C ++作为服务方面,但后来逐渐转到Java和Java,因为C ++手动手动管理内存,以防程序员错过了一些内存并且没有发布,那就是那是它没有发布,然后就这样(不再使用的内存一直被占用,导致可用内存的减少),并且服务器运行了很长时间。轻微记忆泄漏的逐渐积累将最终导致该过程崩溃。

  依靠程序员难以确保不必要的内存太难。如果程序可以单独恢复这些垃圾记忆,则程序员将被解放,并且代码可靠性更高。因此,后来的高级语言基本上具有自动垃圾回收机制。

  C ++手动管理内存的方式太麻烦了,因此程序员不允许程序员在Java和JavaScript的设计开始时操作内存。取而代之的是,他们自己制作了垃圾回收机制,并定期发布了无用的记忆。

  如何检测哪个内存无用?最初的想法是记录每个对象的引用数量。如果没有引用,则可以回收。这个想法被称为。

  但是这个想法有问题。如果有两个对象,您引用了我的话,我引用了您,而其他对象都没有其他对象引用。

  看来这种方法还不够聪明。如何优化?

  从总体对象开始,再次标记所有参考对象,如果没有标记,则将其清除。这样,无论循环未引用还是引用它,但其他对象都不会引用它,可以检查它。这个想法被称为。

  删除的想法更聪明,因此当前的JS引擎基本上使用了此想法。

  这种记忆管理的想法实际上是问题。如果未使用的对象,它将永远不会被回收。

  这只能由程序员检查,并找到一些不应通过工具放置在整个情况中的变量。

  JS的内存泄漏通常使用Chrome DevTools的存储器工具。他可以在特定时间点获得记忆快照。经过一些操作后,再次进行内存快照。哪个全局变量。然后将代码泄漏定位。

  例如,这样的代码:

  5s之后,在全球状态下声明了变量AAA,该状态是正则表达式类型。

  我们使用Chrome Devtools的内存工具分别拍摄两个快照。

  这里有不同的看法。我们选择比较视图以比较两个快照:

  可以看出,Delta的列显示了正则表达式 + 1的对象,该对象是计时器中声明的全局变量。

  通过此内存快照的对比,由可以找到哪些操作的内存泄漏,然后代码已找到。

  自动垃圾回收避免了程序员的泄漏是由某些内存引起的,但是仍然会导致全球无用的对象引起的泄漏。该方案更聪明,但这也是一个问题。

  Rust不需要程序员手动管理内存,但是没有垃圾回收,但是内存管理效果更好,并且可以避免99%的内存泄漏。

  Rust认为,堆中的物体很难管理,因为它被太多地方引用。如果对象只能属于函数,则只有一个引用。

  所有权机制可以管理内存,而无需对象引用参考。而且,JS意外地将对象置于整体情况下。

  Rust的所有权机制是一种更明智的记忆管理方式,因此,Rust越来越受欢迎。

  该过程的可用内存是有限的。未及时使用的变量的内存需要及时发布。不同的语言有不同的方法来管理内存管理。聪明的程度不同:

  C,C ++依靠程序员自己管理内存。如果偶然地,如果未释放某个内存,则会泄漏。

  Java和JavaScript不允许管理程序员本身。他们有特殊的垃圾回收。对第一个参考计数进行计数,后来更改为标记删除。通过这种方式,无用的内存发布。

  但是,如果将无用的物体放置在整个情况下,它将不会被回收。这是内存泄漏。您需要使用Chrome Devtools的内存工具记录两个快照,然后进行差异以找到内存以导致内存导致内存尖锐的代码。

  Rust不会使用程序员手动管理内存,但没有垃圾回收。它限制了对象只能有一个参考,以便可以回收函数调用。内存泄漏放置在全局对象中(因为仅允许一个引用)。

  这是语言开发的定律,使程序员做得更少,并使程序更强大。这需要更智能的语言设计,这是一个更强大的编译器/解释器。