金三银四面试题(九):JVM常见面试题(3)

2024-04-01 03:12

本文主要是介绍金三银四面试题(九):JVM常见面试题(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天我们继续探讨常见的JVM面试题。这些问题不比之前的问题庞大,多用于面试中JVM部分的热身运动,开胃菜,但是大家已经要认真准备。

你能保证GC 执行吗?

不能,虽然你可以调用System.gc() 或者Runtime.gc(),但是没有办法保证GC
的执行。

怎么获取Java 程序的内存详情?

可以通过java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及
最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。

  • Runtime.freeMemory() 方法返回剩余空间的字节数,
  • Runtime.totalMemory()
    方法总内存的字节数,
  • Runtime.maxMemory() 返回最大内存的字节数

什么是指针碰撞?

一般情况下,JVM 的对象都放在堆内存中(发生逃逸分析除外)。当类加载检查通过后,Java 虚
拟机开始为新生对象分配内存。如果Java 堆中内存是绝对规整的,所有被使用过的内存都被放
到一边,空闲的内存放到另外一边,中间放着一个指针作为分界点的指示器,所分配内存仅仅是
把那个指针向空闲空间方向挪动一段与对象大小相等的实例,这种分配方式就是指针碰撞。

stop the world,oopMap以及安全点

进行垃圾回收的过程中,会涉及对象的移动。为了保证对象引用更新的正确性,必须暂停所有的
用户线程,像这样的停顿,虚拟机设计者形象描述为「stop the world」。也简称为STW。

在HotSpot 中,有个数据结构(映射表)称为「oopMap」。一旦类加载动作完成的时候,
HotSpot 就会把对象内什么偏移量上是什么类型的数据计算出来,记录到OopMap。在即时编译
过程中,也会在「特定的位置」生成OopMap ,记录下栈上和寄存器里哪些位置是引用。

这些特定的位置主要在:

  • 1.循环的末尾(非counted 循环)
  • 2.方法临返回前/ 调用方法的call 指令后
  • 3.可能抛异常的位置
    这些位置就叫作「安全点」用户程序执行时并非在代码指令流的任意位置都能
    够停顿下来开始垃圾收集,而是必须是执行到安全点才能够暂停。

说说对象创建过程

  • 1.JVM 遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲)
  • 2.为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲
    分配(TLAB)”
  • 3.将除对象头外的对象内存空间初始化为0
  • 4.对对象头进行必要设置

在这里插入图片描述

这篇关于金三银四面试题(九):JVM常见面试题(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/866071

相关文章

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶