站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题Java实时应用程序中的内存管理

Java实时应用程序中的内存管理

摘要: 使用Java的一个主要优点就是无需担心废弃对象,即,让Java运行时负责Java对象的内存管理。
<table borderColor=#ffffff cellSpacing=1 width=180 border=0> <tr> <td borderColor=#003399 width=202 bgColor=#ffffff height=33></td></tr> <tr> <td borderColor=#003399 bgColor=#ffffcc> 相关专区</td></tr> <tr> <td borderColor=#003399 bgColor=#cccccc> <table cellSpacing=0 width=180 bgColor=#cccccc border=0> <tr> <td width="50%">·初学者专区</td> <td>·高级技术</td></tr> <tr> <td>·图像与多媒体</td> <td>·网络编程</td></tr> <tr> <td>·Java开源</td> <td>·Eclipse</td></tr> <tr> <td>·EJB开发 </td> <td>·设计模式 </td></tr></table></td></tr> <tr> <td borderColor=#003399 bgColor=#cecaa6> 精彩专题</td></tr> <tr> <td borderColor=#003399 bgColor=#bfbfff> <table cellSpacing=0 width=180 border=0> <tr> <td width="50%">·Java6新功能 </td> <td>·Borland传奇</td></tr> <tr> <td>·JBuilder05</td> <td>·EJB 3.0</td></tr> <tr> <td>·Servlet API</td> <td>·JDBC入门讲座</td></tr></table></td></tr> <tr> <td borderColor=#003399 bgColor=#dab4ef> 主题社区</td></tr> <tr> <td borderColor=#003399 bgColor=#ffdfdf> <table cellSpacing=0 width=180 border=0> <tr> <td width="50%">·Java源码</td> <td>·Java</td></tr></table></td></tr></table>
  使用Java的一个主要优点就是无需担心废弃对象,即,让Java运行时负责Java对象的内存管理。

  这是通过让Java运行时对不再使用的Java对象进行垃圾收集而实现的。

  垃圾收集是一个比较复杂的过程。通常,Java运行时会遍历堆,检查不再被其他对象引用、从而可以安全删除的对象,然而,由于垃圾收集占用CPU周期,所以它可能会影响应用程序代码的执行。即,如果在执行应用程序代码的过程中执行垃圾收集,则应用程序代码的响应时间可能延长。这会导致用户事务延迟的延长。更为糟糕的是,因为用户不知道何时会进行垃圾收集,因此延迟的延长是不可预知的。

  实时应用程序有严格的时间要求,即,它们必须在确定的、已知的延迟条件下执行应用程序代码。因此垃圾收集所引起的不可预知的延迟延长就成为一个问题。

  那么这个问题的解决方案是什么呢?一个明显的解决方案就是不要对实时应用程序使用Java。这是一个下下选。作为一种编程语言和一个开发平台,Java具有许多优点。我们应该能够解决Java中的这个问题。

  另一种解决方案是在Java中使用另一种内存管理方法来代替垃圾收集程序。RTSJ (Real-Time Specification for Java)定义了immortal memory和scoped memory的概念。不朽内存(Immortal memory)是从不进行垃圾收集的内存,只要JVM存在,它就也存在。作用域内存(Scoped memory)则是按块分配和释放的内存。即,用户显式地创建一个内存区域来存放对象,该区域中的对象将在该区域被销毁时释放。不管是不朽内存还是作用域内存,都不需要进行垃圾收集。不过,这也有一个缺点:管理内存的重担又落在了用户身上,就像C/C++应用程序一样。这个代价仍然很高。有没有更好的方法呢?

  我们来重新考虑一下垃圾收集。垃圾收集的主要问题是它所引起的不可预知的延迟峰值。能否避免这种不可预知的行为呢?或者,能否限制(即约束)这种不可预知的行为呢?通过更频繁地执行垃圾收集,我们就可以限制最大延迟时间。这就是WLRT所采用的方法。因此,垃圾收集成为一项可预知的任务,具有已知的代价,从而使实时开发人员可以根据需要进行考虑和建模。而且,更为重要的是,我们没有牺牲Java的易用性。

  注:应该注意的是,虽然有垃圾收集和其他的内存管理技术,Java程序仍然可能存在内存泄漏。例如,在下述情况下:在不需要组件对象时,却没有将其从容器中移除。

↑返回目录
前一篇: 精通J2EE应用程序开发之交叉分析J2EE
后一篇: Spring JDBC抽象框架简化Web数据库开发