6

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

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

+0

Почему этот помеченный gcc (сборник компилятора Gnu)? Вы хотели отметить его gc (сборщик мусора)? Вы используете gcj (компилятор Gnu для Java)? –

+0

Я думаю, что это была опечатка, я меняю ее на 'gc' – OscarRyz

ответ

0

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

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

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

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

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

5

Используйте один из вариантов:

-Dsun.reflect.inflationThreshold=30 

Увеличивает количество звонков через конструктор/метод/Field перед родным аксессором будет «надутым» в генерируемой аксессору. Значение по умолчанию: 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 отключает механизм инфляции и вместо того, чтобы сразу же использует генерироваться аксессорами, поэтому вы надеваете Не хочу этого варианта.

+1

На самом деле установка noInflation в true приведет к тому, что весь доступ будет выполняться с помощью генерации байтового кода. Вы хотите установить порог равным нулю или меньше. –

+1

@raphw Вы правы, спасибо за исправление моей дезинформации! Я отредактировал сообщение с вашим предложением. –

2

[...] мы замечаем, что GC останавливает мир, чтобы выгрузить много классов GeneratedSerializationConstructorAccessor. Это большой эффект удара .

Как невозможно избежать, если ваше приложение использует отражение, вы можете попробовать использовать CMS garbage collector, чтобы свести к минимуму воздействие на стоп-мире GC.

Смежные вопросы