转载http://pengjiaheng.iteye.com/blog/558619(若是侵权,联系删除)html
所谓“成也萧何败萧何”。Java的垃圾回收确实带来了不少好处,为开发带来了便利。可是在一些高性能、高并发的状况下,垃圾回收确成为了制约Java应用的瓶颈。目前JDK的垃圾回收算法,始终没法解决垃圾回收时的暂停问题,由于这个暂停严重影响了程序的相应时间,形成拥塞或堆积。这也是后续JDK增长G1算法的一个重要缘由。java
固然,上面是从技术角度出发解决垃圾回收带来的问题,可是从系统设计方面咱们就须要问一下了:web
咱们须要分配如此大的内存空间给应用吗?算法
咱们是否可以经过有效使用内存而不是经过扩大内存的方式来设计咱们的系统呢? 数据库
内存中须要放什么呢?我的认为,内存中须要放的是你的应用须要在不久的未来再次用到到的东西。想一想看,若是你在未来不用这些东西,何须放内存呢?放文件、数据库不是更好?这些东西通常包括:编程
1. 系统运行时业务相关的数据。好比web应用中的session、即时消息的session等。这些数据通常在一个用户访问周期或者一个使用过程当中都须要存在。缓存
2. 缓存。缓存就比较多了,你所要快速访问的均可以放这里面。其实上面的业务数据也能够理解为一种缓存。session
3. 线程。并发
所以,咱们是否是能够这么认为,若是咱们不把业务数据和缓存放在JVM中,或者把他们独立出来,那么Java应用使用时所需的内存将会大大减小,同时垃圾回收时间也会相应减小。框架
我认为这是可能的。
数据库、文件系统
把全部数据都放入数据库或者文件系统,这是一种最为简单的方式。在这种方式下,Java应用的内存基本上等于处理一次峰值并发请求所需的内存。数据的获取都在每次请求时从数据库和文件系统中获取。也能够理解为,一次业务访问之后,全部对象均可以进行回收了。
这是一种内存使用最有效的方式,可是从应用角度来讲,这种方式很低效。
内存-硬盘映射
上面的问题是由于咱们使用了文件系统带来了低效。可是若是咱们不是读写硬盘,而是写内存的话效率将会提升不少。
数据库和文件系统都是实实在在进行了持久化,可是当咱们并不须要这样持久化的时候,咱们能够作一些变通——把内存当硬盘使。
内存-硬盘映射很好很强大,既用了缓存又对Java应用的内存使用又没有影响。Java应用仍是Java应用,他只知道读写的仍是文件,可是其实是内存。
这种方式兼得的Java应用与缓存两方面的好处。memcached的普遍使用也正是这一类的表明。
同一机器部署多个JVM
这也是一种很好的方式,能够分为纵拆和横拆。纵拆能够理解为把Java应用划分为不一样模块,各个模块使用一个独立的Java进程。而横拆则是一样功能的应用部署多个JVM。
经过部署多个JVM,能够把每一个JVM的内存控制一个垃圾回收能够忍受的范围内便可。可是这至关于进行了分布式的处理,其额外带来的复杂性也是须要评估的。另外,也有支持分布式的这种JVM能够考虑,不要要钱哦:)
程序控制的对象生命周期
这种方式是理想当中的方式,目前的虚拟机尚未,纯属假设。即:考虑由编程方式配置哪些对象在垃圾收集过程当中能够直接跳过,减小垃圾回收线程遍历标记的时间。
这种方式至关于在编程的时候告诉虚拟机某些对象你能够在*时间后在进行收集或者由代码标识能够收集了(相似C、C++),在这以前你即使去遍历他也是没有效果的,他确定是还在被引用的。
这种方式若是JVM能够实现,我的认为将是一个飞跃,Java即有了垃圾回收的优点,又有了C、C++对内存的可控性。
线程分配
Java的阻塞式的线程模型基本上能够抛弃了,目前成熟的NIO框架也比较多了。阻塞式IO带来的问题是线程数量的线性增加,而NIO则能够转换成为常数线程。所以,对于服务端的应用而言,NIO仍是惟一选择。不过,JDK7中为咱们带来的AIO是否能让人眼前一亮呢?咱们拭目以待。
其余的JDK
本文说的都是Sun的JDK,目前常见的JDK还有JRocket和IBM的JDK。其中JRocket在IO方面比Sun的高不少,不过Sun JDK6.0之后提升也很大。并且JRocket在垃圾回收方面,也具备优点,其可设置垃圾回收的最大暂停时间也是很吸引人的。不过,系统Sun的G1实现之后,在这方面会有一个质的飞跃。
· Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
· Hotspot memory management whitepaper
· Diagnosing a Garbage Collection problem
· Garbage-First Garbage Collection
· Frequently Asked Questions about Garbage Collection in the HotspotTM JavaTM Virtual Machine