稿子分门别类:Java编程

来源:互联网 发布:优化车间管理办法 编辑:程序博客网 时间:2024/06/08 12:07

渣滓回收的悖论
所谓“成也萧何败萧何”。Java的渣滓回收确确实实带到了很多好处,为开发带回了方便。但是在一些高性能、高并发的情况下,渣滓回收确变为了钳制Java使用的瓶颈。当前JDK的渣滓回收算法,始终没法解决渣滓回收时的暂停问题,由于这个暂停严重影响了程序的呼应时间,促成堵塞或积聚。这也是后续JDK增多G一算法的一个重要原因。

当然,上头是从技术视角登程解决渣滓回收带到的问题,但是从系统设计方面我们就需要问一下子了:

我们急需分配如斯大的内存储器空间给使用吗?

我们是不是能够透过有效应用内存储器而不是经过壮大内存储器的形式来设计我们的系统呢?


我们的内存储器中都放了什么
内存储器中急需放什么呢?个人认为,内存储器中急需置的是你的使用急需在不久的未来再度用到到的货色。想想看,如其你在未来不要这些货色,何须放内存储器呢?置资料、数据库不是更好?这些货色通常包括:

1. 系统运行时业务相干的数据。例如web运用中的session、即刻讯息的session等。这些数据通常在一个用户访问周期也许一个使用过程中都亟需存在。

2. 缓存。缓存就比较多了,你所要高速访问的都可以置这边面。实则上头的业务数据也可以理解为一种缓存。

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的G一兑现之后,在这方面会有一个质的飞跃。

本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception

  • 2156 - java.lang.IndexOutOfBoundsException
  • 2157 - java.lang.IllegalStateException
  • 2158 - System.NullReferenceException
  • 2159 - PLS-00103
  • 2160 - 未将对象引用设置到对象的实例
  • 2161 - 创建的过程带有编译错误
  • 2162 - java.lang.ClassCastException: java.lang.Integer
  • 2163 - 无法启动调试
  • 2164 - System.NullReferenceException: 未将对象引用设置到对象的实例
  • 2165 - java.io.NotSerializableException
  • 2166 - java.io.UnsupportedEncodingException
  • 2167 - invalid username password
  • 2168 - ActionError
  • 2169 - 自定义异常
  • 2170 - log4j:ERROR Failed to rename
  • 2171 - java.lang.UnsupportedOperationException
  • 2172 - java.lang.ClassFormatError
  • 2173 - net.sf.hibernate.QueryException
  • 2174 - org.hibernate.PropertyAccessException
  • 2175 - ORA-12154
  • 原创粉丝点击