Java (JVM) 中垃圾收集的工作原理
来源:
DZone
Java中的垃圾收集过程
Java
垃圾收集会自动分配和释放内存,因此开发人员不必编写单独的程序来管理内存,这是使用 Java 编程的主要好处之一。每次 Java 程序在 JVM 上运行时,都会在堆上创建对象,并代表分配给程序的一部分内存。随着时间的推移,有些物品将不再需要。垃圾收集器找到这些未使用的对象并将其删除以释放内存。
垃圾收集器在评估内存堆后,将确定哪些对象正在使用,哪些没有,并删除未使用的对象。使用或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。如果一个对象不再使用或不再被引用,那么它将不再被程序的任何部分引用。因此,可以通过执行垃圾收集来释放未引用对象使用的内存。
释放内存可以通过三个主要过程来描述:
- 标记。
- 正常去除。
- 通过压实去除。
标记是识别垃圾收集器使用和未使用的内存部分的过程。贴标签通常是第一步。
正常删除是删除未引用的对象的过程,将引用的对象和指针保留在可用空间中。
压缩删除- 除了删除未引用的对象之外,它还会压缩剩余的引用对象,将对象移动到一起以使新的内存分配更加容易和更快。
JVM堆内存
年轻一代
新创建的对象从年轻代开始。它也被称为苗圃,因为新的物体开始在这里生存。年轻代分为伊甸园空间(所有新对象都在伊甸园空间中开始)和两个幸存者空间(其中对象在单个垃圾收集周期中存活后被移出伊甸园)。当年轻代垃圾收集器收集对象时,它们会导致重新垃圾收集。
Eden Space 所有新对象首先在 Eden Space 中创建。当达到 JVM 确定的阈值时,将触发次要垃圾回收。上述对象从 Eden 空间移动到第一个保存空间(“Eden”和“from”->“to”)。清除 Eden Space 时,未引用的对象将被删除。
幸存者 0 (S0) 和幸存者 1 (S1) 两个幸存者(从和到)字段都以空白开头。当垃圾回收再次发生时,所有引用的对象都将移至剩余空间。当垃圾收集完成时,幸存者“from”和“to”的位置(名称)将被交换。如果在之前的垃圾收集期间 S1 处于“to”角色,那么现在 S1 已满并成为“from”。相应地,如果S0为空,那么它将变成“to”。
老一辈
在次要垃圾回收之后,当过时的对象达到一定的年龄阈值(现代 JVM 的默认阈值设置为 15 个垃圾回收周期)时,它们与长寿命对象一起从年轻代移动到旧代。随着次要垃圾收集器的不断出现,对象继续移入老年代空间,它将开始填满,并且将发生主要垃圾收集。当老一代垃圾收集器收集对象时,就会发生基本垃圾收集。
永久发电
类和方法等元数据存储在永久代中。不再使用的类可以由垃圾收集器从中删除。在完整垃圾收集期间,所有代中未使用的对象都会被收集。
垃圾收集的类型
清理堆内各个部分的垃圾收集通常称为次要垃圾收集、主要垃圾收集和完整垃圾收集。但由于术语 Minor、Major 和 Full 被广泛使用而没有正确的定义,我们将看看所有这些类型的垃圾收集的解释。
小型垃圾收集
从年轻代空间收集垃圾称为次要垃圾收集。当 JVM 无法为新对象分配空间时,即 Eden 空间已满时,总是会触发这种类型的构建。因此,选择率越高,小型垃圾收集发生的频率就越高。
主要垃圾收集
主要垃圾收集清理 Tenured(旧空间)。由于老年代较大,因此组装的频率低于年轻代。当对象从老一代中消失时,我们说发生了“主要垃圾收集”。老一代收藏家会尝试预测何时需要开始收藏,以避免年轻一代的晋升失败。收集器监视老一代的填充阈值,并在超过该阈值时开始收集。如果这个门槛不足以满足促销要求,则启动“完全垃圾收集”。
完整的垃圾收集
全面的垃圾收集会清理整个垃圾堆——包括新的和旧的空间。许多人对Major(仅限旧代)和Full GC(Young + OLD(堆))感到困惑。Full Garbage Collection 包括在组装和压缩老年代后,将所有活着的对象从年轻代提升到老年代。一次完整的垃圾收集将成为 Stop-the-World 的终点站。它确保在收集器运行时不会分配新对象,并且对象不会变得不可用。
技术面试中有关 Spring 的 15 个重要问题
来源:
Dev.to Spring Framework 是 Java 平台的通用框架。任何 Java 应用程序都可以使用其核心功能,并且还有用于创建基于 Java EE 的 Web 应用程序的扩展。以下是与 Spring 编码相关的面试问题和答案列表。我们希望它们能帮助您准备 2021 年的技术面试。
1.什么是春天?
Ans:
Spring是一个用于开发Java应用程序的开源框架。Spring框架的核心功能可用于开发任何Java应用程序,并且还有用于创建基于Java EE平台的Web应用程序的扩展。Spring 框架旨在通过合并基于 POJO(普通旧 Java 对象)的模型,使 J2EE 更易于在开发中使用并改进编程实践。
2. Spring框架中bean的默认作用域是什么?
Ans:bean的默认作用域是
Singleton(设计模式)。
3.什么是Bean接线?
答:
Bean 连接是在 Spring 容器中的应用程序组件(bean)之间创建关联的行为。
4.什么是Spring Security?
Ans:Spring Security是Spring框架的一个独立模块,专注于为Java应用程序提供身份验证和授权方法。它还修复了最常见的安全漏洞,例如 CSRF 攻击。要在 Web 应用程序中使用 Spring Security,可以从一个简单的注释开始:@EnableWebSecurity。
5. bean 定义中包含什么?
答案:bean 定义包含称为配置元数据的信息,容器需要了解以下信息:
- 如何创建 bean;
- Bean 生命周期详细信息;
- 豆依赖性。
6.什么是Spring Boot?
Ans:Spring Boot 是一个项目,它提供了一组预配置的框架来减少样板配置,以便您可以使用最少的代码启动并运行 Spring 应用程序。
7.什么是DispatcherServlet以及它的用途是什么?
Ans:DispatcherServlet 是 Front Controller 设计模式的实现,用于处理 Spring MVC 应用程序的所有传入 Web 请求。前端控制器模式(企业应用程序设计模式)是 Web 应用程序中的常见模式,其工作是获取整个请求并将其路由到应用程序的各个组件进行实际处理。在 Spring MVC 中,DispatcherServlet 用于查找正确的控制器来处理请求。这是使用处理程序映射来完成的:例如,@RequestMapping 注释。
8. 类路径中是否需要 spring-mvc.jar 或者它是 spring-core 的一部分?
Ans:Spring-mvc.jar是spring-core的一部分,这意味着如果你想在你的Java项目中使用Spring MVC框架,那么你必须在你的应用程序的类路径中包含spring-mvc.jar。在Java Web应用程序中,spring-mvc.jar通常放置在/WEB-INF/lib文件夹中。
9、使用Spring有什么好处?
答:下面列出了使用 Spring 框架的一些好处:
- 轻量级——Spring 在尺寸和透明度方面相对轻量级。Spring框架的基本版本约为2MB。
- 控制反转 (IOC) - 使用控制反转技术在 Spring 中实现松散耦合。对象提供它们的依赖关系,而不是创建或搜索依赖对象。
- 面向方面——Spring支持面向方面的编程,并通过将应用程序业务逻辑与系统服务解耦来确保一致的开发。
- 容器- Spring 容器创建对象,将它们绑定在一起,配置它们,并管理它们从创建到处置的整个过程。
- MVC 框架- Spring Web 框架是一个设计良好的 MVC Web 框架,它提供了 Struts 等 Web 框架或其他过度设计或不太流行的 Web 框架的替代方案。
- 事务管理——Spring有一个一致的事务管理接口,可以扩展到本地事务(例如使用单个数据库)或全局事务(例如使用JTA)。
- 异常处理- Spring 提供了一个方便的 API,用于将特定于技术的异常(例如 JDBC、Hibernate 或 JDO 抛出的异常)转换为一致的、未经检查的异常。
10.什么是Spring bean?
Ans:Spring bean 是由 Spring 容器管理的对象的实例。它们由框架创建和连接,并放置在“对象包”(容器)中,您稍后可以从中检索它们。连线构成了依赖注入。这意味着您可以简单地说“我需要这个东西”,框架将遵循一定的规则来获取该对象。
11. 核心容器模块的用途是什么?
Ans:内核容器提供了Spring框架的核心功能。主容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用反转控制将配置和应用程序规范依赖项与实际应用程序代码分开。
12.什么是应用程序上下文?
答:乍一看,应用程序上下文和bean工厂是一样的。两者都加载 bean 定义,将 bean 捆绑在一起,并根据请求分发它们。但它还规定:
- 用于解析文本消息的工具,包括对国际化的支持。
- 加载文件资源的常用方式。
- 注册为侦听器的 Bean 的事件。
13. 如何将 Java Server Faces (JSF) 与 Spring 集成?
答:JSF 和 Spring 确实共享一些相同的功能,特别是在控制反转服务领域。通过在 faces-config.xml 配置文件中声明 JSF 托管 bean,您可以允许 FacesServlet 在启动时实例化该 bean。您的 JSF 页面可以访问这些 bean 及其所有属性。JSF 和 Spring 可以通过两种方式集成:
DelegatingVariableResolver:Spring 附带一个 JSF 变量解析器,允许您一起使用 JSF 和 Spring。DelegatingVariableResolver 首先将值的查找委托给底层 JSF 实现的默认解释器,然后委托给 Spring WebApplicationContext 的“业务上下文”。这使得将依赖项注入到 JSF 管理的 bean 中变得很容易。
FacesContextUtils:自定义 VariableResolver 在将其属性映射到 faces-config.xml 中的 beans 时效果很好。但如果您需要捕获 bean,FacesContextUtils 类可以让这件事变得简单。它与 WebApplicationContextUtils 类似,只是它接受 FacesContext 参数而不是 ServletContext 参数。
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext (FacesContext.getCurrentInstance ());
14.什么是Spring MVC框架?
答:
Spring Web MVC框架提供了模型-视图-控制器架构和预构建组件,可用于开发灵活且松散耦合的 Web 应用程序。MVC 模式导致应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)分离,同时允许这些元素之间的松散耦合。
15. Spring 中的事件处理是如何工作的?
答:
ApplicationContext中的处理是通过
ApplicationEvent类和
ApplicationListener接口提供的。也就是说,如果一个 bean 实现了
ApplicationListener,那么每次将
ApplicationEvent发布到
ApplicationContext时,都会注册该 bean。感谢您的阅读,祝您技术面试顺利!
GO TO FULL VERSION