Mieliśmy osobliwy problem w naszym systemie produkcyjnym z powodu bardzo głupiego błędu w bibliotece klienta.
Co się stało, to:
public <T> ResponseEntity<T> executePut(String url, JsonObject payload, Class<T> t) {
String payloadString = payload != null ? payload.toString() : null;
HttpEntity<String> entity = new HttpEntity<>(payloadString, getCommonHeaders());
restTemplate.getMessageConverters()
.add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
return restTemplate.exchange(url, HttpMethod.PUT, entity, t);
}
Jak widać w powyższej metodzie, biblioteka klienta pobierała obiekt autowired (singleton) i kontynuowała dodawanie elementu na liście MessageConverters.
Problem: po chwili odwołanie do obiektu restTemplate dawało NPE również z pustym śladem stosu.
PS: Wskazuję na to jako prawdopodobną przyczynę, ponieważ jest to jedyna zmiana kodu, która nastąpiła między dwoma wdrożeniami.
Ponadto, czy duży obiekt nie powinien powodować braku pamięci? W naszym przypadku tak się nie stało i inne przepływy aplikacji działały bez zarzutu.
1 odpowiedź
Gdy obiekt stanie się zbyt duży, aby zużywał całą pamięć sterty, maszyna wirtualna przestanie działać poprawnie. Jest mało prawdopodobne, że jakakolwiek część programu uruchomiona w tej maszynie wirtualnej będzie nadal działać poprawnie.
Kiedy sterta się zapełnia, garbage collector próbuje zwolnić pamięć. I będzie próbował to robić cały czas. Twoja maszyna wirtualna nie zrobi nic więcej. I najprawdopodobniej otrzymasz OutOfMemoryError: GC Overhead Limit Exceeded
. Zobacz https://www.baeldung.com/java-gc-overhead-limit -przekroczono
Ten błąd nie powinien być obsługiwany przez kod w programie. Jest mało prawdopodobne, że ktoś zwróci null
w przypadku błędu braku pamięci. Uważam to za bardzo złe zachowanie.
Odnośnie wyjątku NullPointerException: nie sądzę, aby nie zawierał śladu stosu. Jednak może nie zostać zalogowany. Czy próbowałeś dołączyć debugger do systemu i ustawić punkt przerwania wyjątku dla NPE?
Wszystkie konwertery wiadomości w szablonie REST będą wywoływane jeden po drugim. Konwertery wiadomości dodajesz na początku listy przy każdym wywołaniu. Wydaje mi się, że to nie ma sensu. może powodować wewnętrzne problemy.
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].