怎么切页面做网站,网络推广策划案范文5篇,wex5 wordpress,电商数据查询平台1.JVM的内存结构#xff1f; 2.OOM是什么#xff0c;怎么排查#xff1f; 3.请解释四种引用是什么意思有什么区别#xff1f; 4.GC的回收算法有哪些#xff1f; 5.怎么判断对象是否存活#xff1f;
1.什么是JVM内存结构
jvm将虚拟机分为5大区域#xff0c;程序计数器、…1.JVM的内存结构 2.OOM是什么怎么排查 3.请解释四种引用是什么意思有什么区别 4.GC的回收算法有哪些 5.怎么判断对象是否存活
1.什么是JVM内存结构
jvm将虚拟机分为5大区域程序计数器、虚拟机栈、本地方法栈、java堆、方法区
2什么是JVM内存模型
1.Java 内存模型就是在底层处理器内存模型的基础上定义自己的多线程语义。它明确指定了一组排序规则Happens-Before来保证线程间的可见性。
JMM 规定要想保证 B 操作能够看到 A 操作的结果无论它们是否在同一个线程那么 A 和 B 之间必须满足 Happens-Before 关系
happens-before 也是为了保证可见性比如说加锁和解锁的动作线程1释放锁退出同步块线程2加锁进入同步块那么线程2就能看见线程1对共享对象修改的结果。
Java 提供了几种语言结构包括 volatile, final 和 synchronized, 它们旨在帮助程序员向编译器描述程序的并发要求其中
volatile - 保证可见性和有序性synchronized - 保证可见性和有序性; 通过管程Monitor保证一组动作的原子性final - 通过禁止在构造函数初始化和给 final 字段赋值这两个动作的重排序保证可见性如果 this 引用逃逸就不好说可见性了
编译器在遇到这些关键字时会插入相应的内存屏障保证语义的正确性。
有一点需要注意的是synchronized 不保证同步块内的代码禁止重排序因为它通过锁保证同一时刻只有一个线程访问同步块或临界区也就是说同步块的代码只需满足 as-if-serial 语义 - 只要单线程的执行结果不改变可以进行重排序。
所以说Java 内存模型描述的是多线程对共享内存修改后彼此之间的可见性另外还确保正确同步的 Java 代码可以在不同体系结构的处理器上正确运行。
3.什么情况下会发生栈内存溢出
当线程请求的栈深度超过了虚拟机允许的最大深度时会抛出StackOverFlowError异常
方法递归调用肯可能会出现该问题
解决方案
调整参数-xss去调整jvm栈的大小4.谈谈对 OOM 的认识如何排查 OOM 的问题
OOM全称“Out Of Memory”内存溢出通俗理解就是内存不够啦。
为什么会OOM 服务的正常运行需要的内存过多而JVM设置的内存过小导致服务跑不起来或者运行一段时间后挂掉。 GC回收内存的速度赶不上程序运行消耗内存的速度。一般是大对象、大数组导致。 内存泄漏问题长期内存泄会导致内存溢出。比如打开文件不释放、创建链接不释放、大量不再使用的对象但未断开引用关系等。 **内存泄漏**是指程序在申请内存后无法释放已申请的内存空间一次内存泄漏似乎不会有大的影响但内存泄漏堆积后的后果就是内存溢出。 **内存溢出**指程序申请内存时没有足够的内存供申请者使用。
哪里会OOM
JVM运行时数据区五个区域中程序计数器、虚拟机栈、本地方法栈、堆、方法区/元空间除了程序计数器不会发生OOM其他所有区域都有可能。
除了以外还有直接内存也会发生OOM。
直接内存直接内存虽然不是虚拟机运行时数据区的一部分但既然是内存就会受到物理内存的限制。
如何排查OOM 排查 OOM 的方法
增加两个参数 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/heapdump.hprof当 OOM 发生时自动 dump 堆内存信息到指定目录同时 jstat 查看监控 JVM 的内存和 GC 情况先观察问题大概出在什么区域使用 MAT 工具载入到 dump 文件分析大对象的占用情况比如 HashMap 做缓存未清理时间长了就会内存溢出可以把改为弱引用 。
5.请解释四种引用是什么意思有什么区别
强引用就是普通的对象引用关系如 String s new String(“ConstXiong”)软引用用于维护一些可有可无的对象。只有在内存不足时系统则会回收软引用对象如果回收了软引用对象之后仍然没有足够的内存才会抛出内存溢出异常。SoftReference 实现弱引用相比软引用来说要更加无用一些它拥有更短的生命周期当 JVM 进行垃圾回收时无论内存是否充足都会回收被弱引用关联的对象。WeakReference 实现虚引用是一种形同虚设的引用在现实场景中用的不是很多它主要用来跟踪对象被垃圾回收的活动。PhantomReference 实现
6.GC的回收算法有哪些
java中有四种垃圾回收算法分别是标记清除法、标记整理法、复制算法、分代收集算法 标记清除法 第一步利用可达性去遍历内存把存活对象和垃圾对象进行标记 第二步再遍历一遍将所有标记的对象回收掉 特点效率不行标记和清除的效率都不高标记和清除后会产生大量的不连续的空间分片可能会导致之后程序运行的时候需分配大对象而找不到连续分片而不得不触发一次GC a.标记Collector 从引用根节点开始遍历标记所有被引用的对象一般是在对象的Header 中记录为可达对象。
b、清除Collector 对堆内存从头到尾进行线性的遍历如果发现某个对象在其Header中没有标记为可达对象则将其回收。 标记整理法 第一步利用可达性去遍历内存把存活对象和垃圾对象进行标记 第二步将所有的存活的对象向一段移动将端边界以外的对象都回收掉 特点适用于存活对象多垃圾少的情况需要整理的过程无空间碎片产生 复制算法 将内存按照容量大小分为大小相等的两块每次只使用一块当一块使用完了就将还存活的对象移到另一块上然后在把使用过的内存空间移除 特点不会产生空间碎片内存使用率极低
分代收集算法 根据内存对象的存活周期不同将内存划分成几块java虚拟机一般将内存分成新生代和老生代在新生代中有大量对象死去和少量对象存活所以采用复制算法只需要付出少量存活对象的复制成本就可以完成收集老年代中因为对象的存活率极高没有额外的空间对他进行分配担保所以采用标记清理或者标记整理算法进行回收