- Какие настройки в java
- Общие настройки
- Приватные настройки
- Java Blog
- Обзор параметров JVM
- Какие параметры JVM используются вашим приложением?
- 1. Размер кучи (heap) Java
- 2. Задание процента кучи
- 3. Включить обмен данными класса
- 4. PermGen размер
- 5. Распечатать GC (Garbage Collector)
- 6. Обработка ошибки «OutOfMemory»
- 7. Trace загрузки классов и выгрузки
- 8. Java classpath (путь к классу)
- 9. Профилирование
- 10. 64-битная среда
Какие настройки в java
Нередко приложению требуется сохранять небольшие кусочки данных для дальнейшего использования, например, данные о пользователе, настройки конфигурации и т.д. Для этого в Android существует концепция Preferences или настройки. Настройки представляют собой группу пар ключ-значение, которые используются приложением.
В качестве значений могут выступать данные следующих типов: Boolean, Float, Integer, Long, String, набор строк.
Настройки общими для всех activity в приложении, но также могут быть и настройки непосредственно для отдельных activity
Настройки хранятся в xml-файлах в незашифрованном виде в локальном хранилище. Они невидимы, поэтому для простого пользователя недоступны.
При работе с настройками следует учитывать следующие моменты. Так как они хранятся в незашифрованном виде, то не рекомендуется сохранять в них чувствительные данные типа пароля или номеров кредитных карт. Кроме того, они представляют данные, ассоцииованные с приложением, и через панель управления приложением в Настройках ОС пользователь может удалить эти данные.
Общие настройки
Для работы с разделяемыми настройками в классе Activity (точнее в его базовом классе Context) имеется метод getSharedPreferences() :
import android.content.SharedPreferences; //. SharedPreferences settings = getSharedPreferences("PreferencesName", MODE_PRIVATE);
Первый параметр метода указывает на название настроек. В данном случае название — «PreferencesName». Если настроек с подобным названием нет, то они создаются при вызове данного метода. Второй параметр указывает на режим доступа. В данном случае режим описан константой MODE_PRIVATE
Класс android.content.SharedPreferences предоставляет ряд методов для управления настройками:
- contains(String key) : возвращает true, если в настройках сохранено значение с ключом key
- getAll() : возвращает все сохраненные в настройках значения
- getBoolean (String key, boolean defValue) : возвращает из настроек значение типа Boolean, которое имеет ключ key. Если элемента с таким ключом не окажется, то возвращается значение defValue, передаваемое вторым параметром
- getFloat(String key, float defValue) : возвращает значение типа float с ключом key. Если элемента с таким ключом не окажется, то возвращается значение defValue
- getInt(String key, int defValue) : возвращает значение типа int с ключом key
- getLong(String key, long defValue) : возвращает значение типа long с ключом key
- getString(String key, String defValue) : возвращает строковое значение с ключом key
- getStringSet(String key, Set defValues) : возвращает массив строк с ключом key
- edit() : возвращает объект SharedPreferences.Editor , который используется для редактирования настроек
Для управления настройками используется объект класса SharedPreferences.Editor , возвращаемый метод edit() . Он определяет следующие методы:
- clear() : удаляет все настройки
- remove(String key) : удаляет из настроек значение с ключом key
- putBoolean(String key, boolean value) : добавляет в настройки значение типа boolean с ключом key
- putFloat(String key, float value) : добавляет в настройки значение типа float с ключом key
- putInt(String key, int value) : добавляет в настройки значение int с ключом key
- putLong(String key, long value) : добавляет в настройки значение типа long с ключом key
- putString(String key, String value) : добавляет в настройки строку с ключом key
- putStringSet(String key, Set values) : добавляет в настройки строковый массив
- commit() : подтверждает все изменения в настройках
- apply() : также, как и метод commit(), подтверждает все изменения в настройках, однако измененный объект SharedPreferences вначале сохраняется во временной памяти, и лишь затем в результате асинхронной операции записывается на мобильное устройство
Рассмотрим пример сохранения и получения настроек в приложении. Определим в файле activity_main.xml следующий пользовательский интерфейс:
На экране будут две кнопки — для сохранения и для вывода ранее сохраненного значения, а также поле для ввода и текстовое поля ля вывода сохраненной настройки.
Определим методы обработчики кнопок в классе MainActivity :
package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < private static final String PREFS_FILE = "Account"; private static final String PREF_NAME = "Name"; SharedPreferences settings; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE); >public void saveName(View view) < // получаем введенное имя EditText nameBox = findViewById(R.id.nameBox); String name = nameBox.getText().toString(); // сохраняем его в настройках SharedPreferences.Editor prefEditor = settings.edit(); prefEditor.putString(PREF_NAME, name); prefEditor.apply(); >public void getName(View view) < // получаем сохраненное имя TextView nameView = findViewById(R.id.nameView); String name = settings.getString(PREF_NAME,"не определено"); nameView.setText(name); >>
При отсутствии настроек при попытке их получить, приложение выведет значение по умолчанию:
Теперь сохраним и выведем заново сохраненное значение:
Нередко возникает задача автоматически сохранять вводимые данные при выходе пользователя из activity. Для этого мы можем переопределить метод onPause:
package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity < private static final String PREFS_FILE = "Account"; private static final String PREF_NAME = "Name"; EditText nameBox; SharedPreferences settings; SharedPreferences.Editor prefEditor; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameBox = findViewById(R.id.nameBox); settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE); // получаем настройки String name = settings.getString(PREF_NAME,""); nameBox.setText(name); >@Override protected void onPause() < super.onPause(); String name = nameBox.getText().toString(); // сохраняем в настройках prefEditor = settings.edit(); prefEditor.putString(PREF_NAME, name); prefEditor.apply(); >public void saveName(View view) < >public void getName(View view) < >>
Приватные настройки
Кроме общих настроек каждая activity может использовать приватные, к которым доступ из других activity будет невозможен. Для получения настроек уровня activity используется метод getPreferences(MODE_PRIVATE) :
import android.content.SharedPreferences; //. SharedPreferences settings = getPreferences(MODE_PRIVATE);
То есть в отличие от общих настроек здесь не используется название группы настроек в качестве первого параметра, как в методе getSharedPreferences() . Однако вся остальная работа по добавлению, получению и изменению настроек будет аналогична работает с общими настройками.
Java Blog
Если вы являетесь Java-разработчиком или администратором Java приложения, вам поможет в работе знание того, что означают опции JVM, а также их важность и как они влияют на ваше приложение.
Обзор параметров JVM
Если говорить о параметрах JVM, то есть три типа параметров, которые вы можете включить в JVM: стандартные, нестандартные и расширенные параметры. Если вы используете расширенную опцию, вы всегда используете опцию с -XX. Точно так же, если вы применяете нестандартную опцию, вы используете -X. Стандартные опции ничего не добавляют к опции.
Какие параметры JVM используются вашим приложением?
Если приложение работает в Linux, вы можете использовать
для идентификации процесса Java и просмотра параметров JVM, напечатанных как аргументы процесса. Если в системе выполняется более одного Java-процесса, вам может потребоваться использовать ключевое слово, уникальное для вашего Java-приложения.
Если ваш аргумент слишком длинный, попробуйте использовать
так как эта команда также покажет длинный список аргументов.
Имея список флагов JVM, вы можете получить представление о поведении любого Java-приложения, например Tomcat.
1. Размер кучи (heap) Java
-Xms - установить начальный размер кучи Java -Xmx - установить максимальный размер кучи Java -Xss - установить размер стека Java-потока (java thread stack)
-Xms — эта опция определяет начальный размер кучи для JVM, например, Xms2048m, что означает, что начальный размер кучи JVM составляет около 2 ГБ. Итак, когда JVM запускается, куча памяти будет очень большой. Это делается для предотвращения изменения размера во время запуска и увеличения времени запуска JVM.
-Xmx — этот параметр определяет максимальный размер кучи JVM, например, Xmx2048m, что означает, что максимальный размер кучи JVM будет составлять только 2 ГБ.
По сути, вы всегда будете иметь -Xms и -Xmx вместе.
2. Задание процента кучи
-XX:MaxHeapFreeRatio — устанавливает максимальный процент свободного пространства кучи после GC (Garbage Collecting, сборки мусора), чтобы избежать сжатия.
-XX:MinHeapFreeRatio — устанавливает минимальный процент свободного пространства кучи после GC, чтобы избежать расширения; для мониторинга использования кучи вы можете использовать JConsole.
3. Включить обмен данными класса
Укажите опцию Xshareclasses, чтобы включить общий доступ к данным класса в общем кэше классов. JVM подключается к существующему кэшу или создает кэш, если он не существует. У вас может быть несколько кэшей, и вы можете указать правильный кэш, добавив подопцию в опцию -Xshareclasses.
4. PermGen размер
Ранее параметры JVM определяли размер кучи памяти, но -XX:PermSize — для определения размера пространства PermGen, в котором сохраняются пул строк и метаданные класса. Этот параметр особенно эффективен для веб-сервера, такого как Tomcat, который часто загружает классы веб-приложения во время развертывания.
Кстати, стоит понимать, что пространство PermGen занято Metaspace в Java 8, и этот параметр неприменим, если вы работаете с JRE 8 JVM.
5. Распечатать GC (Garbage Collector)
-verbose:gc - регистрирует, запуски сборщика мусора и сколько времени они занимают. -XX:+PrintGCDetails - включает в себя данные из -verbose:gc, но также добавляет информацию о размере нового поколения и более точных временных параметрах. -XX:-PrintGCTimeStamps - печатать метки времени при сборке мусора.
Эти параметры JVM используются для включения ведения журнала сбора мусора, что очень эффективно для чувствительной к задержке операции. Обычно работа идет в системах, где ведется поиск задержек в микросекундах, но большая сборка мусора может длиться несколько миллисекунд.
Эта удобная опция подскажет вам важную статистику GC. Станет известно, будет ли это большая или небольшая сборка мусора, какой тип сборщика мусора применяется, как часто восстанавливается память, сколько времени он занимал и т.д.
6. Обработка ошибки «OutOfMemory»
Чтобы вызвать дамп кучи при нехватке памяти, вы можете использовать -XX:+HeapDumpOnOutOfMemoryError
Эта опция JVM создает дамп стека, когда ваша JVM завершается с ошибкой OutOfMemory. Там нет никаких затрат, если ошибка OutOfMemory действительно не происходит. Этот флаг является обязательным для производственных систем, поскольку обычно это единственный способ глубоко определить проблему.
Дамп кучи будет установлен в «текущем каталоге» JVM по умолчанию. Если вы хотите создать дамп кучи в определенном каталоге, запустите
-XX:HeapDumpPath=[путь к каталогу дампа кучи] -XX:+UseGCOverheadLimit -XX:OnOutOfMemoryError="; "
Файл дампа кучи может быть огромного размера, вплоть до гигабайт, поэтому убедитесь, что целевая файловая система обеспечивает достаточную емкость.
Если мы хотим перезапустить сервер сразу после возникновения нехватки памяти, мы можем установить этот параметр с той же целью:
XX:OnOutOfMemoryError="shutdown -r"
7. Trace загрузки классов и выгрузки
-XX:+TraceClassLoading и -XX:+TraceClassUnloading — это две опции JVM, которые мы используем для печати информации журналов всякий раз, когда классы загружаются в JVM или выгружаются из JVM. Эти флаги JVM полезны, если у вас есть какой-либо тип утечки памяти, связанный с загрузчиком классов и есть подозрение, что классы не выгружаются или не собирается мусор.
8. Java classpath (путь к классу)
Говоря о Java Classpath а затем -Xbootclasspath определяет записи classpath, которые мы хотим загрузить без проверки. JVM проверяет все классы, которые она загружает, чтобы убедиться, что она не пытается разыменовать объект с помощью int, выталкивает дополнительные записи из стека или выталкивает слишком много, и так далее.
Помещение class в bootclasspath также снижает стоимость, но его следует использовать только тогда, когда вы знаете, что классы проверялись много раз раньше. В JRuby это сократило время запуска вдвое и более для простого скрипта.
9. Профилирование
Java профилирование — это процесс мониторинга различных параметров уровней JVM, таких как выполнение методов, выполнение потоков, сборка мусора и создание объектов. Java профилирование обеспечивает более точное представление о выполнении целевого приложения и использовании его ресурсов.
10. 64-битная среда
В среде ОС, в которой установлены 32- и 64-разрядные пакеты, JVM автоматически выбирает 32-разрядные пакеты среды по умолчанию.
Если мы хотим установить 64-битную среду вручную, мы можем сделать это с помощью параметра -d . OS bit может быть 32 или 64.