Медленная загрузка классов Java в Windows Server 2008 R2

Для синтаксического анализа SQL мы используем General SQL Parser (GSP) в нашем веб-приложении Java. Если мы развернем наше приложение с GSP на Windows Server 2008 R2 с Java 7, мы увидим 100% пиковую нагрузку на ЦП во время загрузки класса, которая может длиться до нескольких минут. После начальной загрузки класса все работает нормально, пока мы не выключим сервер приложений и классы не будут выгружены: вершина 100% загрузки ЦП вернулась. Если мы развернем одинаковую кодовую базу на Windows Server 2012, Windows 7 Enterprise, OS X или на сервере Linux, такого пика не будет. Использование Java 8 в Windows Server 2008 R2 немного улучшает запуск.

С Process Monitor от Microsoft мы увидели, что при загрузке классов из этой банки тратится много времени. Файлы классов в gsp.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.stackru;

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.stackru.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 I, я получаю следующие значения:

+--------------+-----------+----------------+
| 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 помогает, но увеличение ОЗУ не решает проблему.

0 ответов

Другие вопросы по тегам