| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【Java八股40天-Day8】 JVM 整理总结 -> 正文阅读 |
|
[Java知识库]【Java八股40天-Day8】 JVM 整理总结 |
概述
Java程序经过Java编译器编译成字节码文件,通过类加载器加载到内存中(运行时数据区),然后通过执行引擎将字节码翻译成特定操作系统的指令集,并且这个过程会调用一些不同语言给Java提供的接口(本地库接口) Java运行时数据区
类加载过程
对象初始化顺序 对象实例化过程与内存布局思维导图:https://www.processon.com/view/link/61b0b5d27d9c082bff47392c
对象内存分配算法,那种好?指针碰撞算法:如果Java堆中内存是绝对规整的,所有使用过的内存都在堆的一边,未使用的在另一半,中间放一个指针作为分界点,然后来一个内存,指针就朝空闲区域移动和对象大小想等的距离。这种算法简单高效,但是必须保证采用的垃圾收集器带有空间压缩整理的能力,比如Serial,ParNew等带压缩整理过程的收集器。 空闲列表:如果Java堆内存并不规整,已被使用的内存和空闲内存相互交错在一起,JVM必须维护一个列表,记录哪块内存是可用的,在分配的时候找一快足够大的空间分给对象实例,并更新空闲列表上的记录。当使用CMS这种基于标记清除算法的收集器,理论上就只能采用较为复杂的空闲列表算法 对象在JVM中的内存布局对象在堆中存储布局包括三部分:对象头、实例数据、对齐补充
对象怎么分配逃逸分析: 如果一个对象在方法里面被定义,并且他可能被外部方法所引用(例如作为参数传到其他方法中)这种称为方法逃逸。还有可能线程逃逸,比如赋值给其他线程中能访问的实例变量。不逃逸、方法逃逸、线程逃逸是对象不同程度的逃逸 分配原则:
并发创建对象的安全性多线程对对象进行创建,可能出现正在给A分配内存,指针还没来得及修改,对象B由同时使用原来的指针来分配内存的情况。
垃圾回收机制
新对象往Eden区放,放不下就YGC,YGC还放不下就放Old,Old放不下就FGC,还放不下就报错了。 新建对象放Eden区,超过参数设置的对象直接放老年代。Eden区满了并且老年代剩余空间大于新生代中的对象就进行Minor GC 如果老年代剩余空间不大于新生代中的对象, 就看有没有开启空间分配担保,如果开启了就看剩余空间够不够历次MinorGC后剩余的对象大小,够就进行一次有风险的Minor GC, 失败了就Full GC。没开担保直接FullGC 垃圾回收算法引入计数法当一个对象被引用,对象的引用计数就加1,失去引用就减1,当值为0,就表示该对象不被引用,可以被垃圾收集器回收。 可达性分析可达性分析算法通过一系列堆外对象作为GCRoots, 从这些节点向下搜索,搜索过的路径称为引用链,当一个对象不能和GCRoots连接,就说明此对象不可达。不可达对象处于“缓刑阶段”,还需要两次标记过程来宣告一个对象的死亡 不可达对象第一次标记: 如果对象没有重写finalize方法,或已经执行过finalize方法,则该对象被回收。如果有必要执行 finalize 的方法 (重写了且没执行过),则对象放在F-Queue队列,并稍后由虚拟机建立的低优先级Finalizer线程触发该对象的finalize() 方法 不可达对象第二次标记: GC对 F-Queue 队列里的对象进行第二次标记,如果第二次标记时该对象有成功被引用了,则会被移除即将回收的集合。否则被回收 由于finalize()方法的存在,虚拟机中的对象一般处于三种可能状态:
Java程序如何运行的?Java源代码经过Java编译器编译成字节码文件后,通过类加载器加载到内存中,然后在JVM中解释执行,(JIT编译和解释执行配合),通过操作系统CPU执行获取结果 1.常用工具
2.CPU 占用过高如何诊断
3.永久代或元空间会发生垃圾回收吗?在JDK1.7,永久代是属于Java堆内存的,如果方法区满了,会触发Full GC 4.方法内的局部变量是否线程安全?
5.堆空间是分配对象存储的唯一选择吗?随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化 如果经过逃逸分析后发现,一个对象并有逃逸出去的方法的话,那么就可能被优化成栈上分配, 6.JVM堆内存溢出后,其他线程是否可以继续工作可以继续工作,堆内存要溢出的时候,该线程就会被释放。JVM会进行一次Major GC把该线程相关资源都回收掉,其他线程便可以继续工作。 7. 谈谈JVM的类加载器以及双亲委派模型怎么打破?
双亲委派机制: 为什么需要双亲委派机制: 如何打破双亲委派机制 8.三种垃圾算法原理及特点复制算法内存分为容量大小相等的两块,每次只用一块,然后回收的时候就把存活的对象复制到另一颗,然后这块全部清除掉 标记清除标记阶段:标记所有需要回收的对象 标记整理先执行标记清除,在将内存整理成连续的空间 9. 内存泄漏内存泄漏:程序运行过程中分配内存给临时变量,用完之后却没有被GC回收,始终占着内存 避免内存泄漏的几点建议:
10. 内存溢出?内存溢出是程序运行过程中申请的内存大于系统能提供的内存,导致无法申请到足够内存,发生内存溢出。
内存溢出解决方案:
JVM相关参数 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 15:35:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |