Как избежать проблем GeneratedSerializationConstructorAccessor?

У нас есть Приложение Java, которое получает запросы SOAP, и после большого количества запросов мы замечаем, что GC останавливает мир для разгрузки большого количества классов GeneratedSerializationConstructorAccessor. Это - большое влияние производительности.

Кто-либо знает, как избежать этого или по крайней мере значительно уменьшить количество созданных классов GeneratedSerializationConstructorAccessor?

6
задан OscarRyz 4 June 2010 в 01:56
поделиться

3 ответа

Используйте одну из опций:

-Dsun.reflect.inflationThreshold=30

Увеличивает количество вызовов через конструктор/метод/поле, прежде чем родной аксессор будет "раздут" до сгенерированного аксессора. По умолчанию это значение равно 15.

-Dsun.reflect.inflationThreshold=0

Полностью отключает инфляцию. Интересно, что эта опция не влияет на конструкторы, но работает для методов.

Вы можете проверить опции с помощью простого тестового приложения:

public class a {
  public static void main(String[] args) throws Exception {
    for (int i = 0; i < 20; i++) {
      a.class.getDeclaredConstructor(null).newInstance(null);
    }
  }

  private static int x;
  public a() {
    new Throwable("" + x++).printStackTrace();
  }
}

Edit (29-Dec-2013): Опция -Dsun.reflect.noInflation=true отключает механизм инфляции и вместо этого сразу использует сгенерированные аксессоры, поэтому вам не нужна эта опция.

5
ответ дан 17 December 2019 в 00:03
поделиться

Из http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2006-11/msg00122.html

Эти классы являются частью механизм отражения. Так как около Отражение Java 1.3 было реализуется путем создания классов для выполнить доступ. Это намного быстрее использовать, но требуется больше времени для создания и расстраивает постоянное поколение.

Сериализация использует их для чтения и записи. поля, выполнить методы (readObject, writeObject, readObjectNoData, readResolve) и вызовите несериализуемый базовый класс конструктор (этот последний код не проверяемый).

Похоже, они используются только временно для сериализации / десериализации заданного класса объектов. Как указывается в статье, они, вероятно, проводятся с использованием SoftReferences, поэтому убедитесь, что в вашем приложении достаточно памяти, и она будет реже использоваться.

Удивительно, но другого решения не существует.

0
ответ дан 17 December 2019 в 00:03
поделиться

[...] мы замечаем, что сборщик мусора останавливает мир, чтобы выгрузить много GeneratedSerializationConstructorAccessor классы. Это большой спектакль влияние.

Поскольку этого невозможно избежать, если ваше приложение использует отражение, вы можете попробовать использовать сборщик мусора CMS , чтобы минимизировать влияние глобального мусора.

2
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: