java企业网站_企业实时Java

java企业网站

当人们听到实时计算时,他们常常会误以为它们必须是快速系统,并且几乎总是用于控制机械系统。 的确,在大多数情况下,所需的响应时间很快,但是速度并不是定义实时系统的因素。 实时环境的真正核心是,系统将保证在预定时间内执行某些任务,从而使系统的行为变得完全确定。

对于企业级应用程序,在实时系统上进行部署有哪些优点(可能还有缺点)? 在许多情况下,没有很大的优势。 一旦满足了系统的非功能性要求(负载容量,平均响应时间,峰值负载响应时间等),就可以部署应用程序并满足客户的要求。 如果发生某种情况,例如,请求HR应用程序花费的时间比平时更长,则用户只需等待更长的时间即可; 没有可衡量的影响。 但是,对于许多财务而言,企业级应用程序在给定时间内未执行某项操作很容易等同于成本,可能是非常大的成本。 就其定义而言,金融市场非常动荡,计算机交易系统意味着价格可以每秒变化多次。 如果系统的一部分决定根据当前价格进行交易,而实际交易由于任何原因而延迟,则即使很小的变化也可能导致大量资金损失。 如果这种延迟频繁发生,那么系统很快就会失去优势,而更多地成为责任。

实践证明,Java,语言和Java Enterprise Edition平台在企业应用程序开发中非常受欢迎。 易于开发,性能和可靠性使Java对开发人员极为有吸引力。 但是,Java平台不支持实时应用程序,即使在实时操作系统上运行Java应用程序也不能使应用程序具有确定性。 Java应用程序确定性行为的最大障碍是Java虚拟机(JVM)处理内存管理的方式。 与C和C ++等早期语言不同,Java使用垃圾回收器来回收不再由应用程序使用的内存。 这样做的原因是为了消除“内存泄漏”,在这种情况下,开发人员会忘记显式释放不再使用的内存。 由于机器中的内存量是有限的,因此如果在某种循环中发生此错误,最终系统将耗尽内存。 (这并不是说您可以完全消除Java中的内存泄漏;如果开发人员维护对对象的引用,则垃圾收集器仍将无法回收内存)。

垃圾收集器使用后台线程来监视存储对象的堆空间。 垃圾收集器识别不再引用的对象并回收未使用的内存。 这项工作大部分涉及将对象从一个地址复制到堆中的另一个地址。 为了防止数据损坏,在发生这种情况时必须暂停所有应用程序线程(称为mutator线程)。 在现代JVM上,对于经过良好调整的桌面应用程序,这些暂停不会很明显。 即使对于大多数企业应用程序,并发标记清除收集器(也称为低暂停收集器)的使用也会将暂停减少到大多数应用程序可接受的水平。 但是,对于某些类的企业应用程序(如前面所述的那些),不确定的行为以及Java是不合适的。

为了解决此问题,创建了Java规范请求(JSR)以设计和实现Java的实时规范(RTSJ)。 实际上,这是1998年Java社区流程下创建的第一个JSR。该专家组在创建规范时有几个指导原则。 在考虑对企业应用程序的适用性时,应注意以下三个原则:

  1. 向后兼容,因此由Java兼容编译器生成的任何类文件都可以在RTSJ虚拟机上运行。
  2. 没有语法扩展。 不会对Java语言进行新的关键字或语法更改。 这部分是第一点的结果,但对于使Java开发人员能够轻松迁移到RTSJ并使用现有的开发工具(例如NetBeans)也是必不可少的。
  3. 可预测的执行。 在做出设计决策时,这将是第一要务。 这样的影响是有时可能会降低典型的计算性能。 这是对于一般企业应用应仔细考虑RTSJ系统的原因之一。

RTSJ规范描述了Java扩展语义的八个领域:

  1. 排程
  2. 内存管理
  3. 同步化
  4. 异步事件处理
  5. 异步控制权转移
  6. 异步线程终止
  7. 物理内存访问
  8. 例外情况

RTSJ中的线程可以是三种类型之一,即非实时,软实时和硬实时。 非实时线程在某种程度上很明显,因为它没有规定必须完成某些操作的截止日期。 JVM可以在方便的时候对它进行调度,并且垃圾回收器的任何影响都不重要。 软实时线程确实有完成动作的最后期限。 但是,还有一定的回旋余地,因此,如果该操作应该在应该完成之后不久完成,则所有操作仍将继续,而不会出现任何问题。 对于硬实时线程,它们绝对必须在截止日期之前完成操作; 如果不是,则发生不可恢复的错误。 RTSJ应用程序可以同时运行所有三种类型的线程。 使用哪种类型的线程的选择取决于应用程序的设计人员以及线程工作的重要性。 下图显示了这些类型的线程之间的关系:

java企业网站_企业实时Java

图1. RTJS中的线程

通常,线程将需要交换数据才能使应用程序正常工作。 由于硬实时线程不能依靠非实时线程来传递结果,因此实时无等待数据传输队列用于确保硬实时线程不会被其他线程阻塞。

要创建新的非实时线程,可以不更改现有Thread类的使用。 对于实时软线程,使用RealtimeThread类,它是Thread的子类。 此类的构造函数具有可选的优先级和释放参数,以定义JVM应该如何调度线程。 对于硬实时线程,使用NoHeapRealtimeThread类,它是RealtimeThread的子类。 用于硬实时线程的类的名称可能会为您提供有关JVM如何实现的线索。 我们将在进行内存管理时讨论更多。

将现有应用程序转换为实时应用程序的最简单方法是,简单地将所有启动新线程的位置更改为使用RealtimeThread类。 这只会使该应用程序成为一个软实时应用程序,但显示出它可以多么容易。

标准的Java Thread类包含优先级的概念,因此,较重要的线程可以优先于优先级较低的线程。 在RTSJ中,这一点得到了进一步扩展,并且规范指出必须至少支持28个不同的优先级。 由于优先级表示为整数,因此实现可以提供更多功能。 该规范还指出,优先级较高的线程将始终优先于优先级较低的线程运行,如果优先级较高的线程变为可运行线程,它将抢占当前正在运行的线程。 表示此信息的类如图2所示:

java企业网站_企业实时Java

图2.线程执行优先级

PriorityParameters类封装线程优先级的整数值。 如果存在多个具有相同优先级的线程,则可以将重要性与该线程相关联,以指示应优先考虑哪个线程。

实时系统的关键概念之一是,应该可以预先确定系统是否可以满足应用程序的要求。 为此,通过速率单调分析,系统必须了解有关任务的详细信息。 这些是通过发布参数提供给RTSJ的。 类层次结构如图3所示:

java企业网站_企业实时Java

图3.释放参数

ReleaseParameters类包含时间方面的线程成本(特定于平台,如果应用程序移至其他平台,则可能更改),必须完成此任务的截止日期以及成本超支和处理程序的处理程序。错过了最后期限。 将要处理的任务类型可以是周期性的(在这种情况下,它们以给定的速率重复发生),也可以是非周期性的,在这种情况下,它们可以随时发生。 如果硬实时系统包含非周期性任务,则无法分析其正确性,因此包含了零星任务的概念。 这样就将非周期性任务视为周期性任务,从而使其具有最小频率,从而可以分析系统。 使非定期任务零星化对应用程序的运行方式没有影响,它仅使系统能够确定它是否可以满足实时要求。

RTSJ还必须实现所谓的优先级反转避免。 图4说明了该问题:

java企业网站_企业实时Java

图4.优先级倒置

根据规范的要求,低优先级线程(优先级为P3)获取对象上的锁,并被较高优先级线程(优先级为P1)抢占。 然后,P1线程需要相同的对象,但是只有在P3线程释放它之后才能获取该锁。 较低优先级(P2)的其他任务会阻止P3线程运行和释放锁。 最终结果是,P2优先级线程优先于P1线程运行,这不是规范所要求的。 有两种方法可以避免这种情况。 首先是优先级继承。 系统检测到P3线程持有P1线程所需的锁,并将其优先级提高到P1,直到释放该锁为止。 开发人员无需更改代码即可使用。 第二种方法是优先级上限仿真。 在这里,开发人员必须意识到持有锁的线程需要提高其优先级,并且必须在代码中进行显式调用才能做到这一点。 在RTSJ中,此方法是可选的。

对于内存管理,RTSJ使用内存区域的概念。 此类的类结构如图5所示。

java企业网站_企业实时Java

图5.实时存储区

由于垃圾回收会导致不确定的暂停,因此所有硬实时线程都必须使用不受垃圾回收约束的内存。 有两种方法可以执行此操作:作用域内存和不朽内存。

范围内存是具有由应用程序开发人员定义的生存期的内存。 开发人员将创建一个特定大小的作用域内存区域,实例化对象时,将从该区域分配它们的空间。 范围内存有两种类型,线性内存和变量内存,它们是实例化对象所需的时间。 LTMemory类表示一个内存区域,其中实例化对象的时间是固定分配时间和可变初始化时间的组合。 由于初始化时间与对象的大小成正比,因此该时间是线性的,而不是恒定的。 VTMemory类表示分配机制可以使用任何算法的内存区域,因此可以随时间变化。 一旦不再引用作用域存储器中的所有对象,则释放该存储器以供再次使用。 使用范围内存的一种情况是创建一个范围内存区域,并将其提供给NoHeapRealTimeThread使用。 线程执行完成后,将不再引用所有对象,并且可以释放该区域。

顾名思义,永生记忆永远不会以任何方式收集。 永久内存由所有线程共享,并且仅应用于开发人员知道的对象,直到JVM终止为止。

RTSJ规范还允许开发人员执行标准Java中不可能完成的事情:直接访问物理内存。 由于这主要适用于嵌入式实时应用程序,而不适用于企业应用程序,因此我们将不在本文中进一步讨论。

如您所见,RTSJ提供了一系列功能,允许企业应用程序作为非实时,软实时和硬实时线程的组合运行。 对于时间就是金钱的金融应用程序,可以对关键部分进行编码以使其作为硬实时线程运行,并避免垃圾收集器的不确定性行为。 在RTSJ 2.0发行版中,现已提供了参考实现,该参考实现可在具有实时调度程序的免费开放源Solaris 10操作环境中运行。 (要在JVM中提供实时功能,下面的操作系统还必须支持实时概念)。

对于企业应用程序而言,显而易见的下一步是使用具有实时功能的应用程序服务器。 Sun的工程师已将GlassFish开源应用程序服务器移植到RTSJ(仅五个小时)。 IBM还具有实时WebSphere产品,因此已经取得了进展。 在评估实时Java在企业应用程序中的使用时,请记住,在这种情况下,没有什么是免费的。 您可能获得有保证的响应时间,但这将以系统的整体吞吐量为代价。 但是,如果您的Java应用程序确实必须在一定时间内做出响应,而不管垃圾回收器做什么,那么RTSJ现在是一种可能性,而不是一种可能性。

链接

http://rtsj.dev.java.net
http://www.rtsj.org/
http://java.sun.com/javase/technologies/realtime/
http://www-306.ibm.com/software/webservers/realtime/

关于作者

Simon Ritter专门研究新兴技术,包括网格计算,RFID,无线传感器网络,机器人技术和可穿戴计算。 Simon自1984年以来一直从事IT业务,并拥有英国布鲁内尔大学的物理学学士学位。Simon最初在AT&T UNIX系统实验室的UNIX开发领域工作,然后在Novell任职,Simon于1996年加入Sun并开始与Java合作。技术; 他花了很多时间进行Java开发和咨询。

翻译自: https://www.infoq.com/articles/real-time-java/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

java企业网站