内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存越界
你想系统申请一块内存,在使用的这块内存的时候,超过出了你申请的范围。
内存溢出
你要分配的内存超出了系统能给你的,系统不能满足需求,于是产生了溢出
# 内存越界
int a[10];
a[12] = 10
# 内存溢出
char str[5] = "1234567";
出core
当程序中出现内存操作错误时,会发生崩溃并产生核心文件(core文件)。
C程序程序异常退出后会将内存镜像写到名为core.进程号的文件中,便于后续gdb查bug。
脏数据
脏数据(Dirty Read)是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源系统中存在不规范的编码和含糊的业务逻辑。
在数据库技术中,脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。依据脏数据所做的操作可能是不正确的。
句柄泄露
句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量 。
Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
我们在开发Linux在线server的时候常常会遇会句柄泄露的问题。由于在Linux系统设计里面遵循一切都是文件的原则。即磁盘文件、文件夹、网络套接字、磁盘、管道等,全部这些都是文件。在我们进行打开的时候会返回一个fd,即是文件句柄。
假设频繁的打开文件,或者打开网络套接字而忘记释放就会有句柄泄露的现象。在Linux系统中对进程能够调用的文件句柄数进行了限制。在默认情况下每一个进程能够调用的最大句柄数是1024个。假设超过了这个限制,进程将无法获取新的句柄,而从导致不能打开新的文件或者网络套接字,对于线上server即会出现服务被拒绝的情况。
查看与改动句柄:
在Linux系统中能够通过ulimit–n查看每一个进程限制的最大句柄数,通过ulimit –HSn 10240改动进程的最大句柄数。
当句柄数目达到限制后,就回出现”too many files open”。
尽量避免硬编码
硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践,与从外部获取数据或在运行时生成数据不同。 硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改,尽管可以使用调试器或十六进制编辑器在内存或磁盘上进行更改。 硬编码的数据通常表示不变的信息,例如物理常量,版本号和静态文本元素。 另一方面,软编码数据对用户输入,HTTP服务器响应或配置文件等任意信息进行编码,并在运行时确定。
**硬编码:**就是将数据直接写入到代码中进行编译开发,比如在没有mybatits前,将sql语句写入到jdbc代码里,在比如纯jsp开发的过程中,将前端的html代码与java代码耦合,这都是应编码,如果要发生更改的问题,就需要更改源代码,如果是C/S开发,就直接一位这,客户端的软件需要重新下载安装,非常不合理。
**软编码:**则是将数据与源代码解耦,比如mybatis的配置文件,将sql于底层代码分离,就只对外暴露SQL语句供程序员编写。还比如使用mvc的设计模式,将纯jsp开发过程中的前端html代码和后端代码耦合的情况分离成view和controller模块,做到了解耦,也就实现了软编码,更加合理。
简单来说,硬编码就是什么都在你的程序代码里面写死了,你想稍微修改一下效果,都得修改你的代码。
**举个例子:**比如说你做个软件,他有菜单栏,你如果把菜单的标题全部写在代码里,那如果现在要换英文的,你就不得不改变代码。
现在换一种方式,你把菜单标题全部写在一个文本里,比如叫title.txt,现在你要英文,那么只要把title.txt里面相对应的值换成英文就可以了。不用在去该代码本身。

本文深入探讨了内存管理中的常见问题,包括内存泄漏、内存越界、内存溢出及句柄泄露,同时讲解了脏数据的概念及其对业务的影响。文章还对比了硬编码与软编码的区别,为读者提供了全面的内存管理和数据处理知识。
1万+

被折叠的 条评论
为什么被折叠?



