内存溢出:你申请了10个字节的内存,但写入了大于10个字节的数据会致使内存溢出html
内存溢出缘由:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,产生了堆积,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的太小
内存溢出的解决方案:
第一步,修改JVM启动参数,直接增长内存。(-Xms,-Xmx参数必定不要忘记加。)python
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。git
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。github
参考地址:https://blog.csdn.net/qq_43004728/article/details/84869354数据库
内存管理函数
包括:操作系统
python中, 变量在第一次被赋值时自动声明, 和其它语言同样, 变量只有被建立和赋值后才能被使用.net
变量名无须事先声明, 也无须类型声明
对象的类型和内存占用都是运行时肯定的设计
python解释器会自动进行内存管理, 不用开发人员去关心日志
当对象的引用被销毁时, 引用计数会减小, 明显的例子就是当引用离开其做用范围时, 这种状况最常常出如今函数运行结束时, 全部局部变量都被自动销毁, 对象的引用计数也就减小
再也不被使用的内存会被一种称为垃圾收集的机制释放
注: 解释器跟踪对象的引用计数, 垃圾回收机制负责释放内存, 垃圾收集器是一块独立代码, 它用来寻找引用计数为0的对象, 它也负责检查虽然引用计数大于0可是也应该被销毁的对象
引用语义
: python中在变量里保存值(对象)的引用, 采用这种方式, 变量所需的存储空间大小一致, 由于其只须要保存一个引用值语义
变量的值直接保存在变量的存储区里, 这样一个整数类型的变量就须要保存一个整数所需的空间, 一个浮点数变量就须要足够的空间存储一个浮点数. C中就是值语义参考地址:https://www.cnblogs.com/qlshine/p/5986132.html
内存管理机制:引用计数、垃圾回收、内存池。
1、引用计数:
引用计数是一种很是高效的内存管理手段, 当一个 Python 对象被引用时其引用计数增长 1, 当其再也不被一个变量引用时则计数减 1. 当引用计数等于 0 时对象被删除。
2、垃圾回收 :
1. 引用计数
引用计数也是一种垃圾收集机制,并且也是一种最直观,最简单的垃圾收集技术。当 Python 的某个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。好比某个新建对象,它被分配给某个引用,对象的引用计数变为 1。若是引用被删除,对象的引用计数为 0,那么该对象就能够被垃圾回收。不过若是出现循环引用的话,引用计数机制就再也不起有效的做用了
2. 标记清除
若是两个对象的引用计数都为 1,可是仅仅存在他们之间的循环引用,那么这两个对象都是须要被回收的,也就是说,它们的引用计数虽然表现为非 0,但实际上有效的引用计数为 0。因此先将循环引用摘掉,就会得出这两个对象的有效计数。
3. 分代回收
从前面“标记-清除”这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操做实际上与系统中总的内存块的数量是相关的,当须要回收的内存块越多时,垃圾检测带来的额外操做就越多,而垃圾回收带来的额外操做就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额外操做。
3、内存池:
1. Python 的内存机制呈现金字塔形状, -1, -2 层主要有操做系统进行操做;
2. 第 0 层是 C 中的 malloc, free 等内存分配和释放函数进行操做;
3. 第 1 层和第 2 层是内存池,有 Python 的接口函数 PyMem_Malloc 函数实现,当对象小于256K 时有该层直接分配内存;
4. 第 3 层是最上层,也就是咱们对 Python 对象的直接操做;Python 在运行期间会大量地执行 malloc 和 free 的操做,频繁地在用户态和核心态之间进行切换,这将严重影响 Python 的执行效率。为了加速 Python 的执行效率, Python 引入了一个内存池机制,用于管理对小块内存的申请和释放。Python 内部默认的小块内存与大块内存的分界点定在 256 个字节,当申请的内存小于 256 字节时, PyObject_Malloc 会在内存池中申请内存;当申请的内存大于 256 字节时, PyObject_Malloc 的行为将蜕化为 malloc 的行为。固然,经过修改 Python 源代码,咱们能够改变这个默认值,从而改变 Python 的默认内存管理行为。
4、调优手段
1.手动垃圾回收
2.调高垃圾回收阈值
3.避免循环引用
参考地址:https://blog.csdn.net/u011692780/article/details/81427527
什么是内存泄漏?
内存泄露指因为疏忽或错误形成程序未能释放已经再也不使用内存的状况。内存泄露并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,于是形成了内存的浪费,致使运行速度缓慢甚至系统崩溃等严重后果。
那应该如何避免呢?
有_del_()函数的对象间的循环引用是致使内存泄露的主凶。
参考地址:https://blog.csdn.net/qq_43192617/article/details/87468242