在本文中,作者会解释让 C++OBOL 与其他语言进行交互所产生的性能影响,并给出一些提示来避免被动受制于不利影响。
几十年前,当我初次开始使用大型机 COBOL 时,我发现它不能与非 COBOL 语言交互。我与一位教授探讨将这作为一个论文题目,主要探讨让 COBOL 与非 COBOL 语言进行交互所产生的性能影响。
为了弄明白可能会有什么性能影响,我基于 “A ">Fortran Interface to the CODASYL database task group specifications”(参阅 参考资料)试验开发了小型 COBOL/Fortran 接口。Fortran 是当时非常流行的一门语言。
我注意到,一些 COBOL 数据类型在 Fortran 中没有等效的数据类型。不再需要的数据或对象仍然在磁盘上。我看到,当分配的内存超过所需内存时,就会出现堆栈溢出的迹象。我使用正确的 Fortran/COBOL 数据类型解决了这些问题。我在需要时调用子程序,并在不需要时释放它们,以这种方式规避内存限制。当时处理器的容量上限很低,无法与我们今天看到的大容量处理器相比。
在本文中,我会给出一些提示,教您如何避免在 COBOL 与 Java、C/C++、DB2 和 Oracle 进行交互时被动受制于其性能影响。
避免超时 使用编译脚本
遵循数据转换规则 预防
内存泄漏 删除本地引用
接口性能影响:Java 与 C/C++
在我第一次使用 Fortran 时,它已广泛流行于计算界。如今,Java® 是继 C/C++ 之后最流行的语言,可作为与 COBOL 交互的接口。Fortran 目前深受科学家喜爱,但在普通人群中的17891.html">流行度则有所下降。
使用 Java 作为接口
您可以让一个 COBOL 程序调用一个 Java 程序,而后者会调用一个不同的 COBOL 程序。如果在设计 Java 程序时不够谨慎,您可能会遇到导致性能影响的内存问题。这些问题包括内存泄漏、高内存使用率、无效对象创建和无效的垃圾收集器行为。其他一些性能问题包括跟踪对象本地引用和在线程中使用本地引用所产生的问题。
Java 中的内存泄漏是由于引用不再需要的对象而产生的。高内存使用的一个来源是低效配置的缓存和并行访问系统的大量活动用户。
当用户负载增加时,无效对象创建会变得很明显,因为垃圾收集器必须不断清理堆积物。这可能导致垃圾收集器具有较高的处理器消耗。当垃圾收集器配置不当时,会发生无效的垃圾收集器行为。
仅当您调用的方法处于运行状态时,对象的本地引用才是有效的。本地引用的自动释放并不总是发生在本地方法返回之后。在显式删除全局引用之前,它们仍然是有效的。当您尝试从一个线程向另一个线程传递本地引用时,本地引用会变得无效。为了确保没有在垃圾收集过程中过早释放对象,Java 虚拟机 (JVM) 会跟踪本地和全局引用。
如果没有显式释放本地引用,系统会在以下两种情况下耗尽内存。
情况 1:您在一个方法中访问一个大型对象,以创建对象的本地引用,将它们用于大量计算。本地引用预防在垃圾收集过程中释放该对象。 情况 2:您没有同时使用一个方法中创建的所有本地引用。在一个 COBOL 方法中,您对一个大型对象数组执行循环,
获取元素作为本地引用,并在每一次迭代时对元素进行操作。在每一次迭代之后,不会自动释放对数组元素的本地引用。
使用 C/C++ 作为接口
在一个 C/C++ 程序中,当调用堆栈上使用了过多内存时,就会发生堆栈溢出。堆栈上分配的内存比实际需要的多。回调中的堆栈大小取决于系统架构和可用的内存量。
降低一个给定 C/C++ 程序的有效堆栈大小之后,堆栈溢出情况会更加严重。如果在多线程模式下运行程序,与没有线程支持或分配给单一线程的程序相比,具有多线程的程序每个线程具有更少堆栈空间。
在 COBOL 与 C/C++ 程序之间的调用中,当您尝试调用使用一种语言的函数、而该函数会破坏另一种语言的程序堆栈框架时,就会出现性能问题。对于不会导致有效堆栈框架崩溃和终止的语言,不利影响可能会导致堆栈溢出。
例如,可能无法执行语言的正常清理或退出功能,比如使用 COBOL 在运行单元终止过程中关闭文件,使用非自愿终止的语言清理动态获取的资源。