该代码需要在计算机上运行,并且需要一系列计算机资源:内存,网络端口,打开文件等。这些资源将过程称为过程。
该过程具有一个特殊的控制块来记录这些资源,称为过程控制块(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不会使用程序员手动管理内存,但没有垃圾回收。它限制了对象只能有一个参考,以便可以回收函数调用。内存泄漏放置在全局对象中(因为仅允许一个引用)。
这是语言开发的定律,使程序员做得更少,并使程序更强大。这需要更智能的语言设计,这是一个更强大的编译器/解释器。