Java11之前的java.lang.·System.getProperty() 对性能有影响


'java.lang.System.getProperty()' 是 Java 开发人员用来读取在应用程序启动期间配置的系统属性的常用 API。即,当您将“-DappName=buggyApp”作为应用程序的启动 JVM 参数传递时,可以通过调用“java.lang.System.getProperty()”来读取“appName”系统属性的值。
 
 “java.lang.System.getProperty()”API 底层使用“java.util.Hashtable.get()”API。请注意,'java.util.Hashtable.get()' 是一个同步 API。这意味着在任何给定时间只有一个线程可以调用“java.util.Hashtable.get()”方法。如果新线程在第一个线程仍在执行时尝试调用“java.util.Hashtable.get()”API,则新线程将处于 BLOCKED 状态。当线程处于 BLOCKED 状态时,它将无法前进。只有当第一个线程完成执行'java.util.Hashtable.get()' API 时,新线程才能继续前进。因此,如果在关键代码路径中调用“java.lang.System.getProperty()”或“java.util.Hashtable.get()”,则会影响事务的响应时间。
 
以下是解决此问题的潜在解决方案:

  • 1. 升级到 JDK 11:

从 JDK 11 开始,java.util.Properties 中的 Synchronized 'HashTable' 已替换为 'ConcurrentHashMap'。因此,当您升级到 JDK11 时,您将不会遇到此问题。
  • 2.缓存值:

在大量应用程序中,系统属性在运行时不会改变。在这种情况下,我们不必在每个事务上都继续调用“java.lang.System.getProperty()”API。相反,我们可以调用一次“java.lang.System.getProperty()”API,缓存它的值,并在以后的所有调用中返回缓存的值。