java对象池
⑴ java都有哪些池技术
Java池技术
常量池
对象池
连接池
线程池
⑵ java生成对象的开销和对象池维护对象的开销哪个大
使用频率比较高的,没有属性或属性不会变化的对象适合对象池维护。
需要临时创建,并不常用的对象适合直接创建。
⑶ Java 中常量池 和 对象池是一回事儿吗
对象池就是在heap上开辟的内存,用new产生的对象都在这个区域开辟空间存储。
常量池就是String常量定义以后都会放到常量池里面
⑷ java对象池里的对象如果长时间不被使用,会被jvm垃圾回收吗
GC是有条件的,我们的确可以在一定硬件基础上配置这个条件让GC少发生,GC是耗资源性能的,
很多时候我们都是通过减少GC来提高系统的性能。
你说得对,对象池的大小不会造成内存紧张,基本上jvm是不会回收的,但是我们不能保证。
所以不要把这个放到你的业务逻辑里去,就像尽量不要把异常与业务逻辑挂钩。
如果在你的程序里,能找到这样的一条引用方向,那么这个单体类是不会被回收的。
main->实例A->...->实例D->你所说的单体
GC发生时,判断对象是否需要回收不是看是否被调用,而是是否被引用。
比如,main函数所在的类中所引用的成员变量List是不会被回收的。直到程序结束。
如果你的单体类只有一个,相信这个单体类还是一直被引用这比较好。这样就不会被回收了。
-------------------------
java对象是否被垃圾回收不是看时间长短的,
是看是否被使用着,如果没有被使用,又到了垃圾回收的条件时,
就会被回收的。
如果是被使用的,那么不管怎么样都不会被回收的。
如果是静态变量的话,看这个类是否被使用了。
⑸ 对象池用在哪些方面
恰 当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以有效地减少处理对象池化时的工作量,为其它重要的工作留下更多的 精力和时间。
创建新的对象并初始化的操作,可能会消耗很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于20,000千 米以外的主机上读出一些数据)的时候,尤其是这样。在需要大量生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问题,除了选用更 好的硬件和更棒的虚拟机以外,适当地采用一些能够减少对象创建次数的编码技巧,也是一种有效的对策。对象池化技术(Object Pooling)就是这方面的著名技巧,而Jakarta Commons Pool组件则是处理对象池化的得力外援。
对象池化技术
对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool)。
对 于没有状态的对象(例如String),在重复使用之前,无需进行任何处理;对于有状态的对象(例如StringBuffer),在重复使用之前,就需要 把它们恢复到等同于刚刚生成时的状态。由于条件的限制,恢复某个对象的状态的操作不可能实现了的话,就得把这个对象抛弃,改用新创建的实例了。
并非所有对象都适合拿来池化??因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。
说明:英语中的Pool除了“池”之外,还有“供多方共享的资源”意思。作者十分怀疑第二种才是“Object Pool”中的Pool的实际含义,但是“对象池”的说法已经广为流传,而一时又没有足以替代的贴切译法,因此这里仍然沿用这种译名。
Jakarta Commons Pool组件
Jakarta Commons Pool是一个用于在Java程序中实现对象池化的组件。它的基本情况是:
主要作者:Morgan Delagrange、Geir Magnusson、Craig McClanahan、Rodney Waldhoff、David Weinrich和Dirk Verbeeck
⑹ java 线程池机制的原理是什么
线程池属于对象池.所有对象池都具有一个非常重要的共性,就是为了最大程度复用对象.那么线程池的最
重要的特征也就是最大程度利用线程.
首先,创建线程本身需要额外(相对于执行任务而必须的资源)的开销.
作业系统在每创建一个线程时,至少需要创建以下资源:
(1) 线程内核对象:用于对线程上下文的管理.
(2) 用户模式执行栈.
(3) 内核模式执行栈.
这些资源被线程占有后作业系统和用户都无法使用.
相反的过程,销毁线程需要回收资源,也需要一定开销.
其次,过多的线程将导致过度的切换.线程切换带来的性能更是不可估量.系统完成线程切换要经过以下过程:
(1) 从用户模式切换到内核模式.
(2) 将CPU寄存器的值保存到当前线程的内核对象中.
(3)打开一个自旋锁,根据调度策略决定下一个要执行的线程.释放自旋锁,如果要执行的线程不是同一进
程中的线程,还需要切换虚拟内存等进程环境.
(4) 将要执行的线程的内核对象的值写到CPU寄存器中.
(5) 切换到用户模式执行新线程的执行逻辑.
所以线程池的目的就是为了减少创建和切换线程的额外开销,利用已经的线程多次循环执行多个任务从而提
高系统的处理能力.
⑺ 如何创建一个可以生成多种数据类型的的JAVA对象池,我自己看到的都是只能返回固定的对象。
创建一个工厂设计模式就可以达到你想要的
⑻ java中对象池的在什么时候应用比较合适
一段程序由两个线程实现:
线程A负责接收数据报并将其储存在一个byte数组中,数据长度不超过4K并且大多数时间远小于4K,然后数据被加入一个队列;
线程B依次处理数据(处理完毕后byte数组就不需要了)
⑼ java资源池指什么呢,如何理解
常见的资源池有:数据库连接池,web容器中的request,response对象池,web容器中的线程池。
拿数据库连接池为例。就是将数据库连接资源的创建、使用与销毁交由数据库连接池去管理。
创建:由于创建数据库连接比较耗时间,所以由数据库连接池管理器事先创建好一定数量的连接。以便有请求需要连接资源时可以及时使用。
使用管理:当有请求需要资源时,向资源池拿资源,如果有资源则给予请求使用,如果没有资源则需要看最大连接数。请求使用完连接资源时再将资源释放给连接池以待下一个请求使用。
销毁:当连接池资源过剩,空闲数达到了最小空闲数时,则会销毁一些资源,以防资源浪费
⑽ java中九个对象池的对象都存放在方法区吗
不是的,基本类型的包装类是存储在堆内的,其实String类也是一样,值存储在哪里取决于怎么声明String对象,new String()就不在栈内,而是在堆内。