2

我正在尝试诊断构建在 OSGi 之上的 Java 应用程序的性能问题。该平台是在嵌入式 Linux 机器上运行的 ARM5 处理器。CPU 利用率通常为 100%,内存消耗量很大。

我在房子的嵌入式 O/S 方面,Java 开发人员在企业应用程序开发方面比嵌入式更熟练。虽然我的背景还包括嵌入式 Java,但正是出于这个原因,我一直避免使用 OSGi。

我正在寻找唾手可得的果实——有哪些常见的设计错误可能会导致 CPU 和内存消耗过多,我可以快速调查这些错误以使 CPU 利用率恢复到更合理的水平。

4

3 回答 3

3

以下是一些常见的设计陷阱,希望对您有所帮助:

  • 线程的创建可能非常“昂贵”。您是否有例如不断创建新线程的消息传递?使用线程池。

  • 对于对象(例如消息、测量值)也是如此,尤其是内部只有一个字段发生变化的重包装器。使用对象池——它有很大帮助!

  • 对字符串要非常小心,尤其是连接。对字符串调用简单的操作(替换、追加、复制)通常会涉及到许多“表面之下”的临时对象的使用,这对内存和垃圾回收都有负面影响。当在经常执行的代码中对字符串进行修改时(例如,日志助手类的常用方法、负责编写通过协议发送的消息的方法等),然后用不使用的实现替换无效方法的优化临时对象显着提高了性能。

    • 采用StringBuffer
    • 尽可能使用自己的字符串解析 viaString.indexOf(int)而不是StringTokenizer
    • 第一个字符比较通过string.charAt(0)String.startsWith(str)
    • 尽可能使用String's equals 方法equalsIgnoreCase
  • 调整日志级别,使其在正常工作期间不包含调试消息。所有这些调试消息的简单创建可能会大大降低系统速度。还输出到控制台(即使您没有看到它)通常会减慢系统速度 - 始终改为登录到 OSGi 日志服务。

于 2012-05-25T10:30:03.977 回答
2

您发布的分析显示了很多字符串。所以也许你遇到了一个旧的 Java 性能陷阱。

如果您在代码中的某个地方执行以下操作: myString = myString + " "; 或类似的循环它每次都会创建一个新对象。在这些情况下,使用 StringBuilder 是有意义的。这只是一个疯狂的猜测,但它也击中了我。

于 2012-05-21T10:07:22.457 回答
1

试试 Knopflerfish,他们有一个更专注于嵌入式的开源框架实现。还有一家 Prosyst 公司有一个针对嵌入式的商业 OSGi 框架。

于 2013-05-20T07:43:44.603 回答