知识大陆:由加载DLL文件串起来的知识点

一、由问题引发的思考

  问题的源泉:https://bbs.csdn.net/topics/390765099
  最近有关于『如何单独加载带有依赖项DLL』的问题,在寻找过程中被一个问题吸引住了,即上方连接中提到的“内存泄漏”的问题。文中提到是加载DLL引发的问题,我一琢磨,反射技术的应用也应该会引发相同的问题吧?
  于是,我百度一搜,眼睛一眯,心中暗道:“果然会有此类问题。”
  附一个有关『反射造成内存泄露的解决方法』的博客链接。
  反射的特别好用,工作中经常会用到。突然脑瓜一拍,我得明白内存泄漏到底是咋回事啊,查着查着,就把之前学习的知识串联起来的,有了此篇文章。

二、内存泄漏

  啥玩意儿是内存泄漏呢?网上有很多的精彩解释,此篇博文很是精彩

  百度百科:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
  以产生的方式来分类,内存泄漏可以分为四类:
  1. 常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。
  2. 偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
  3. 一次性内存泄漏:发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。
  4. 隐式内存泄漏:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。

  OK,当我看完这些资料的时候,我就大概明白了是怎么回事了,瞬间和我软考与自考学习过程中学习到的知识联系了起来。人有衣服话有头,我们先从内存串起来吧!

三、内存

  学习嘛,总要站在巨人的肩膀上。如今的学习资料可谓浩如烟海,有诸多可以让我们了解的地方,单靠自己悟,最起码未到技术前沿之前是不适合的,所以继续看前辈们留下来的心血吧。

1. 内存是啥啊?

  家中有电脑的话,可能会发生这样一件事:内存条坏了,需要更换内存条。购买的时候内存条还不能瞎买,得看看DDR版本、频率容量是否合适。
  诶,突然发现内存有4G的,8G的,这会不会是我们存放我们下载的东西的地方呢?如果是,那容量是不是太小了,而且这么贵。
  后来你了解到硬盘才是存放我们下载文件的地方,那么内存是干啥使得呢?
  首先,内存与硬盘同属于『存储器』,没错,都是用来存放数据的容器,除此之外,还有寄存器高速缓存,四者共同构成计算机的存储体系。存储器的速度和容量基本是成反比的,我们按照速度由快到慢排序为:
  寄存器高速缓存内存(或者称**“主存”)—硬盘(还有其他同类产品,比如硬盘、软盘)
  那么这些存储器的作用是啥呀?我们接着串起我们的知识。

2. 各类存储器的作用

  公审大会开始啦,我们按照速度确定选手的次序,我们有请第一位选手。

2.1 寄存器

  说到寄存器,不如我们看一下CPU的构造吧。
CPU组成结构结构示意图
  通过这幅图片,我们发现了CPU中有好多寄存器:地址寄存器,指令寄存器等等有好多个。呐,我们的寄存器的工作环境,一般也就是这样了。如果把CPU比作人的心脏的话,那么寄存器就是心脏中的一些东西。
  寄存器分为基本寄存器移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。
  寄存器的作用不一,但主要用于存放数据和指令的。比如说指令寄存器是用来存储当前指令的。但他们都有一个特点:容量特小,但是速度奇快。指令和数据来源于内存(但是指令和数据储存在硬盘中,如有不解,往下看)。

2.2 高速缓存

  高速缓冲存储器是介于CPU与内存之间的存储器,容量比寄存器大但速度较之较慢, 接近于CPU的速度;容量比内存小,速度比内存大。高速缓存是加速CPU读取内存速度的一个通道。CPU向内存读取数据时,首先查询缓存区是否有对应数据,如果有则直接读取,没有再从内存中读取。高速缓存中存储的都是内存中的数据,这部分数据是cpu访问比较频繁的部分。
  系统也会动态管理缓存中的数据,如果有数据访问频率降低到一定值,就从缓存中移除,而将内存中访问更加频发的数据替换进去。(高速缓存可以不只一级,可以有多级缓存区)。

2.3 内存

  这是我们此篇博文的主角。我们所运行的程序都是运行在内存当中的,虽然我们的程序安装在硬盘当中。
  打个比方讲:我处理食材喜欢在一个大桌子上进行,将所有的食材放到桌子上。桌子上放置一个案板,当我想要处理某项食材时,我就把它放到案板上。我们可以把桌子看成硬盘,案板当做内存,某项食材看成数据或着程序、文件等等。那我们可以总结一下特点:
  1.内存和硬盘空间不是一个东西(物理上两者一个是内存条,一个是硬盘)。
  2.我们跑的程序,程序用到的数据,都是从内存中调取的,但他们存放在硬盘当中。
  那问题来了:我们的数据都存在硬盘当中,但是内存那么小,如果内存中没有我们需要的数据,那该咋办?
  这就是页面置换的问知识点了,知识点太多了,有机会另开一篇吧。
  我们知道我们的内存为CPU输送数据,那么具体存放什么呢?(详见此篇博客
内存中的六类空间
  我们在编写代码时候,与我们息息相关的就是全局区、栈区、堆区。全局区与我们程序中的静态变量有关系,而堆区、栈区则与值类型与引用类型数据有关系,可见此篇博文

2.4 硬盘

  相比其他的储存器而言,硬盘可大得多,现在的硬盘基本上是TB级别的。此类存储器可以称为外存。除此之外,还有早期的软盘,光盘等等。


  考虑到篇幅,此篇博文至此结束,文中有好多的博客链接,可供查阅,如此下来,知识量也还可以。
  日后再会!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章