|
|
Строка 1: |
Строка 1: |
| = Reference: Weak, Soft, Phantom, Strong =
| |
|
| |
|
| https://habr.com/ru/post/169883/
| |
|
| |
| = Memory =
| |
| <gallery>
| |
| Memory diagram.png|
| |
| </gallery>
| |
|
| |
| https://stackoverflow.com/questions/10209952/what-is-the-purpose-of-the-java-constant-pool
| |
|
| |
| = Java Memory Model (JSR 133) - лучшее =
| |
|
| |
| https://habrahabr.ru/company/golovachcourses/blog/221133/
| |
|
| |
| = Анализ GC логов =
| |
|
| |
| https://blog.gceasy.io/2016/04/06/gc-logging-user-sys-real-which-time-to-use/
| |
|
| |
| https://www.baeldung.com/native-memory-tracking-in-jvm
| |
|
| |
| https://www.baeldung.com/jvm-garbage-collectors
| |
|
| |
| https://dzone.com/articles/how-to-reduce-long-gc-pause
| |
|
| |
| == final-поля ==
| |
|
| |
|
| |
| Значения для final-полей объекта задаются в конструкторе. Если предположить, что объект построен «правильно», то как только объект построен, значения, присвоенные final-полям в конструкторе будут видны всем другим потокам без синхронизации.
| |
|
| |
| Пример:
| |
| <syntaxhighlight>
| |
| public FinalFieldExample() { // bad!
| |
| x = 3;
| |
| y = 4;
| |
| // bad construction - allowing this to escape
| |
| global.obj = this;
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| в этом случае нет гарантии, что поток, прочитавший ссылку на данный объект из global.obj прочитает 3 из x.
| |
|
| |
| Или не явный пример:
| |
| <syntaxhighlight>
| |
| public class EventListener2 {
| |
| public EventListener2(EventSource eventSource) {
| |
|
| |
| eventSource.registerListener(
| |
| new EventListener() {
| |
| public void onEvent(Event e) {
| |
| eventReceived(e);
| |
| }
| |
| });
| |
| }
| |
|
| |
| public void eventReceived(Event e) {
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| = Отладка =
| |
|
| |
| == Удаленная отладка из Eclipse ==
| |
| Старт приложения (на примере spring boot) с портом для отладки 8888
| |
| <syntaxhighlight>
| |
| $ JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8888,server=y,suspend=n -Dspring.profiles.active=dev,swagger,liquibase" ./app-0.0.1-SNAPSHOT.war
| |
| </syntaxhighlight>
| |
|
| |
| В Eclipse выбрать Debug configurations... -> Remote Java Application -> New, исправить порт и нажать Debug
| |
|
| |
| = Порядок модификаторов private static final =
| |
| Порядок формально не определен, но лучше придерживаться как написано в JLS '''private static final'''
| |
|
| |
| = Generics =
| |
|
| |
| == Unknown type ==
| |
| Никакой объект нельзя привести к неизвестному типу и соответственно добавить в массив с неизвестным типом:
| |
| <syntaxhighlight>
| |
| List<?> a = new ArrayList<Object>();
| |
| a.add(new Object());// compilation error. ? - unknown. Can't cast Object to unknown.
| |
| </syntaxhighlight>
| |
|
| |
| null может быть приведен к любому классу, соответственно его можно добавить в массив с неизвестным шаблонным типом:
| |
| <syntaxhighlight>
| |
| List<?> a = new ArrayList<Object>();
| |
| a.add(null);// null may be cast to any class.
| |
| </syntaxhighlight>
| |