前言
GenericObjectPool 是 Apache Commons Pool 库的一部分,它提供了一个通用的对象池实现,允许用户在需要时从池中借用和返回对象,而不是每次需要一个新实例时都创建一个。这种方法可以显著提高性能,特别是对于创建开销大或需要频繁使用的对象。
哪些对象创建、销毁成本较高
创建和销毁成本较大的 对象有哪些、原因是啥:
-
数据库连接:建立数据库连接
涉及网络通讯以及数据库服务器上的资源分配和初始化。这些过程可能需要消耗显著的时间和系统资源。因此,数据库连接池(如 HikariCP、c3p0)通常用于管理这些连接,以减少每次操作所需的创建和销毁开销。 -
线程:
创建和销毁线程涉及操作系统级的资源分配,这可能是一个高代价的操作,尤其是在需要频繁创建和销毁大量线程的场景中。Java 的 ExecutorService 提供了线程池功能,可以有效地复用线程来处理多个任务。 -
网络连接:建立网络连接(如 TCP 连接)
涉及网络协议的握手过程,这可能导致显著的延迟和资源消耗。复用网络连接(例如通过HTTP 连接池)可以减少这种开销。 -
大对象或复杂对象:创建一些
内存占用大或构造过程复杂的对象也可能涉及较高的开销。例如,需要加载大量数据或执行复杂初始化逻辑的对象。 -
外部资源(如
文件或其他系统资源):操作文件或与外部系统交互(通过 API 调用等)可能涉及显著的资源开销。缓存操作结果或重用外部连接可以帮助降低这种开销。
为了管理资源创建和销毁的成本,通常采用以下策略:
对象池化(Pooling):如数据库连接池、线程池和 HTTP 客户端连接池,通过重用现有对象来减少创建和销毁的频率。缓存(Caching):缓存是另一种减少资源获取成本的策略,特别是当资源获取涉及昂贵的计算或外部系统调用时。延迟初始化(Lazy Initialization):延迟(或按需)创建资源,直到首次使用时,可以推迟资源分配的开销,并可能省略对某些永远不会使用的资源的开销。
对象创建的步骤
在Java中,创建对象时的内存分配过程主要发生在堆(Heap)内存区域。整个过程受Java虚拟机(JVM)的垃圾收集(GC)算法和内存模型的管理。这个过程可以分为以下几个步骤:
-
类加载检查
当代码尝试创建一个对象实例时(如通过new XXXClassName()),JVM首先检查这个类是否已被加载、链接和初始化。如果没有,系统会执行这些步骤。 -
为对象分配内存
一旦类检查完成,JVM会在堆内存中为新对象分配内存。分配的内存大小根据对象的类定义来确定,假如类有String name、Integer age、Boolean isGirl,包括所有实例变量的大小及其他一些开销(如对象头信息)。这部分内存用于存储对象的状态(即字段或属性的值)。内存分配方式取决于垃圾收集器的具体实现。常见的分配方式包括:
a.指针碰撞(Bump the Pointer):如果堆内存是整齐划分的(使用的垃圾收集算法如Minor GC后),那么对象的分配仅仅是将指向堆中的空闲区域的指针向上移动对象大小的距离。<

最低0.47元/天 解锁文章
935

被折叠的 条评论
为什么被折叠?



