对于SQL解析,我们在Java Web应用程序中使用General SQL Parser(GSP)。如果我们在带有Java 7的Windows Server 2008 R2上使用GSP部署我们的应用程序,我们会在类加载期间看到100%的CPU峰值,这可能会持续几分钟。在初始类加载之后,一切正常,直到我们关闭应用程序服务器并卸载类:100%CPU峰值返回。 如果我们将相同的代码库部署到Windows Server 2012,Windows 7 Enterprise,OS X或Linux服务器,则没有这样的高峰。在Windows Server 2008 R2上使用Java 8可以略微改善启动。
使用Microsoft的Process Monitor,我们发现从这个jar加载类时浪费了很多时间。 gsp.jar中的类文件被混淆。我们可以排除除了新添加的jar之外的任何其他原因。只需通过解析SQL语句,冷启动时间就会显着增加。禁用防病毒无效。升级到较新的Windows Server版本不是我们所有客户的选择。
我们正在运行此GSP版本:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.1
Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.)
Built-By: Gudu Software
Vendor: Gudu Software
Title: General SQL Parser Java Version
Version: 1.6.0.5
此测试程序需要超过40秒才能执行Windows Server 2008 R2,在OS X上需要1.5秒。
package com.stackoverflow;
import gudusoft.gsqlparser.EDbVendor;
import gudusoft.gsqlparser.TGSqlParser;
public class TestGSP {
public static void main(String[] args) {
TGSqlParser parser = new TGSqlParser(EDbVendor.dbvmssql);
parser.setSqltext("select a from b where c = d");
parser.parse();
}
}
有没有人知道导致这个问题的原因以及如何避免这个问题?
修改 我使用了新的Windows Server 2008 R2并使用不同的RAM / JVM设置运行测试程序:
例如:java -Xmx1G -classpath ".\;.\gsp.jar" com.stackoverflow.TestGSP
+--------------+-----------+----------------+
| Java version | RAM in GB | Duration in ms |
+--------------+-----------+----------------+
| 1.7.0_79 | 1 | 33438 |
| 1.7.0_79 | 2 | 33640 |
| 1.7.0_79 | 4 | 33484 |
| 1.8.0_66 | 1 | 5437 |
| 1.8.0_66 | 2 | 5563 |
| 1.8.0_66 | 4 | 5703 |
+--------------+-----------+----------------+
如果我在OS X上运行相同的测试,我会得到这个持续时间:
+--------------+-----------+----------------+
| Java version | RAM in GB | Duration in ms |
+--------------+-----------+----------------+
| 1.7.0_79 | 1 | 1024 |
| 1.7.0_79 | 2 | 999 |
| 1.7.0_79 | 4 | 968 |
| 1.8.0_65 | 1 | 601 |
| 1.8.0_65 | 2 | 601 |
| 1.8.0_65 | 4 | 603 |
+--------------+-----------+----------------+
更改JVM版本会有所帮助,但增加RAM并不能解决问题。