浅述多处理器平台上J2EE应用的内存争用2012-01-14随着在企业级环境对高可扩展性J2EE应用的需求,需要在多处理器平台上执行线程的并行处理。在JVM堆中对线程处理所需要的内存和并发处理已经成为这些J2EE应用在部署时的性能和可扩展性的瓶颈。这篇文章探讨了J2EE应用在多处理器平台上访问JVM堆中的内存的线程同步问题。J2EE应用的内存需求当前布署在企业级环境中的J2EE应用都需要在一秒中能够处理成千上万的用户请求。这种来自大量并发用户的数据请求就产生了更大堆空间的需求,也就需要更多的内存。有了更多的内存就可以提供更大的J2EE应用堆空间,而多处理器可以处理更多的并发线程,因而现在线程访问内存的方式和访问所花费的时间就成了瓶颈所在。多处理器平台处理器数目的增加可以提高可扩展性,但同时需要处理更多的线程。线程在处理数据、创建Java对象及其他Java操作时都有需要耗用内存。由于多个线程在多个处理器中运行,就需要保证在系统中数据的一致性和完整性。在处理器中的线程同时读写内存,这就需要同步这些线程来防止读写错误的数据。在图1中,显示单处理器与多处理器在访问内存时的异同。在单处理器平台中,在任何给定的时间只有一个线程被执行,因此不需要同步。然而在多处理器平台,同一时间可能会有多个线程被执行,这就需要同步访问内存来保证数据的正确性,而这就会导致争用和瓶颈?

Figure 1. Single-processor versus multi-processor platforms accessing memory“线程本地堆”尝试通过为每一个线程在JVM堆中预分配一小块内存来解决这个问题。然而这种方式下内存空间对高内存需求的J2EE应用来说是不够的。