JVM内存基础知识面试准备

java内存模型问题

1.说一下JVM内存逻辑结构?

答:jvm进程内存逻辑结构,有三种,堆,栈,还有本地内存;
栈区内有java栈,本地方法栈区和程序计数器,在堆里有堆和永久区,本地内存里是直接内存;
栈区里的 程序计数器 是当前线程执行的字节码行号指示器,(这个内存区域是唯一一个在java虚拟界规范中没有规定任何OutOfMemoryError的情况的区域)
**java栈:**存放着各种基本数据类型和对象的引用;
本地方法栈 是用来保存native方法信息的;
是用来存放所有new出来的对象
永生区 也叫方法区.用于存储已经被虚拟机加载的类信息,常量,静态变量等等数据
运行时常量池: 运行时常量池
是方法区的一部分,用于存放
编译期生成的各种常量和符号引用
直接内存: 如果使用了NIO(同步非阻塞IO)会被频繁使用.在java堆 内可以用directByteBuffer 对象直接引用并操作

2.jvm内存结构

jvm内存区域分为两种,分别是线程共享内存区和线程私有内存区,
属于共享内存区的是java堆和方法区,也就是java内存逻辑结构的堆,而线程私有内存区包含虚拟机栈,本地方法栈,程序计数器也就是java内存逻辑结构的栈
java堆和方法区以及处于多线程情况下的虚拟机栈,本地方法栈会抛出OutOfMemoryError
在单线程的虚拟机栈和本地方法栈会抛出stackOUtflowError;

3.堆和栈的区别是什么?

按功能来说,
栈是存放着各种基本数据类型和对象的引用;
而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量, 它们指向的对象都存储在堆内存中
按线程独享还是共享来说
栈内存属于线程独享
堆内存属于线程共享
按空间大小来说
栈的内存是远远小于堆的

4.线程安全的本质

由于对象都存储在堆内存中,线程工作内存是在栈内存里面,执行加载上使用赋值写入内存等操作,而堆属于线程共享区.当线程还在工作的时候,多线程情况下,有可能在没有写入更新到内存之前读取到之前的值;

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

jdk1.6时,运行时常量池是放在方法区中的,而在jdk1.7后,运行时常量池放在了堆里面,
而在jdk1.8后,方法区被移到本地内存,并改名为元空间了.

6.为什么去除方法区

因为方法区是用来存储类信息,常量,静态变量等数据,并不是一个很好的注意,容易遇到内存溢出的问题,而jdk8的实现中将类的元数据放入了本地内存,将字符串池和类的静态变量放入java堆中;
而且对方法区调优是极其困难的,同时,将元空间和堆的垃圾回收进行了隔离,避免了永生代引发的Full GC和OOM(Out Of Memory”)等问题;

常见内存溢出异常问题

1.有哪些java内存溢出异常?

主要有两个
一是OutOfMemeoryError
这是当堆,栈(多线程的情况下),方法区,元数据区,直接内存中的数据达到了最大容量时产生的
二是StackOverFlowError
这是如果线程请求的栈的深度大于虚拟机所允许的最大深度,
就会抛出StackOverFlowError,其本质还是数据达到了最大容量

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

产生的原因:
是因为堆是用来存储实例对象的,只要不断的创建实例,并且保存GC Roots到对象之间有引用的可达,避免垃圾回收实例对象,就会在对象数量达到堆的最大容量时产生堆溢出OutOfmemoryError溢异常
解决办法
可以使用方法+HeapDumpOnoutOfMemoryError让java虚拟机在出现内存溢出时产生当前堆内存快照以便进行异常的分析,
主要是分析那些独享占用了内存,也可以使用jmap将内存的快照到处来,
一般是检查哪些对象占用的空间比较大,由此判断代码问题
如果没有问题的话,就可以考虑调整堆的参数;

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

产生的原因:
如果线程请求的栈深度大于了虚拟机允许的最大深度,那么就会抛出StackOverFlowsError,
如果虚拟机在扩展栈时,无法申请到足够的内存空间,就会抛出OutOfMeoryError
解决办法
在jdk1.7之前,通过-XX:PermSize,-XX:MaxPermSize,调整方法区的大小
在jdk1.8之后,通过-XX:MetaspaceSize, -XX:MaxMetaspaceSize,调整元数据区的大小(space:死被死).

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

产生原因
最主要的是,直接本机内存溢出最大的特征是Heap Dump文件不会看到明显的异常,而程序中直接或者是间接的使用了(NIO)
解决办法
直接内存不受java堆大小限制,但受到本机总内存的限制,可以通过MaxDirectMemorySize来设置

发布了53 篇原创文章 · 获赞 42 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_42815122/article/details/85935690