JVM探究
- 谈谈你对JVM的理解?
- java8虚拟机和之前的变化更新
- 什么是OOM,
- 什么是StackOverFlowError 怎么分析
- JVM的常用调优参数有哪些
- 内部快照如何抓取 怎么分析Dump文件
- 谈谈JVM 类加载器你的认识 ?
1JVM位置
2JVM体系结构
3类加载器
加载class文件~
- 虚拟机自带的加载器
- 启动类(根)加载器
- 扩展类加载器
- 应用程序(系统类)加载器
- ==双亲委派机制 ==(百度)
- 沙箱安全机制
- Native:唬住面试官
- PC寄存器
- 方法区: static final Class 常量池
静态变量,常量,类信息(构造方法,接口定义)运行时的常量池存在方法区中,但是实际变量存在堆内存中,和方法区无关。
- 栈 数据结构
栈先进后出
队列先进先出
为什么main()先执行 最后结束
栈:栈内存 主管程序的运行 生命周期和线程同步
线程结束 栈内存也就释放了 对于栈来说 不存在垃圾回收问题
一旦线程结束 栈就OVER
栈:8大基本类型+对象引用+实例的方法
栈运行原理:栈帧
栈满了:StackOverFlow
栈+堆+方法区:交互关系
三种JVM
- Sun 公司 Hotspot Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)
- BEA jRockit
- IBM j9 VM
堆
Heap 一个JVM只有一个堆内存 堆的内存的大小是可以调节的。
类加载器读取了类文件后 一般会把什么东西放到堆中 ? 类方法常量 变量 保存我们所引用类型的真是对象;
堆内存中还要细分为三个区域:
- 新生区 YOUNG/NEW
- 养老区
- 永久区 PERM
GC垃圾回收主要在伊甸园区和养老区
假设内存满了,OOM,堆内存不够 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
在JDK8以后,永久存储区改了个名字(元空间);
新生区
- 类:诞生和成长的地方,甚至死亡;
- 伊甸园区,所有的对象都是在伊甸园区new出来的
- 幸存者区(0,1)
老年区
真理:经过研究 有百分之99对象都是临时对象!(OOM错误) OutOfMemory
永久区
这个区域是常驻内存的,用来存放JDK自身携带的CLASS对象,Interace元数据,存储的是java运行时的一些环境或类信息,
这个区域不存在垃圾回收!关闭VM虚拟机就会释放这个区域的内存
一个启动类 加载了大量的第三方jar包,tomcat部署了太多的应用,大量动态生成的反射类,不断的被加载,直到内存满
就会出现OOM;
- jdk1.6之前:永久代,常量池是在方法区
- jdk1.7:永久代,但是慢慢的退化了,去永久化,常量池在堆中
- jdk1.8之后:无永久代,常量池在元空间
元空间: 逻辑上存在: 物理上不存在(算出来的)
在一个项目中 突然出现了OOM故障 那么该如何排除 研究为什么出错
- 能够看到代码第几行出错:内存快照分析工具 MAT Jprofiler
- debug 一行行分析代码
MAT Jprofiler 作用;
- 分析Dump内存文件 快速定位内存泄露
- 获得堆中的数据
- 获得大的对象
GC垃圾回收机制
JVM 在进行GC时 并不是对这三个区域统一回收 大部分时候 回收都是新生代
- 新生代
- 幸存区(from ,to)
- 老年区
GC两种类:轻GC(普通的GC)重GC(全局GC)
题目:
- JVM的内存模型和分区 详细到每个区放什么
- 堆里面的分区有哪些?EDEN FROM TO 老年区说说他们的特点
- GC的算法有哪些? 标记消除法 标记压缩 复制算法 引用计数器,怎么用的?
- 轻GC 和重GC 分别在什么时候发生?
引用计数法:
复制算法
- 好处: 没有内存的碎片
- 坏处:浪费了内存空间:多了一半空间永远是空的to 假设对象百分之100存活(极端情况)
复制算法最佳使用场景:对象存活度较低的时候:新生代
标记清除算法
- 缺点:两次扫描严重浪费时间,会产生内存碎片。
- 优点:不需要额外的空间!
标记压缩
标记清除压缩
先标记清除几次
再压缩
总结
内存效率:复制算法> 标记清除算法 >标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
有没有更优的算法呢?
答案:没有最好的算法,只有最合适的--->GC:分代收集算法
年轻代:
- 存活率低
- 复制算法
老年代
- 区域大:存活率
- 标记清除(内存碎片不是太多)+标记压缩混合 实现
一天学习JVM不现实要深究,花时间,多看面试题,以及《深入理解JVM》
掌握学习JVM方法
JMM(Java Memory Model)
1.什么是JMM
JAVA MEMORY MODEL缩写
2.他它是干嘛的
作用:缓存一致性协议,用于定义数据读写的规则(遵守,找到这个规则)
JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MAIN MEMORY)中,每个线程都有一个私有的本地内存(LOCAL MEMORY)
解决共享对象可见性这个问题:violate
3.如何学习
JMM:抽象概念,理论
JMM对这八种指令的使用,制定了如下规则:
- 不允许read和load、store 和write操作之一单独出现, 即不允许一个变量从主内存读取了但工作内存不接受,或者工作内存发起回写了但主内存不接受的情况出现。
- 不允许一个线程丢弃它最近的assign操作,即变量在工作内存中改变了之后必须把该变化同步回主内存。
- 不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的工作内存同步回主内存中。
- 一个新的变量只能在主内存中“诞生”,不允许在工作内存中直接使用一个未被初始化( load或assign)的变量,换句话说就是对一个变量实施use、store 操作之前,必须先执行assign和load操作。
- 一个变量在同一个时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次, 多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁。
- 如果对一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作以初始化变量的值。
- 如果一个变量事先没有被lock操作锁定,那就不允许对它执行unlock操作,也不允许去unlock-一个被其他线程锁定的变量。
- 对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store、write操作)。
- 对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store、write操作)。
学习新东西是常态:
- netty
- Spring Cloud Alibaba
面试:
3/10==pass 面经=10 分析这10个题,触类旁通? 百度面试题
通过大量的面试总结,得出一套解题思路?3~4。
堆内存调优
GC
单点登录 ~|SSO
标签:变量,算法,简易,探究,GC,内存,JVM,线程 来源: https://blog.csdn.net/mayaohao/article/details/116840460
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。