一、内存泄漏的检查方法:
1ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。
2Dmalloc-Debug Malloc Library
3Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库。
4Leaky-Linux下检测内存泄漏的程序。
5LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。
6MEMWATCH-由Johan Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。
7Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++
8KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree
9IBM Rational PurifyPlus-帮助开发人员查明C/C++、托管NET、Java和VB6代码中的性能和可靠性错误。PurifyPlus 将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。
二、内存泄漏的简单介绍:
内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
内存泄漏形象的比喻是“ *** 作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从 *** 作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。
随着互联网编程技术的不断发展,现在大多数的软件开发都是通过编程语言来实现的,今天我们就一起来了解一下C语言编程开发技术都有哪些优势和劣势。
C语言的一些好的体验
一次通过阅读POV-Ray源代码学会如何在C语言中实现面向对象编程。
通过阅读GTK+源代码了解C语言代码的清晰、干净和可维护性。
通过阅读SIOD和Guile的源代码,知道如何使用C语言实现Scheme解析器。
使用C语言写出GNOMEEye的初始版本,并对MicroTile渲染进行调优。
C语言的一些不好的体验
在Evolution团队时,很多东西老是崩溃。那个时候还没有Valgrind,为了得到Purify这个软件,需要购买一台Solaris机器。
调试gnome-vfs线程死锁问题。
调试Mesa,却无果。
接手Nautilus-share的初始版本,却发现代码里面居然没有使用free()。
想要重构代码,却不知道该如何管理好内存。
想要打包代码,却发现到处是全局变量,而且没有静态函数。
但不管怎样,还是来说说那些Rust里有但C语言里没有的东西吧。
自动资源管理
Rust从C++那里借鉴了一些想法,如RAII(ResourceAcquisitionIsInitialization,资源获取即初始化)和智能指针,并加入了值的单一所有权原则,还提供了自动化的决策性资源管理机制。
自动化:不需要手动调用free()。内存使用完后会自动释放,文件使用完后会自动关闭,互斥锁在作用域之外会自动释放。如果要封装外部资源,基本上只要实现Drop这个trait就可以了。封装过的资源就像是编程语言的一部分,因为你不需要去管理它的生命周期。
决策性:资源被创建(内存分配、初始化、打开文件等),然后在作用域之外被销毁。根本不存在垃圾收集这回事:代码执行完就都结束了。程序数据的生命周期看起来就像是函数调用树。
如果在写代码时老是忘记调用这些方法(free/close/destroy),或者发现以前写的代码已经忘记调用,甚至错误地调用,那么以后我再也不想使用这些方法了。
泛型
Vec真的就是元素T的vector,而不只是对象指针的数组。在经过编译之后,它只能用来存放类型T的对象。
在C语言里需要些很多代码才能实现类似的功能,所以我不想再这么干了。
trait不只是interface
Rust并不是一门类似那样的面向对象编程语言,它有trait,看起来就像是里的interface——可以用来实现动态绑定。如果一个对象实现了Drawable,那么就可以肯定该对象带有draw()方法。
不过不管怎样,trait的威力可不止这些。
依赖管理
以前实现依赖管理需要:
手动调用或通过自动化工具宏来调用g-config。
指定头文件和库文件路径。
基本上需要人为确保安装了正确版本的库文件。
而在Rust里,只需要编写一个Cargotoml文件,然后在文件里指明依赖库的版本。这些依赖库会被自动下载下来,或者从某个指定的地方获取。
测试
C语言的单元测试非常困难,原因如下:
内部函数通常都是静态的。也就是说,它们无法被外部文件调用。测试程序需要使用#include指令把源文件包含进来,或者使用#ifdefs在测试过程中移除这些静态函数。
需要编写Makefile文件将测试程序链接到其中的部分依赖库或部分代码。
需要使用测试框架,并把测试用例注册到框架上,还要学会如何使用这些框架。
卫生宏(HygienicMacro)
Rust的卫生宏避免了C语言宏可能存在的问题,比如宏中的一些东西会掩盖掉代码里的标识符。Rust并不要求宏中所有的符号都必须使用括号,比如max(5+3,4)。
没有自动转型
在C语言里,北京北大青鸟发现很多bug都是因为在无意中将int转成short或char而导致,而在Rust里就不会出现这种情况,因为它要求显示转型。
不会出现整型溢出
这个就不用再多作解释了。
Thread对象本身是在堆内存创建的,调用start()后开辟的线程空间是属于栈内存的。内存管理在Java语言中是JVM自动 *** 作的,当JVM发现某些对象不再需要的时候,就会对该对象占用的内存进行重分配(释放) *** 作,而且使得分配出来的内存能够提供给所需要的对象。
在一些编程语言里面,内存管理是一个程序的职责,但是书写过C++的程序员很清楚,如果该程序需要自己来书写很有可能引起很严重的错误或者说不可预料的程序行为,最终大部分开发时间都花在了调试这种程序以及修复相关错误上。
相关信息
在以前的编程过程中,手动内存管理带了计算机程序不可避免的错误,而且这种错误对计算机程序是毁灭性的,所以内存管理就成为了一个很重要的话题,但是针对大多数纯面向对象语言而言,比如Java,提供了语言本身具有的内存特性。
自动化内存管理,这种语言提供了一个程序垃圾回收器(Garbage Collector[GC]),自动内存管理提供了一个抽象的接口以及更加可靠的代码使得内存能够在程序里面进行合理的分配。最常见的情况就是垃圾回收器避免了悬挂引用的问题。
因为一旦这些对象没有被任何引用“可达”的时候,也就是这些对象在JVM的内存池里面成为了不可引用对象,该垃圾回收器会直接回收掉这些对象占用的内存,当然这些对象必须满足垃圾回收器回收的某些对象规则,而垃圾回收器在回收的时候会自动释放掉这些内存。
VBA吃CPU和内存,但是它更多的是吃CPU。VBA是一种脚本语言,它可以用来编写自动化任务,以及控制应用程序的行为。VBA的运行需要CPU的处理能力,因此它会消耗CPU资源。此外,VBA也会消耗内存,因为它需要存储变量和数据,以及执行指令。
要解决VBA吃CPU和内存的问题,首先要确定是否有不必要的循环或者重复的 *** 作,如果有,可以尝试优化代码,减少不必要的循环或者重复的 *** 作。其次,可以尝试使用更高效的数据结构,比如数组,以减少内存的使用。最后,可以尝试使用更高效的算法,比如分治法,以减少CPU的使用。
一、基础数据概况
CMDB中文是配置管理数据库,存储与管理企业IT架构中设备的各种配置信息,与未来的IT运维管理标准化和流程化紧密关联,并且支持流程的运转。运维管理平台创建初期或初版中的CMDB更多是偏向IT资产管理,我们在这里定义的IT资产管理,暂时抛除公司个人使用的普通PC机。
日志主要存储CMDB中涉及到服务器或是其它设备的日志信息。
DB主要是所有IT系统的数据库信息,包括运维管理系统本身的数据库。由于数据库的重要性,所以在基础数据中单独一个模块管理数据库,包括生产数据库、测试数据库、开发数据库。数据库的日志放在日志模块进行统一管理,监控和备份。
知识库主要存储日常运维管理中发生的事件、问题以及一些经典问题的解决和常用的解决方案,主要起到运维管理辅助的功能。
二、基础数据三要素
基础数据要求完整、准确、实时,这三个特性缺一不可。
1完整性
完整性,要求在数据采集整理阶段,要一一梳理,不能有遗漏。任何一个设备的疏漏都将会导致未来出现问题。例如最近的勒索病毒在防范上需要给服务器升级打补丁,这个时候就是根据服务器清单一一对照,升级。如果有遗漏落下的服务器未及时打补丁而导致病毒入侵,后果将很严重。那么,如何做到完整性呢?大致可以分为以下几步:
首先数据采集阶段多人(推荐三人以上)同时对IT资产进行采集,那么在数据采集完成后,将会有三份或以上的IT资产清单。
接下来就是相互确认阶段。相互check对比两方的清单和自己梳理的清单,找到不一样的地方,大家在一起开会进行讨论。经过这个阶段,会产生一份相对完整且三方(或以上)认可的IT资产清单。
最后就是三方(或以上)一同针对认可的IT资产清单进行最终check,确保最后的清单,是经过多方讨论确认,并最终又check过的IT资产清单。此时这份IT资产清单,相对比较完整。另外在梳理、讨论和check的过程中,针对新增、变更、删除的IT资产一定要及时更新我们的IT资产清单。
2准确性
准确性要求IT资产清单或是CMDB中存储的数据不能与实际情况有任何差异。要做到基础数据的准确性除了在数据采集阶段要下功夫外,要在运维管理的每一个阶段定期对基础数据进行审计,确保基础数据中的数据无误。一般月度一小审,半年一大审,具体情况根据企业的IT规模而定。
3实时性
基础数据的实时性可以确保数据的准确性。即基础数据的每一次变动,包括增加、删除、修改,不论大小,只要有变动(在运维流程完结阶段,执行运维 *** 作成功后,就要及时更新基础数据。忽略基础数据的实时性,必将导致准确性大打折扣,在以后的月审、年审中必将导致额外的工作量。一般在审计的过程中,当数据的错误率达到一定程度后,需要重新梳理全部数据,以确保最终的准确和完整。
CMDB
CMDB总的来说分为:产品线、资产管理、供应商管理三个部分。
总的思路是:通过产品线管理IT资产,通过IT资产信息管理硬件或服务提供者,供应商管理。
1产品线
产品线是指整个公司所有IT系统、产品按照属性进行归类划分。这有一个前提,就是梳理整个公司的IT项目和IT服务。这里项目也可以理解为每一套IT系统,例如OA、CRM、订单系统、支付系统等等。
IT服务主要是指:应用服务(Tomcat、WebLogic、数据库服务等),基础IT服务如Nginx、Varnish、Redis等。通过项目和服务两个维度来管理IT资产,尤其是虚拟机。因为一般系统和服务都是部署在虚拟机上,虚拟机的宿主机则是一台台物理主机。
产品线的划分一般除了根据业务分类划分几个大的产品线外,还需要划分一些基础产品线,如:信息安全产品线,主要管理信息安全、网络安全等系统和设备等;基础服务产品线,如Nginx反向代理大部分系统,Varnish缓存Web静态资源等。
在这里单独说一下产品线和项目包括的服务必须制定运维优先级等级。运维等级的制定不能简单定义为多少级,而应该是为每一套系统进行运维优先级打分,分值不能一样。这样保证在大面积故障的时候,可以根据优先级解决问题。
2资产管理
资产管理主要有以下几个方面。
首先是比较大的机房管理。有的企业可能会有多个机房,每个机房的基础信息,如带宽、位置、值班电话等都需要加以整理存储用来管理机房信息。机房中的机架、机柜、交换机、路由器等硬件信息,机房的空调、UPS电源、环境监测系统等都属于机房管理的范畴。
安全设备管理。安全设备管理这里主要包含防火墙、IPS、WAF、***等网络设施。企业信息安全非常重要,在运维管理中也把安全作为一个单独的模块进行管理。通过购买安全硬件设备和安全服务,不断学习和研究,从而保护好企业数据信息。
服务器管理。这里假定企业实现了虚拟化,大部分系统和服务都部署在虚拟机,而虚拟机是部署在物理机上。服务器管理分物理机和虚拟机分开管理,同时又密切关联。虚拟机在哪一台或几台物理机需记录清楚。
根据产品线中定义的运维优先度等级,在资产管理中的每一个节点标注上相应的等级分值,以便出现大规模故障,有选择、有重点、有顺序地逐一解决问题。
3供应商管理
供应商管理主要是管理由第三方企业提供的IT系统或设备的服务信息。记录供应商的具体信息、值班电话、硬件备件库等信息。
以上几个模块单独管理,但是又密切相连。如产品线包含哪些项目,包含哪些服务,这些项目和服务部署在哪些虚拟机上,虚拟机又在哪一些物理机上,物理机分布在哪些机房和在机房中的具体位置,物理机在机房中的网络位置和网络架构如何,经过哪些安全设备等等。
反过来需要知道某一些机房有哪一些物理机,物理机位置,安全设备,以及安全设备与物理机的网络架构等,物理机上又有哪些虚拟机上部署了哪一些项目和服务等。系统和服务属于哪些供应商提供,供应商又提供了哪些系统、设备或服务器等。都要多维度进行管理。要求做到某一环节的故障,一查就知道所有受影响的系统和服务。CMDB中的信息相互交织,多维度查询和管理,构建出一张完整的总体架构图,通过总体架构图除了展现出各个部分的基础信息外,还描述了所有的依赖关系,做到坏一点而知全面。
日志
通过日志可以比较准确全面地知道系统或是设备的运行情况,可以返查问题产生的原因,还原问题发生的整个过程。通过日志也可以提前预测系统可能要发生的问题或是故障,如系统安全日志,如果网络攻击会在系统安全日志中有一定的体现。
1系统日志
系统日志主要指的是 *** 作系统的日志,主要在/var/log下的各种日志信息。包含系统 *** 作日志、系统安全日志、定时任务日志等。系统日志是运维管理安全模块中审计的重要依据。一般默认的 *** 作系统日志不能满足要求,需要对系统的参数进行修改,如为history命令加上时间戳、IP,并且长久保留历史等功能。并且对日志文件进行处理,不允许用户进行清空命令,只能append。
2应用日志
应用日志主要记录应用服务的健康运行情况以及业务 *** 作的具体日志两部分。应用监控运行情况反应应用服务的健康状态,如果应用占用CPU或是内存过高或是忽高忽低不定,都可以通过分析应用日志结合业务 *** 作日志得出结论。业务 *** 作日志可以为业务审计提供主要依据。有一些系统喜欢把业务 *** 作日志写到数据库中,这个也是需要注意的。不过不管在哪个地方,要求是不可缺少的,它为以后业务审计和问题返查提供依据。
3数据库日志
数据库日志主要反馈数据库的运行情况。通过监控和管理数据库的日志,及时了解数据库的运行情况,遇到问题及时解决等。可以通过数据库日志结合数据库系统自带的数据库如Oracle的系统视图v$开头,MySQL的performance_schema等。虽然数据库的一些信息不是存在日志中而是在数据库里面,但是也可以作为数据库日志的一部分进行管理和监控,已便我们及时知道数据库的监控状况,从而预防可能出现的问题。
4设备日志
设备日志一般是一个比较容易忽略的地方,但设备日志往往可以反映设备的运行情况。交换机故障,防火墙故障等设备故障都可能引起大面积的系统和服务故障。所以设备日志一定要收集,分析和监控预警。常用的设备日志有交换机日志、防火墙日志、网络安全设备日志等。
在CMDB中梳理的IT基础设施的基础上,对日志进行分类收集、管理、分析和监控,配着监控管理模块的系统,就已经可以达到多方位监控IT系统,保障IT系统的安全稳定。
DB
由于数据和数据库的重要性,在基础数据中,数据库作为单独的模块存在,根据环境划分为:生产数据库、测试数据库、开发数据库。严格区分三种环境的数据库,避免测试数据到生产环境,生产数据到测试环境等。另外数据库中数据也为业务监控提供数据依据。通过查询数据库中的数据,依据业务逻辑进行判断是否有错误或是遗漏的数据。
知识库
知识库在整个运维管理中是一个辅助功能,主要为运维提供事件管理、问题管理。很多朋友可能会疑惑为什么把事件库和问题库放在知识库这里,这些不是应该在CMDB中吗?这里稍微解释一下,其实本人也并不太清楚这种办法是否可行。在CMDB模块中更多是偏向IT资产管理,为以后的运维 *** 作提供运维范围和运维目标。而事件(主要指运维过程中遇到的所有的运维事件)和问题(需要进行变更发布才能解决的事件升级)更多是在IT资产之上,是解决IT资产的过程中遇到的事件和问题。如果把CMDB作为IT运维的基础管理对象和范围目标的话,事件和问题应该单独出来。也许在后面的运维管理中,逐渐强化CMDB的功能,会把事件库和问题库回归到CMDB模块中。
知识库中还包含经典案例库,主要是解决一些常遇故障、经典问题的解决方法的整理和归档。
解决方案库只要是一些常用的或是探索中的解决方案,例如:Nginx+Tomcat+Redis部署方案,FastDFS分布式文件服务器方案等。
文档库主要用来存储运维管理过程中执行的运维标准和规范以及运维的流程规范,常用的一些规范举例:
文档库也包括一些企业或是部门的规章制度,与供应商的合同条文等。主要是涉及到IT系统文档的一个存放和查阅的地方。
运维标准和运维流程的文档一定是必不可少的。因为运维自动化的前提就是运维的标准化和流程化。如果没有明确的标准和规范的流程,运维自动化就只能一直停留在测试环境的假想空间中。
总结
基础数据在整个运维管理中起到基础、奠基的重要作用,也是做运维管理平台的第一步和以后每一步的重要依据。一定要舍得投入时间、人力等来建立起完整、准确、实时的基础数据。打好地基,以后运维的每一步都将有条不紊地循序渐进,终将建设成属于运维的高楼大厦。
以上就是关于怎样发现内存泄露全部的内容,包括:怎样发现内存泄露、C语言编程技术的优势和劣势、新建一个JAVA线程,占用的是JAVA堆内存还是 *** 作系统的内存等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)