使用实时Java进行开发,第2部分 改善服务质量 - 编程入门网
统上运行时,仅允许 GC 使用每 10 毫秒中的至多 3 毫秒,典型的暂停时间大约为 500 微秒。(参见 “实时 Java,第 4 部分: 实时垃圾收集”,获取对 IBM WebSphere Real Time 垃圾收集器操作的详细介绍)。
在实时垃圾收集器上运行应用程序时,堆大小和应用程序利用率是要考虑的重要调优选项。随着应用程序利用率的增加,垃圾收集器完成其工作的时间会更短,因此需要更大的堆来确保 GC 周期可以增量式地完成。如果垃圾收集器无法跟上分配速度,GC 将采用同步收集。 例如,与在使用分代垃圾收集器的 JVM 上(未提供利用契约)运行时相比,在 IBM WebSphere Real-Time JVM 上运行的应用程序(具有 70% 的默认应用程序利用契约)默认需要更大的堆。由于实时垃圾收集器控制着 GC 暂停时间的长度,所以增加堆大小会降低 GC 频率,不会延长各次暂停时间。另一方面,在非实时垃圾收集器中,增加堆大小通常会降低 GC 周期的频率,这会降低垃圾收集器的总体影响。当发生垃圾收集时,暂停时间通常会更长(因为需要检查更大的堆)。 在 IBM WebSphere Real Time JVM 中,可以使用 -Xmx<size> 选项调整堆大小。例如,-Xmx512m 指定堆大小为 512MB。还可以调整应用程序利用率。例如,-Xgc:targetUtilization=80 将利用率设置为 80%。 使用实时Java进行开发,第2部分 改善服务质量(2)时间:2011-01-27 IBM Mark StoodleyJava 类加载暂停 Java 语言规范要求在应用程序首次引用类时对类进行解析、加载、验证和初始化。如果对一个类 C 的首次引用发生在时间关键型操作期间,那么解析、验证、加载和初始化 C 的时间可能导致执行操作的时间比预期更长。由于加载 C 涉及到验证该类(这可能需要加载其他类),所以 Java 应用程序为了能够首次使用特定类而发生的总延迟可能比预期长很多。 为什么类只能在应用程序执行期间首次被引用?很少执行的路径是加载新类的一个常见原因。例如,清单 1 中的代码包含一个可能很少发生的 if 条件。(为了简单起见,我们尽可能省略了本文中所有清单中的异常和错误处理)。 清单 1. 用于加载新类的很少执行的条件示例
异常类是只能在应用程序执行期间加载的类的另一个例子,因为异常在理想情况下(但不一定会遇到这种情况)很少发生。由于异常通常难以快速处理,所以加载额外的类的附加开销可能使操作延迟超出重要阈值。一般而言,应该尽可能避免在时间关键型操作期间抛出异常。 也可以在 Java 类库中使用某些服务(比如反射)时加载新类。反射类的底层实现会动态生成将加载到 JVM 中的新类。在时间敏感型代码中反复使用反射类可能导致持续不断的类加载活动,这会引起延迟。使用 -verbose:class 选项是检测正在被创建的类的最佳方式。或许避免在程序执行期间创建这些类的最佳方式在于,避免在应用程序的时间关键型部分使用反射服务来从字符串映射类、字段或方法。相反,在应用程序执行过程中尽早调用这些服务并存储结果共以后使用,这可以避免在不需要时动态创建大部分这样的类。 一种在应用程序的时间敏感型部分避免类加载延迟通用技术是,在应用程序启动或初始化期间预先加载类。尽管这个预加载步骤带来一定的启动延迟(改善一个指标通常会对其他指标带来负面影响),但是如果小心使用,这一步可以在以后消除不需要的类加载过程。这种 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |