0

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

このテスト プログラムは、Windows Server 2008 R2 で実行するのに 40 秒以上かかり、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 XI で同じテストを実行すると、次の期間が得られます。

+--------------+-----------+----------------+
| 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 を増やしても問題は解決しません。

4

0 に答える 0