一、池化技术 -

简单点来说,就是提前保存大量的资源,以备不时之需。

对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系统调用,也是非常消耗CPU的,如果你的程序需要很多类似的工作线程或者需要频繁的申请释放小块内存,如果没有在这方面进行优化,那很有可能这部分代码将会成为影响你整个程序性能的瓶颈。

池化技术主要有线程池,内存池,连接池,对象池等等,

对象池就是提前创建很多对象,将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用

(1)线程池

线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:

先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。

可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题??性能!

一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。

(2)内存池

如何更好的管理在应用程序中内存的使用,同时提高内存使用的效率,这是值得每一个开发人员深思的问题。内存池(Memory

pool)提供了一种比较可行的解决方案。首先是创建内存池。这个过程的主要任务是预先分配足够大的内存,形成一个初步的“内存池”。分配内存,也就是用户请求内存时,会返回内存池中一块空闲的内存,并将其标志置为已使用,当然具体细节和方法有很多。释放内存时,不是真正地调用free或是delete的过程,而是把内存放回内存池的过程。在把内存放入内存池的同时,要把标志位置为空闲。最后在应用程序结束时,要把内存池销毁。这里主要做的工作就是把内存池中的每一块内存释放。

使用内存池的好处:

1、减少了内存碎片的产生。这个可以从创建内存池的过程中看出。我们在创建内存池时,分配的都是一块块比较整的内存块,这样可以减少内存碎片的产生。

2、提高了内存的使用效率。这个可以从分配内存和释放内存的过程中看出。每次的分配与释放并不是去调用系统提供的函数或是操作符去操作实际的内存,而是在复用内存池中的内存。

缺点:

就是很有可能会造成内存的浪费,原因也很明显,开始分配了一大块内存,不是全部都用得到的。

(3)数据库连接池

连接池比较典型的有oracle的连接池。

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。

一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的

性能低下。

数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。

连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

图例:

java构建内存池队列_池化技术(线程池、连接池、内存池等)相关推荐

  1. java构建内存池队列_内存池完整实现代码及一些思考

    为了提高效率和有效的监控内存的实时状态,我们采取了内存池的思想来解决效率与对内存实现监控的问题. 网上查找到了一些方案,根据自己的理解实现了应用. 我们什么时候要调用到内存池, 1,当我们频繁的申请释 ...

  2. c++ socket线程池原理_一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题...

    编辑:业余草来源:https://www.xttblog.com/?p=4946 一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题. ThreadLocal 相信不 ...

  3. hystrix 源码 线程池隔离_基于hystrix的线程池隔离

    hystrix进行资源隔离,其实是提供了一个抽象,叫做command,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内 对这个依赖服务的所有调用请求,全部走这个资源池内的资源 ...

  4. python是如何实现进程池和线程池的_高并发:线程、线程锁与线程池(精华),手写代码实现线程池...

    前文: 单线程--多线程的开启--线程锁--线程同步工具--手写连接池--连接池工具类. 一.线程 1.线程的概念 2.线程与进程的关系 3.定义: 区别:如上!!! 4.wait()和sleep() ...

  5. 操作系统内存分配算法_操作系统基础45-伙伴系统和slab内存分配

    当在用户模式下运行进程请求额外内存时,从内核维护的空闲页帧列表上分配页面.这个列表通常使用页面置换算法来填充,如前所述,它很可能包含散布在物理内存中的空闲页面.也要记住,如果用户进程请求单个字节内存, ...

  6. 开两个服务内存溢出_应用服务OkHttpClient创建大量对外连接时内存溢出

    1 背景 最近工作中碰到一个生产问题,就是应用服务在使用 OkHttpClient 时,在创建大量对外连接时线程堆积导致内存溢出. 主要表现是在流量极低的情况下,即平均 qps 在 1-4 左右的情况 ...

  7. java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区

    先来张简单的图: 1.jpg ------------------分割------------------------ 栈内存: 1.操作比较快速.但是为私有. 2.线程之间不共享.所以存放一些基本数 ...

  8. java 构建是什么意思_构建的概念

    [Maven 简介] Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理.Maven 这个单词的本意是:专家,内行. Make-> ...

  9. java怎么遍历优先级队列_打印优先级队列的内容[java]

    如何使print_queue在Java中正常工作?这是我自己的队列实现. 使用Iterator()可以正常工作,除了它会以随机顺序打印数字. package data_structures_java ...

最新文章

  1. Java RESTful Web Service实战
  2. stm32f103c8t6掉坑记
  3. Flutter:使用 CustomClipper 绘制 N 角星
  4. 第85讲:Scala中For表达式的强大表现力实战
  5. android removeRule的使用
  6. javascript内存泄漏调试工具mac_node.js 内存泄漏的秘密
  7. C/C++ atof函数 - C语言零基础入门教程
  8. 关于Java成员变量、局部变量、方法,在JVM的内存空间分配
  9. IDEA运行VUE npm install报错:chromedriver@2.27.2 install: node install.js
  10. mysql 复制表结构和表数据
  11. 程序员谨防加班猝死之十大建议(转)
  12. 精益质量管理之做好质量管理工作的三大管理手法
  13. 实对称矩阵特征值按大小排序
  14. 视觉SLAM十四讲 安装OpenCV
  15. 目录-换热器工艺设计
  16. 数据恢复技巧:U盘文件被隐藏怎么恢复?
  17. 关于投票活动主办方对于微信上投票怎样刷票及微信投票怎样查刷票
  18. 筛选出计算机或英语不及格的记录,浅谈EXCEL“高级筛选”中条件的书写
  19. java中config是什么意思_在计算机的命令中Config是什么意思啊?
  20. 设计师:室内设计师的简介、工作内容、工作要求、设计常识(硬装/软装/榻榻米/马卡龙/地台/公共空间/玄关/闭水实验、家具知识(欧式雕花家具-欧式雕花家具)、室内设计常用尺寸之详细攻略

热门文章

  1. 什么是PCM综合语音复用设备?
  2. 【渝粤教育】国家开放大学2018年春季 0175-21T社会调查研究与方法 参考试题
  3. android 网络调试工具,安卓网络调试助手
  4. ubuntu按方向键出现abcd_Ubuntu Vi方向键[A [B [C [D问题解决
  5. 7 Statistical estimation
  6. 投资最重要的事读后感_《投资最重要的事》读书笔记分享
  7. console.log()不显示结果_RNA结合蛋白与RNA的缠绵故事,教你不做实验发文章
  8. Java常用类(1)--字符串相关类String、StringBuffer、StringBuilder全面知识
  9. 如何查看电脑显卡配置_3080显卡电脑配置清单(3700X/10700)
  10. hadoop关联文件处理