Как и в любой другой веб-разработке, ошибки могут возникать по различным причинам, таким как некорректный ввод данных, ошибки сервера, проблемы с базой данных и т.д. Чтобы эффективно обработать эти ошибки.
Эта директива указывается в исходной JSP-странице и задает путь к другой странице, которая будет использоваться для отображения сообщений об ошибках. Когда на этой странице происходит ошибка, пользователь будет перенаправлен на страницу
error.jsp.<%@ page errorPage="error.jsp" %>
На странице, которая обрабатывает ошибки (например,
error.jsp), необходимо указать атрибут isErrorPage, чтобы сообщить контейнеру JSP, что эта страница предназначена для обработки ошибок.<%@ page isErrorPage="true" %>
На этой странице вы можете использовать встроенный объект
exception для получения информации об ошибке:<%@ page isErrorPage="true" %>
<html>
<head>
<title>Ошибка</title>
</head>
<body>
<h1>Произошла ошибка</h1>
<p>Ошибка: <%= exception.getMessage() %></p>
</body>
</html>
Вы можете указать глобальную обработку ошибок в конфигурационном файле
web.xml вашего веб-приложения. Это позволяет обрабатывать ошибки на уровне сервлета. Если сервер вернет ошибку 404 (страница не найдена), пользователь будет перенаправлен на страницу notfound.jsp. Если возникает любое исключение (например, java.lang.Throwable), пользователь будет перенаправлен на страницу error.jsp.<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
В некоторых случаях вы можете использовать блоки
try-catch непосредственно в JSP для обработки определенных исключений:<%@ page import="java.sql.*, java.io.*" %>
<%
try {
// код, который может вызвать исключение
} catch (SQLException e) {
out.println("Ошибка базы данных: " + e.getMessage());
} catch (IOException e) {
out.println("Ошибка ввода/вывода: " + e.getMessage());
} catch (Exception e) {
out.println("Произошла ошибка: " + e.getMessage());
}
%>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🤯1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥7🤯2
Предоставляет набор тэгов для различных задач, включая обработку ошибок. Хотя JSTL не предоставляет прямых средств для глобальной обработки ошибок, она позволяет обрабатывать исключения и показывать соответствующие сообщения об ошибках на уровне страницы.
Тег
<c:catch> используется для перехвата и обработки исключений внутри JSP-страницы. Он позволяет обрабатывать ошибки в JSP-страницах без использования скриплетов. Блок кода, который может вызвать исключение, обернут в тег <c:catch>. Если исключение возникает, оно сохраняется в переменной exception. Тег <c:if> используется для проверки, возникло ли исключение, и отображения сообщения об ошибке.<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:catch var="exception">
<%
// Это может вызвать исключение, например деление на ноль
int result = 10 / 0;
%>
</c:catch>
<c:if test="${not empty exception}">
<p>Произошла ошибка: ${exception.message}</p>
</c:if>
Вы можете использовать JSTL вместе с Expression Language (EL) для более элегантного и чистого кода. Мы снова используем тег
<c:catch> для перехвата исключения. Внутри <c:catch> используется EL для выполнения операции, которая вызывает исключение. Исключение обрабатывается и отображается пользователю.<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="https://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<c:catch var="exception">
${1 / 0} <!-- Попытка деления на ноль вызовет исключение -->
</c:catch>
<c:if test="${not empty exception}">
<p>Произошла ошибка: ${fn:escapeXml(exception.message)}</p>
</c:if>
При работе с внешними ресурсами, такими как базы данных или веб-сервисы, также можно использовать JSTL для перехвата исключений. Мы настраиваем источник данных с помощью тега
<sql:setDataSource>. Запрос SQL обернут в тег <c:catch> для перехвата любых ошибок базы данных. Если возникает ошибка, она отображается пользователю.<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="https://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource var="ds" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/mydb"
user="root" password="password" />
<c:catch var="exception">
<sql:query dataSource="${ds}" var="result">
SELECT * FROM non_existent_table
</sql:query>
</c:catch>
<c:if test="${not empty exception}">
<p>Произошла ошибка базы данных: ${exception.message}</p>
</c:if>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥9
Позволяет управлять различными аспектами поведения вашего веб-приложения на уровне сервера. Дескриптор развертывания расположен в каталоге
WEB-INF вашего веб-приложения и используется для определения настроек сервлетов, фильтров, обработчиков ошибок и других компонентов.Когда вы используете JSP, контейнер сервлетов (например, Apache Tomcat) автоматически назначает специальный сервлет для обработки запросов к JSP-страницам. Обычно это происходит автоматически, но вы можете явно указать это в дескрипторе развертывания. Элемент
<servlet> определяет сервлет, обрабатывающий JSP. Элемент <servlet-mapping> связывает этот сервлет с URL-шаблоном *.jsp.<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
В дескрипторе развертывания можно настроить глобальную обработку ошибок, указывая страницы для различных типов ошибок или исключений. Ошибка с кодом 404 (не найдено) будет обрабатываться страницей
notfound.jsp. Любое исключение типа java.lang.Throwable будет обрабатываться страницей error.jsp.<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
Вы можете настроить параметры сессий, такие как время ожидания, в дескрипторе развертывания. Этот параметр указывает, что сессии будут истекать через 30 минут бездействия.
<session-config>
<session-timeout>30</session-timeout> <!-- Время в минутах -->
</session-config>
Параметры инициализации сервлета могут быть настроены через элементы
<init-param>. В этом примере параметр development включен, что может использоваться для различных режимов работы сервлета.<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>development</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤯2❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥6❤1
Да, вы можете использовать JavaScript на JSP-странице. JSP (JavaServer Pages) и JavaScript выполняются на разных уровнях: JSP обрабатывается на сервере и генерирует HTML-код, который затем отправляется клиенту, где JavaScript выполняется на стороне клиента в браузере. Таким образом, можно комбинировать JavaScript и JSP для создания динамичных и интерактивных веб-страниц.
Вы можете включать JavaScript внутри тегов
<script> в вашем JSP-коде, как в обычной HTML-странице. JavaScript-код включен в секцию <head>. Функция showAlert вызывается при нажатии кнопки.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Пример использования JavaScript на JSP</title>
<script type="text/javascript">
function showAlert() {
alert("Это сообщение от JavaScript!");
}
</script>
</head>
<body>
<h1>Пример использования JavaScript на JSP</h1>
<button onclick="showAlert()">Нажмите меня</button>
</body>
</html>
Вы можете использовать JSP для динамической генерации JavaScript-кода, вставляя данные с сервера. JSP-код вставляет значение переменной
message из сервлета в JavaScript. Функция showMessage выводит это сообщение с помощью alert.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String message = "Привет, это сообщение от сервера!";
%>
<html>
<head>
<title>Пример использования данных с сервера в JavaScript</title>
<script type="text/javascript">
function showMessage() {
var message = "<%= message %>";
alert(message);
}
</script>
</head>
<body>
<h1>Пример использования данных с сервера в JavaScript</h1>
<button onclick="showMessage()">Показать сообщение</button>
</body>
</html>
Вы можете использовать JavaScript (особенно AJAX) для асинхронного взаимодействия с сервером, отправляя запросы и получая данные без перезагрузки страницы.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Пример AJAX с использованием JSP</title>
<script type="text/javascript">
function loadMessage() {
var xhr = new XMLHttpRequest();
xhr.open("GET", "message.jsp", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
document.getElementById("message").innerHTML = xhr.responseText;
}
};
xhr.send();
}
</script>
</head>
<body>
<h1>Пример AJAX с использованием JSP</h1>
<button onclick="loadMessage()">Загрузить сообщение</button>
<div id="message"></div>
</body>
</html>
JavaScript использует объект
XMLHttpRequest для отправки асинхронного запроса к message.jsp.Ответ от сервера отображается в элементе с id
message.<%@ page contentType="text/plain;charset=UTF-8" language="java" %>
<%
out.print("Сообщение от сервера: " + new java.util.Date());
%>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥4❤1
Оба этих объекта используются для вывода контента в ответе HTTP, но они имеют разные особенности и способы использования.
Это объект, используемый в JSP для вывода данных на клиентскую сторону. Он является частью стандартной библиотеки JSP и предоставляется контейнером JSP. Основные характеристики
JSPWriter:JSPWriter поддерживает буферизацию, что позволяет накапливать вывод в буфере перед отправкой его клиенту. Вы можете управлять размером буфера и его очисткой.JSPWriter является частью объекта JspContext, который доступен в JSP через встроенную переменную out. JSPWriter интегрирован с другими элементами JSP, такими как теги и выражения JSP.JSPWriter наследует методы от java.io.Writer, включая write, flush, и close. Также он предоставляет методы для управления буфером, такие как clear(), clearBuffer(), и getBufferSize().Пример использования
JSPWriter в JSP:<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>Пример использования JSPWriter</title>
</head>
<body>
<%
out.println("Это вывод с использованием JSPWriter.");
out.write("Еще один пример вывода.");
%>
</body>
</html>
Это объект, используемый в сервлетах для вывода данных на клиентскую сторону. Он является частью стандартной библиотеки сервлетов и предоставляется объектом
HttpServletResponse. Основные характеристики PrintWriter:PrintWriter не поддерживает буферизацию в том же смысле, что и JSPWriter. Он напрямую отправляет данные клиенту. Однако сервер может использовать собственные механизмы буферизации, которые не контролируются программистом.PrintWriter используется в сервлетах и доступен через метод getWriter() объекта HttpServletResponse. Он используется для генерации HTML, JSON, XML и других типов ответа в сервлетах.PrintWriter наследует методы от java.io.Writer и добавляет удобные методы для печати различных типов данных, такие как print, println, и printf.Пример использования
PrintWriter в сервлете:import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Пример использования PrintWriter</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Это вывод с использованием PrintWriter.</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥4
По умолчанию объект сессии создается автоматически на каждой JSP-странице. Это означает, что каждый раз, когда клиент запрашивает JSP-страницу, сервер создаст объект сессии, если он еще не существует, и прикрепит его к клиенту. Тем не менее, в некоторых ситуациях это поведение может быть нежелательным, например, для страниц, которые не требуют управления сессией (например, статический контент, страницы с высокой нагрузкой и т.д.).
Вы можете отключить автоматическое создание сессии на JSP-странице с помощью атрибута
session директивы page. Для этого нужно установить session="false". Директива <%@ page session="false" %> отключает автоматическое создание объекта сессии для данной страницы.<%@ page session="false" %>
<html>
<head>
<title>Страница без сессии</title>
</head>
<body>
<h1>Эта страница не создает объект сессии</h1>
</body>
</html>
Объект сессии не будет создан автоматически сервером.
Встроенная переменная
session не будет доступна на странице. Попытка обращения к ней приведет к ошибке компиляции JSP.Для страниц, которые не зависят от состояния пользователя и не требуют отслеживания информации о сессии, отключение сессий может сократить накладные расходы.
Для страниц с высокой нагрузкой, где управление сессиями может создавать избыточные ресурсы и накладные расходы на сервере.
Когда используется внешний кеш для контента, который не зависит от состояния пользователя.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥7
Работа с JSP (JavaServer Pages) включает в себя множество принципов и практик, которые помогают разработчикам создавать поддерживаемые, эффективные и безопасные веб-приложения.
Использование шаблона проектирования MVC помогает отделить логику приложения (модель) от его представления (вид) и управления (контроллер). В JSP это достигается следующими способами:
Модель: Логика обработки данных, обычно реализованная в JavaBeans, POJO или сервисах.
Вид: JSP-страницы, которые используются для отображения данных пользователю.
Контроллер: Серверные компоненты, такие как сервлеты, которые обрабатывают запросы, взаимодействуют с моделью и передают данные на вид.
// Сервлет-контроллер
@WebServlet("/greeting")
public class GreetingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
if (name == null || name.isEmpty()) {
name = "Guest";
}
request.setAttribute("greeting", "Hello, " + name + "!");
request.getRequestDispatcher("/greeting.jsp").forward(request, response);
}
}
<!-- greeting.jsp -->
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h1><%= request.getAttribute("greeting") %></h1>
</body>
</html>
JSTL (JavaServer Pages Standard Tag Library)
JSTL предоставляет стандартный набор тегов для выполнения общих задач, таких как условные операторы, циклы, работа с коллекциями, форматирование и интернационализация.
EL (Expression Language)
EL используется для упрощения доступа к данным в JSP, таких как атрибуты запроса, сессии и контекста приложения.
<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Greeting</title>
</head>
<body>
<c:if test="${not empty greeting}">
<h1>${greeting}</h1>
</c:if>
</body>
</html>
Использование скриплетов
<% %> (вставки Java-кода в JSP) не рекомендуется, так как это затрудняет поддержку и чтение кода. Вместо этого используйте JSTL и EL для выполнения большинства задач.Сессии используются для сохранения состояния пользователя между запросами. Однако, они потребляют ресурсы сервера, поэтому используйте их разумно.
Отключение сессий при ненадобности: Если страница не требует использования сессий, отключите их. Минимизация данных сессии: Храните в сессии только необходимые данные.
<%@ page session="false" %>
Реализуйте глобальную обработку ошибок в дескрипторе развертывания
web.xml и на уровне страниц.<!-- web.xml -->
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
Защита от XSS (Cross-Site Scripting): Экранируйте выводимые данные.
Защита от CSRF (Cross-Site Request Forgery): Используйте токены для подтверждения действий.
<c:out value="${param.name}" />Кеширование: Кешируйте часто используемые данные для снижения нагрузки на сервер и базу данных.
Минимизация размера ответа: Сжимайте HTML, CSS и JavaScript.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🤔1🤯1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2❤1
Это виртуальная машина, которая обеспечивает выполнение программ, написанных на языке программирования Java. Основная роль JVM — это выполнение байт-кода Java, который является промежуточным представлением программ, компилируемых из исходного кода Java. JVM также предоставляет среду выполнения, включая управление памятью, сборку мусора, безопасность и многопоточность.
Программы, написанные на Java, компилируются в байт-код, который не зависит от платформы. Этот байт-код может выполняться на любой системе, где установлена соответствующая JVM. Это означает, что один и тот же байт-код может выполняться на различных операционных системах и аппаратных платформах без изменений.
Управляет памятью через кучу (heap), где объекты динамически создаются и удаляются. Это освобождает разработчиков от необходимости вручную управлять памятью, снижая вероятность ошибок, связанных с неправильным использованием памяти, таких как утечки памяти.
Автоматически управляет освобождением памяти, используя сборщик мусора. Сборщик мусора периодически освобождает память, занятую объектами, которые больше не используются программой, что помогает предотвратить утечки памяти и улучшить производительность.
Обеспечивает безопасное выполнение кода через систему управления доступом, которая проверяет разрешения при выполнении определенных операций (например, доступ к файловой системе). Это помогает предотвратить выполнение вредоносного кода.
Поддерживает многопоточность на уровне языка, что позволяет разработчикам создавать многопоточные программы с помощью встроенных механизмов Java. JVM обеспечивает управление потоками, их синхронизацию и выполнение.
Предоставляет механизм обработки исключений, который позволяет программы Java надежно обрабатывать ошибки во время выполнения, повышая надежность и устойчивость приложений.
Исходный код Java (.java файлы) компилируется компилятором Java (javac) в байт-код (.class файлы), который является машинно-независимым промежуточным кодом.
Класс-загрузчики (Class Loaders) JVM загружают байт-код в память. Существует несколько типов загрузчиков классов, такие как Bootstrap Class Loader, Extension Class Loader и Application Class Loader.
Выполняет проверку байт-кода для обеспечения его корректности и безопасности. Проверка включает проверку формата, доступности, ссылок и других аспектов, чтобы предотвратить выполнение некорректного или вредоносного кода.
Может интерпретировать байт-код или использовать Just-In-Time (JIT) компиляцию для преобразования байт-кода в машинный код во время выполнения. JIT-компиляция улучшает производительность, так как позволяет часто исполняемым частям кода выполняться быстрее.
После загрузки, проверки и компиляции байт-кода JVM выполняет его, управляя памятью, потоками и исключениями, обеспечивая при этом безопасность выполнения.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33🔥1
Это компонент JVM, который отвечает за динамическую загрузку классов в память во время выполнения программы. В Java каждый класс должен быть загружен в память перед его использованием, и именно Classloader занимается этой задачей.
Classloader находит и загружает файлы классов (обычно с расширением
.class) в память.После загрузки Classloader проверяет байт-код класса для обеспечения его корректности и безопасности.
Classloader связывает загруженные классы, включая проверку ссылок и разрешение символов.
Classloader инициализирует загруженные классы, вызывая их статические инициализаторы и инициализаторы переменных.
Это базовый загрузчик классов, встроенный в JVM. Он загружает основные классы Java из файла
rt.jar, такие как классы из java.lang, java.util и других. Он реализован на нативном языке и является частью ядра JVM.Загружает классы из стандартных расширений Java, находящихся в директории
jre/lib/ext или другой директории, определенной системным параметром java.ext.dirs. Он сам загружается с помощью Bootstrap ClassLoader.Загружает классы приложения из директории classpath. Обычно это директория, указанная в переменной окружения
CLASSPATH или параметре командной строки -cp. Это стандартный загрузчик классов, используемый для загрузки классов приложений и библиотек.public class Main {
public static void main(String[] args) {
ClassLoader classLoader = Main.class.getClassLoader();
System.out.println("ClassLoader: " + classLoader);
try {
Class<?> aClass = classLoader.loadClass("Example");
System.out.println("Class loaded: " + aClass.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}Main.Example динамически.Example не найден, выбрасывается исключение ClassNotFoundException.Можно создавать собственные Classloader, расширяя класс
java.lang.ClassLoader, например, для и классов из нестандартных источников (например, из базы данных, сети или зашифрованных архивов).import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
public class CustomClassLoader extends ClassLoader {
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
try {
byte[] bytes = loadClassData(name);
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
}
private byte[] loadClassData(String name) throws IOException {
String path = name.replace('.', '/') + ".class";
InputStream inputStream = Files.newInputStream(Paths.get(path));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int data;
while ((data = inputStream.read()) != -1) {
byteArrayOutputStream.write(data);
}
return byteArrayOutputStream.toByteArray();
}
}
ClassLoader и переопределяем метод findClass.loadClassData загружает данные класса из файла.defineClass создает класс из байтового массива.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1
1. Порождающие: Singleton, Factory Method, Abstract Factory, Builder, Prototype.
2. Структурные: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.
3. Поведенческие: Observer, Strategy, Command, State, Visitor, Mediator, Iterator, Chain of Responsibility, Interpreter, Memento.?
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java | Вопросы собесов
👾 1715 вопросов собесов на Java Developer
🔒 База реальных собесов
🔒 База тестовых заданий
👾 Список менторов
👩💻 Java
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Python
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Frontend
├ Вопросы собесов…
🔒 База реальных собесов
🔒 База тестовых заданий
👾 Список менторов
👩💻 Java
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Python
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Frontend
├ Вопросы собесов…
🔥23👍4
Java-программы управляется JVM, которая организует память в несколько областей. Эти области данных включают кучи, стеки и другие структуры, каждая из которых имеет свою специфическую роль в управлении памятью и выполнении программы.
Это область памяти, где размещаются все объекты и массивы, созданные динамически во время выполнения программы. Эта область управляется сборщиком мусора (Garbage Collector), который освобождает память, занятую объектами, которые больше не используются. Когда вы создаете объект с помощью ключевого слова
new, память для этого объекта выделяется в куче. Пример: Person person = new Person();Содержит структуру классов, включая данные о классах (метаданные), методах, полях, константах и статических переменных. Это аналогично метаспространству в современных реализациях JVM. Загрузка информации о классе, методах и константах происходит в методной области. Пример: Информация о классе
Person, его методах и полях будет храниться в методной области.Стек Java содержит фреймы методов, где каждый фрейм представляет собой вызов метода. В каждом фрейме хранятся локальные переменные, параметры метода, данные для возврата и временные значения. Каждый поток имеет свой собственный стек. Локальные переменные и параметры метода хранятся в стеке. Пример: При вызове метода
calculate() его локальные переменные и параметры будут размещены в фрейме стека.public class Example {
public static void main(String[] args) {
int x = 10;
int y = 20;
int result = add(x, y);
}
public static int add(int a, int b) {
return a + b;
}
}При вызове метода
main создается фрейм для этого метода в стеке, где x, y и result хранятся как локальные переменные. При вызове метода add создается новый фрейм в стеке для этого метода с параметрами a и b.Каждый поток имеет свой собственный программный счетчик (PC Register), который хранит адрес текущей исполняемой инструкции. Для каждого потока этот регистр указывает на следующую инструкцию, которая должна быть выполнена. Программный счетчик используется для управления потоком исполнения инструкций в программе. Пример: Если метод вызывает другой метод, программный счетчик обновляется, чтобы указывать на новую точку выполнения.
Этот стек используется для выполнения нативных (не на Java) методов, написанных на других языках, таких как C или C++. Каждый поток также имеет свой собственный стек нативных методов. Всякий раз, когда Java программа вызывает нативный метод, используется этот стек. Пример: Вызов метода из библиотеки, написанной на C, для выполнения специфической для платформы задачи.
Когда создается новый объект, память для него выделяется в куче. Когда метод вызывается, создается фрейм в стеке для хранения его локальных переменных и параметров. Методная область хранит информацию о классе, включая методы и их байт-код.
Объекты, которые больше не используются, идентифицируются и очищаются сборщиком мусора, освобождая память в куче. Методная область и стеки очищаются автоматически по завершении выполнения программы или потока.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🤯4❤1
- Singleton гарантирует, что класс имеет только один экземпляр в приложении и предоставляет глобальную точку доступа к этому экземпляру.
- Prototype позволяет создавать объекты, клонируя существующий объект, что позволяет избежать затрат на создание объектов стандартным способом (через new), особенно если это сложный процесс создания.?
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍9🤔2❤1