java对象池提高性能_避免内存抖动的方法:使用java对象池

更新时间:2023-05-15 17:28:40 阅读: 评论:0

java对象池提⾼性能_避免内存抖动的⽅法:使⽤java对象池将⽤过的对象保存起来,等下⼀次需要这种对象的时候,再拿出来重复使⽤,从⽽在⼀定程度上减少频繁创建对象所造成的开销。 并⾮所有对象都适合拿来池化――因为维护对象池也要造成⼀定开销。对⽣成时开销不⼤的对象进⾏池化,反⽽可能会出现“维护对象池的开销”⼤于“⽣成新对象的开销”,从⽽使性能降低的情况。但是对于⽣成时开销可观的对象,池化技术就是提⾼性能的有效策略了。下⾯是构建对象池的⼀个例⼦:
public class ObjectPool {
大嘴巴英语怎么样
private int numObjects = 10; // 对象池的⼤⼩
private int maxObjects = 50; // 对象池最⼤的⼤⼩
private Vector objects = null; //存放对象池中对象的向量( PooledObject类型)
public ObjectPool() {
}
/*** 创建⼀个对象池***/
public synchronized void createPool(){
// 确保对象池没有创建。如果创建了,保存对象的向量 objects 不会为空
if (objects != null) {
return; // 如果⼰经创建,则返回
}
// 创建保存对象的向量 , 初始时有 0 个元素
objects = new Vector();
// 根据 numObjects 中设置的值,循环创建指定数⽬的对象
for (int x = 0; x < numObjects; x++) {
if ((objects.size() == 0)&&this.objects.size()
Object obj = new Obj();
objects.addElement(new PooledObject(obj));
}
}
}
public synchronized Object getObject(){
// 确保对象池⼰被创建
if (objects == null) {
return null; // 对象池还没创建,则返回 null
}
Object conn = getFreeObject(); // 获得⼀个可⽤的对象
// 如果⽬前没有可以使⽤的对象,即所有的对象都在使⽤中
while (conn == null) {
wait(250);
conn = getFreeObject(); // 重新再试,直到获得可⽤的对象,如果
// getFreeObject() 返回的为 null,则表明创建⼀批对象后也不可获得可⽤对象
}
return conn;// 返回获得的可⽤的对象
}
/**
* 本函数从对象池对象 objects 中返回⼀个可⽤的的对象,如果
* 当前没有可⽤的对象,则创建⼏个对象,并放⼊对象池中。
* 如果创建后,所有的对象都在使⽤中,则返回 null
*/
private Object getFreeObject(){
// 从对象池中获得⼀个可⽤的对象
Object obj = findFreeObject();
if (obj == null) {
createObjects(incrementalObjects); //如果⽬前对象池中没有可⽤的对象,创建⼀些对象// 重新从池中查找是否有可⽤对象
obj = findFreeObject();
// 如果创建对象后仍获得不到可⽤的对象,则返回 null
英语单词词根if (obj == null) {
return null;
}
}
bjc
return obj;
}
/**
* 查找对象池中所有的对象,查找⼀个可⽤的对象,
* 如果没有可⽤的对象,返回 null
*/
private Object findFreeObject(){hehehei
Object obj = null;
PooledObject pObj = null;
// 获得对象池向量中所有的对象
Enumeration enumerate = objects.elements();
/
/ 遍历所有的对象,看是否有可⽤的对象
while (enumerate.hasMoreElements()) {
pObj = (PooledObject) Element();
// 如果此对象不忙,则获得它的对象并把它设为忙
if (!pObj.isBusy()) {
obj = Object();
pObj.tBusy(true);
}
return obj;// 返回找到到的可⽤对象
}
/**
* 此函数返回⼀个对象到对象池中,并把此对象置为空闲。* 所有使⽤对象池获得的对象均应在不使⽤此对象时返回它。*/
public void returnObject(Object obj) {
// 确保对象池存在,如果对象没有创建(不存在),直接返回if (objects == null) {
return;
}
PooledObject pObj = null;
Enumeration enumerate = objects.elements();
// 遍历对象池中的所有对象,找到这个要返回的对象对象while (enumerate.hasMoreElements()) {
pObj = (PooledObject) Element();
// 先找到对象池中的要返回的对象对象
if (obj == Object()) {
// 找到了 , 设置此对象为空闲状态
pObj.tBusy(fal);
break;
}
}
}
/**
* 关闭对象池中所有的对象,并清空对象池。
黄静怡
*/
public synchronized void cloObjectPool() {
// 确保对象池存在,如果不存在,返回
if (objects == null) {
return;
}
PooledObject pObj = null;
Enumeration enumerate = objects.elements();
while (enumerate.hasMoreElements()) {
pObj = (PooledObject) Element();
// 如果忙,等 5 秒
if (pObj.isBusy()) {
wait(5000); // 等 5 秒
}
/
/ 从对象池向量中删除它
}
// 置对象池为空
objects = null;
}
/**
prep* 使程序等待给定的毫秒数
*/
private void wait(int mSeconds) {
try {
Thread.sleep(mSeconds);
}
英语口语900句
catch (InterruptedException e) {
}
}
/**
* 内部使⽤的⽤于保存对象池中对象的类。
* 此类中有两个成员,⼀个是对象,另⼀个是指⽰此对象是否正在使⽤的标志 。*/
class PooledObject {
Object objection = null;// 对象
boolean busy = fal; // 此对象是否正在使⽤的标志,默认没有正在使⽤// 构造函数,根据⼀个 Object 构告⼀个 PooledObject 对象
public PooledObject(Object objection) {
this.objection = objection;
}
// 返回此对象中的对象
public Object getObject() {
return objection;
}
// 设置此对象的,对象
public void tObject(Object objection) {
this.objection = objection;
}
/
/ 获得对象对象是否忙
public boolean isBusy() {
由来已久return busy;
}
// 设置对象的对象正在忙
public void tBusy(boolean busy) {
this.busy = busy;
davidbeckham}
}
}
初中英语教学计划测试类:
代码如下:
public class ObjectPoolTest {
public static void main(String[] args) throws Exception {
ObjectPool objPool = new ObjectPool();
Object obj = Object();
returnObject(obj);
objPool.cloObjectPool();

本文发布于:2023-05-15 17:28:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/109599.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   创建   获得   向量   性能   返回
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图