| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> JVM探究(二):堆和垃圾回收,GC四种算法,JMM -> 正文阅读 |
|
[Java知识库]JVM探究(二):堆和垃圾回收,GC四种算法,JMM |
9 堆Heap, 一个JVM只有一个堆内存,堆内存大小可调节. 默认情况下:分配的总内存是电脑内存的1/4,初始化的内存:1/64 堆内存分为三个区域:
GC垃圾回收,主要是在伊甸园区(轻GC)和养老区(重GC).幸存0区和幸存1区是动态交换的,经过1次或者多次GC仍存活的对象,进入幸存区.超过次数阈值后,进入养老区,养老区内对象一般不会被回收.内存满了(OOM),堆内存不够,严重错误.99%的对象都是临时对象. 出现OOM: 1.尝试扩大堆内存空间,看结果 2.仍出错,分析内存
问:一个项目中,突然出现了OOM故障,那么该如何排除研究为什么出错
MAT,Jprofiler作用:
JDK8以后,永久存储区改为**(元空间)** 新生区:类诞生,成长的地方
老年区 永久区 此区域常驻内存.用来存放JDK自身携带的Class对象.interface元数据,存储的是java运行时的一些环境或类信息,此区域不存在垃圾回收,关闭VM就会释放这个区域的内存. 元空间在逻辑上存在,物理上不存在(实际年轻代+老年代的内存=堆内存大小) 永久区OOM:一个启动类,加载了大量的第三方jar包.Tomcat部署了太多的应用.大量动态生成的反射类.若这些东西不断被加载有可能OOM
10 垃圾回收GCGC作用域:只在堆和方法区 JVM在进行GC时,并不是对这三个区域统一回收.大部分时候,回收都是新生代
GC种类: 轻GC(普通的GC),重GC(全局GC) GC 题目:
引用计数法:给每个对象设置一个计数器,根据对象使用次数决定回收 复制算法(主要用于年轻代): 1.每次GC都会将Eden活的对象移到幸存区中:一旦Eden区被GC后,就会是空的! 2.幸存区,谁空谁是to.from和to会不停地切换. 3.当一个对象经历15次(默认)GC,还没有死,进入养老区(-XX:MaxTenuringThreshold = 10)设定进入老年代的时间
复制算法最佳使用场景:对象存活度较低的时候~新生区 大致过程:第一次GC后,Eden区和To区为空,Eden中存活对象进入To区,From区中对象复制进入To区,此时原本的From幸存区为空,置为To区,重复此过程.幸存区活过15次的对象进入养老区,没活过,死掉了. 标记清除算法:
标记压缩算法 再优化:再次扫描,向一端移动存活的对象,多了一个移动成本 标记清除压缩算法:先标记清除几次,再压缩 总结: 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记压缩>标记清除 内存利用率:标记压缩=标记清除>复制算法 没有最好的算法,只有最合适的算法----->GC:分代收集算法 年轻代:存活率低,复制算法 老年代:存活率高,区域大,标记清除(内存碎片不是太多)+标记压缩混合实现 11 JMM:Java Memomy Model学习新技术思路: 1 . 什么是JMM?(官方定义,百科) 2.它干嘛的?(官方;其他人的博客,对应的视频) 作用:缓存一致性协议,用于定义数据读写的规则(遵守,找到规则). JMM定义了线程工作内存和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每一个线程都有一个私有的本地内存(Local Memory) 解决共享对象可见性这个问题:volilate 3.如何学习? JMM:抽象的概念,理论(落到实际) 内存交互操作有8种,虚拟机实现必须保证每一个操作都是原子的,不可在分的(对于double和long类型的变量来说,load、store、read和write操作在某些平台上允许例外)
JMM对这八种指令的使用,制定了如下规则:
JMM对这八种操作规则和对volatile的一些特殊规则就能确定哪里操作是线程安全,哪些操作是线程不安全的了。但是这些规则实在复杂,很难在实践中直接分析。所以一般我们也不会通过上述规则进行分析。更多的时候,使用java的happen-before规则来进行分析。 程序员:学习新东西是常态面试学习:3/10通过,pass,总结成面经,分析这10个题,触类旁通类似的题(百度,牛客,面试题),通过大量面试总结,得出一套解题的思路(3-4道解题思路).了解问题的本质. |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 3:22:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |