JDK: различия между версиями
FireWolf (обсуждение | вклад) |
FireWolf (обсуждение | вклад) (→Memory) |
||
Строка 4: | Строка 4: | ||
= Memory = | = Memory = | ||
[[Файл:Memory diagram.png|слева|мини]] | |||
<gallery> | <gallery> | ||
</gallery> | </gallery> | ||
https://stackoverflow.com/questions/10209952/what-is-the-purpose-of-the-java-constant-pool | https://stackoverflow.com/questions/10209952/what-is-the-purpose-of-the-java-constant-pool | ||
=Java Memory Model (JSR 133) - лучшее= | |||
= Java Memory Model (JSR 133) - лучшее | |||
https://habrahabr.ru/company/golovachcourses/blog/221133/ | https://habrahabr.ru/company/golovachcourses/blog/221133/ | ||
= Анализ GC логов = | =Анализ GC логов = | ||
https://blog.gceasy.io/2016/04/06/gc-logging-user-sys-real-which-time-to-use/ | https://blog.gceasy.io/2016/04/06/gc-logging-user-sys-real-which-time-to-use/ | ||
Строка 24: | Строка 30: | ||
https://dzone.com/articles/how-to-reduce-long-gc-pause | https://dzone.com/articles/how-to-reduce-long-gc-pause | ||
== final-поля == | ==final-поля== | ||
Строка 59: | Строка 65: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
= Отладка = | =Отладка = | ||
== Удаленная отладка из Eclipse == | ==Удаленная отладка из Eclipse== | ||
Старт приложения (на примере spring boot) с портом для отладки 8888 | Старт приложения (на примере spring boot) с портом для отладки 8888 | ||
<syntaxhighlight> | <syntaxhighlight> | ||
Строка 69: | Строка 75: | ||
В Eclipse выбрать Debug configurations... -> Remote Java Application -> New, исправить порт и нажать Debug | В Eclipse выбрать Debug configurations... -> Remote Java Application -> New, исправить порт и нажать Debug | ||
= Порядок модификаторов private static final = | =Порядок модификаторов private static final = | ||
Порядок формально не определен, но лучше придерживаться как написано в JLS '''private static final''' | Порядок формально не определен, но лучше придерживаться как написано в JLS '''private static final''' | ||
= Generics = | =Generics = | ||
== Unknown type == | ==Unknown type== | ||
Никакой объект нельзя привести к неизвестному типу и соответственно добавить в массив с неизвестным типом: | Никакой объект нельзя привести к неизвестному типу и соответственно добавить в массив с неизвестным типом: | ||
<syntaxhighlight> | <syntaxhighlight> |
Версия 10:38, 8 июня 2022
Reference: Weak, Soft, Phantom, Strong
https://habr.com/ru/post/169883/
Memory
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-полям в конструкторе будут видны всем другим потокам без синхронизации.
Пример:
public FinalFieldExample() { // bad!
x = 3;
y = 4;
// bad construction - allowing this to escape
global.obj = this;
}
в этом случае нет гарантии, что поток, прочитавший ссылку на данный объект из global.obj прочитает 3 из x.
Или не явный пример:
public class EventListener2 {
public EventListener2(EventSource eventSource) {
eventSource.registerListener(
new EventListener() {
public void onEvent(Event e) {
eventReceived(e);
}
});
}
public void eventReceived(Event e) {
}
}
Отладка
Удаленная отладка из Eclipse
Старт приложения (на примере spring boot) с портом для отладки 8888
$ 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
В Eclipse выбрать Debug configurations... -> Remote Java Application -> New, исправить порт и нажать Debug
Порядок модификаторов private static final
Порядок формально не определен, но лучше придерживаться как написано в JLS private static final
Generics
Unknown type
Никакой объект нельзя привести к неизвестному типу и соответственно добавить в массив с неизвестным типом:
List<?> a = new ArrayList<Object>();
a.add(new Object());// compilation error. ? - unknown. Can't cast Object to unknown.
null может быть приведен к любому классу, соответственно его можно добавить в массив с неизвестным шаблонным типом:
List<?> a = new ArrayList<Object>();
a.add(null);// null may be cast to any class.