C значение переменной и сравнение постоянной величины, не соответствующее

Причина для ошибки

превышен превышение лимита GC "означает, что сборщик мусора работает все время, а программа Java делает очень медленный прогресс.

blockquote>

После сбора мусора, если процесс Java тратит более 98% своего времени на сборку мусора , и если он восстанавливает менее 2% кучи и делал до сих пор последние 5 последовательных сборок мусора, затем вызывается java.lang.OutOfMemoryError

  1. Увеличьте размер кучи , если текущий
  2. Если вы все еще получаете эту ошибку после увеличения памяти кучи, используйте инструменты профилирования памяти , такие как MAT (инструмент анализатора памяти), Visual VM и т. д. и исправить утечки памяти.
  3. Обновить версию JDK до последней версии (1.8.x) или не менее 1.7.x и использовать алгоритм G1GC. Пропускная способность для G1 GC - 90% времени приложения и 10%
  4. Помимо настройки памяти кучи с помощью Xms1g -Xmx2g, попробуйте
    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m  
    -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
    

. Посмотрите на некоторые более связанные вопросы, касающиеся G1GC

Сбор мусора и документация по G7 [JGK 7] для G1

Сбор мусора Java G1 в производстве

Статья о технической службе Oracle для GC finetuning

8
задан Kirill Kobelev 9 January 2017 в 20:35
поделиться

4 ответа

Значение 0xFF международное значение со знаком. C продвинет *p к int при выполнении сравнения, таким образом, первое, если оператор эквивалентен:

if( -1 == 255 ) break;

который является, конечно, ложью. При помощи (signed char)0xFF оператор эквивалентен:

if( -1 == -1 ) break;

который работает, как Вы ожидаете. Ключевой пункт здесь - то, что сравнение, покончили int типы вместо signed char типы.

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

Целочисленные литералы подписали международный тип. Так как 0xFF является интервалом со знаком, компилятор преобразовывает *p в интервал со знаком и затем делает сравнение.

Когда *p-1, который затем преобразовывается от символа со знаком до интервала со знаком, это все еще-1, который имеет представление 0xFFFFFFFF, который не равен 0xFF.

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

Это бросает к интервалу для первого сравнения, так как 0xFF все еще считают интервалом, означая, что Ваш символ-128 к 127, но 0xFF все еще 255.

Во втором случае Ваше сообщение его, что 0xFF является действительно символом со знаком, не интервалом

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

0xff будет рассматриваться как целочисленная константа со значением 255. Необходимо всегда обращать внимание на подобные сравнение между различными типами. Если Вы хотите быть уверенными, что компилятор сгенерирует правильный код, необходимо использовать преобразование типа:

if( *p == (signed char)0xFF ) break;

Так или иначе остерегайтесь этого, следующий оператор не будет работать тот же путь:

if( (int)*p == 0xFF ) break;

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

if( *p == -1 ) break;

0xff ==-1, только если те значения были бы присвоены некоторому символу (или неподписанному символу) переменные:

char a=0xff;
char b=-1;
if(a==b) break;
1
ответ дан 5 December 2019 в 05:00
поделиться
Другие вопросы по тегам:

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