面试-jvm虚拟机

java内存模型问题

jvm 进程内存逻辑结构

在这里插入图片描述

你对jvm内存结构了解吗?

在这里插入图片描述
程序计数器: 较小的内存空间, 当前线程执行的字节码的行号指 示器;各线程之间独立存储,互 不影响;
java栈: 线程私有,生命周期和 线程,每个方法在执行的同时都 会创建一个栈帧用于存储局部变 量表,操作数栈,动态链接,方 法出口等信息。方法的执行就对 应着栈帧在虚拟机栈中入栈和出 栈的过程;栈里面存放着各种基 本数据类型和对象的引用;
本地方法栈: 本地方法栈保存的 是native方法的信息,当一个 JVM创建的线程调用native方法 后,JVM不再为其在虚拟机栈中 创建栈帧,JVM只是简单地动态 链接并直接调用native方法;
堆: Java堆是Javaer需要重点 关注的一块区域,因为涉及到 内存的分配(new关键字,反射 等)与回收(回收算法,收集器 等);
方法区: 也叫永久区,用于存
储已经被虚拟机加载的类信息 ,常量(“zdy”,"123"等),静态变 量(static变量)等数据。
运行时常量池: 运行时常量池
是方法区的一部分,用于存放
编译期生成的各种字面量 (“zdy”,"123"等)和符号引用。
直接内存: 不是虚拟机运行 时数据区的一部分,也不是 java虚拟机规范中定义的内 存区域;
 如果使用了NIO,这块区域 会被频繁使用,在java堆 内可以用directByteBuffer 对象直接引用并操作;
 这块内存不受java堆大小限制,但受本机总内存的限制,可以通过 MaxDirectMemorySize来设置(默认与堆内存最大值一样)
所以也会出现 OOM异常

你对jvm内存结构了解吗?线程共享与线程私有

在这里插入图片描述

堆和栈的区别是什么?

 功能
 以栈帧的方式存储方法调用的过程,并存储方法调用过程中基本数据类型的变 量(int、short、long、byte、float、double、boolean、char等)以及对象的引 用变量,其内存分配在栈上,变量出了作用域就会自动释放;
 而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量, 它们指向的对象都存储在堆内存中
 线程独享还是共享
 栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其 所属线程中可见,即栈内存可以理解成线程的私有内存。
 堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。
 空间大小
 栈的内存要远远小于堆内存,栈的深度是有限制的,如果递归没有及时跳出,
很可能发生StackOverFlowError问题。
 你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小
,-Xmx选项可以设置堆的最大值

你对jvm内存结构了解吗?堆和栈

在这里插入图片描述

你对jvm内存结构了解吗?线程安全的本质

在这里插入图片描述

jdk1.6、jdk1.7和jdk1.8内存结构区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

jdk1.8的jvm 进程内存逻辑结构

在这里插入图片描述

为什么去除方法区

 永久代来存储类信息、常量、静态变量等数据不是个好主意, 很容易遇到内存
溢出的问题.JDK8的实现中将类的元数据放入 native memory, 将字符串池和类
的静态变量放入java堆中. 可以使用MaxMetaspaceSize对元数据区大小进行调
整;
 对永久代进行调优是很困难的,同时将元空间与堆的垃圾回收进行了隔离,避免
永久代引发的Full GC和OOM等问题;

jvm常用内存参数设置

在这里插入图片描述
注意: java8去掉了-XX:PermSize和-XX:MaxPermSize,新增了-XX:MetaspaceSize 和-XX:MaxMetaspaceSize

2.常见内存溢出异常问题

有哪些java内存溢出异常?

java内存溢出异常主要有两个:
 OutOfMemeoryError
当堆、栈(多线程情况)、方法区、元数据区、直接内
存中数据达到最大容量时产生;
 StackOverFlowError
如果线程请求的栈深度大于虚拟机锁允许的最大深度,
将抛出StackOverFlowError,其本质还是数据达到最大容量;

什么情况下出现堆溢出?怎么解决

 产生原因
堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有
引用的可达,避免垃圾收集器回收实例对象,就会在对象数量达到堆最大容量时
产生OutOfMemoryError异常。
java.lang.OutOfMemoryError: Java heap space
 解决办法
使用-XX:+HeapDumpOnOutOfMemoryError可以让java虚拟机在出现内存溢
出时产生当前堆内存快照以便进行异常分析,主要分析那些对象占用了内存;也
可使用jmap将内存快照导出;一般检查哪些对象占用空间比较大,由此判断代码
问题,没有问题的考虑调整堆参数;

什么情况下出现栈溢出?怎么解决?

 产生原因
 如果线程请求的栈深度大于虚拟机锁允许的最大深度,将抛出StackOverFlowError;
 如果虚拟机在扩展栈时无法申请到足够的内存空间,抛出OutOfMemeoryError;
 解决办法
 jdk 1.7之前,通过-XX:PermSize,-XX:MaxPerSize,调整方法区的大小;
 jdk 1.8以后,通过-XX:MetaspaceSize ,-XX:MaxMetaspaceSize,调整元数据
区的大小

什么情况下出现本机直接内存溢出?怎么解决?

 产生原因
jdk本身很少操作直接内存,而直接内存(DirectMemory)导致溢出最大的特征是,
Heap Dump文件不会看到明显异常,而程序中直接或者间接的用到了NIO
 解决办法
直接内存不受java堆大小限制,但受本机总内存的限制,可以通过
MaxDirectMemorySize来设置(默认与堆内存最大值一样)

jvm常用内存参数设置

在这里插入图片描述

内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值