实时Java,第1部分: 使用Java语言编写实时系统 - 编程入门网
编写定制的内存管理工具 —— 已经被很好地证明。然而,对于使用 Java 语言的硬 RT 编程人员来说,GC 是使他们备受挫折的另一个原因。当 Java 堆耗尽后仍然不能满足分配请求时,将自动进行垃圾收集。应用程序本身也能触发垃圾收集。
一方面,GC 对于 Java 程序员来说非常不错。在诸如 C 和 C++ 这样的语言中,由于需要明确地管理内存而引发的错误是最难诊断的一些问题。在部署应用程序时,检验是否存在这类错误同样也是一个基本难题。Java 编程模型的一个主要优点就是:由 JVM 而不是应用程序来执行内存管理,这将为应用程序编程人员去掉这一负担。 另一方面,传统的垃圾收集器可导致长时间的延迟,而应用程序编程人员几乎不可能预测出这一时间。几百毫秒的延迟并不少见。在应用程序层上解决这一问题的惟一方法就是通过创建一组重用对象来阻止 GC,从而确保不会耗尽 Java 堆的内存。换言之,编程人员放弃了使用 JVM 管理内存这一优点,而是通过亲自明确地管理内存来解决问题。实践中,这个方法通常不奏效,因为它阻止编程人员使用 JDK 和其他类供应商提供的众多类库,这可能会创建大量的临时对象从而最终将堆填满。 实时Java,第1部分: 使用Java语言编写实时系统(2)时间:2011-06-22 Mark Stoodley Mike编译 将 Java 代码编译为本地代码引发了与类加载类似的问题。大多数现代 JVM 开始先解释 Java 方法,然后仅将频繁执行的方法编译成本地代码。延迟编译促成了快速启动,并减少了应用程序运行期间执行的编译数量。但是使用解释后的代码执行任务和使用编译后的代码执行任务在时间上有巨大的差异。对于硬 RT 应用程序来说,由于无法预测何时发生编译,将导致很大程度的不确定性,从而无法有效地规划应用程序的行为。对于类加载,通过在应用程序启动阶段使用 Compiler 类以编程的方式编译方法可以减轻这一问题,但是维护这样的方法非常乏味并且容易发生错误。 Java 实时规范 RTSJ 的创建是为了解决 Java 语言的一些限制,这些限制阻止了它在 RT 执行环境中的广泛应用。RTSJ 处理了几个有问题的地方,包括调度、内存管理、线程、同步、计时、时钟和异步事件处理。 调度 RT 系统需要严格控制线程的调度方式并保证线程调度的确定性:就是说,按照给定的相同的一组条件调度线程。尽管 JCL 定义了线程优先权的概念,然而传统 JVM 并不需要执行优先权。同样,非 RT Java 实现通常使用循环抢占式调度方法,该方法根据不可预测的调度顺序进行调度。在 RTSJ 规范中,RT 线程需要真正的优先级,以及具有优先级继承支持的固定优先级抢占式调度程序。这种调度方法确保了最高优先级的活动线程总是被执行,并且它能够一直执行直到自愿释放 CPU 或者被更高优先级的线程抢占。优先级继承确保了在高优先级线程需要的资源被低优先级线程占用时,避免发生优先级反转。优先级反转在 RT 系统中是一个很严重的问题,因此我们将在 RT Linux® 中更详细地讨论它。 内存管理 虽然一些 RT 系统能够容忍由垃圾收集器引起的延迟,但是在很多情况下,延迟是不可接受的。为了支持那些不能容忍被 GC 打断的任务,RTSJ 定义了不朽(immortal)和作用域(scoped)内存区域,以补充标准的 Java 堆。如果垃圾收集器需要释放堆中的内存,则这些内存区域将允许任务使用内存而不需要中断任务。分配在不朽内存中的对象可以被所有的线程访问并且从来不会被收集。正由于它永远不会被收集,不朽内存是一个有限制的资源,必须谨慎使用。程序员可以控制作用域内存区域的创建和销毁。每个作用域内存区域按最大空间分配,并且可以用于对象分配。为了确保对象之间引用的完整性,RTSJ 定义了管理一个内存区域(堆、不朽内存、作用域内存)中的对象如 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |