jvm个人总结(面试使用)
https://mp.weixin.qq.com/s/iyk359KRwQiMjVrAnJMM8g
一。jvm运行时数据区域 https://www.geek-share.com/detail/2658900201.html
1.1.8之前
1.8版本结构
2.对于每个区域的解析:
线程私有的:
程序计数器:记录线程执行顺序,实现代码流程的控制。不存在内存溢出,随线程生而生,结束而结束。
java虚拟机栈:描述的是java方法执行的内存模型,每次方法调用的数据都是通过栈传递。内存是动态扩容的,所以有大小和深度限制。内存溢出问题。每个线程都有私有的栈,当线程结束return或者异常抛错,栈帧就会被弹出。
本地方法栈:类似java虚拟机栈,区别就是:虚拟机栈为虚拟机执行java方法服务,本地方法栈则为虚拟机使用到的native方法服务。
线程共享的:
堆:存放对象实例,对应有gc。一般采用分代回收法。设置参数调节分代区域和临界值
方法区:1.8之后移到直接内存中,存放的一般都是常量,类信息数据。需要设置大小,防止资源被耗尽。
常量池:存放final修饰的常量,文本字符串等;基本数据类型的值;String 的数据
二。new对象的jvm执行的逻辑
五个部分:类加载检查+分配内存+初始化零值+设置对象头+执行init方法
三。1.8对比之前版本优化的元空间
1.7:常量池和方法去在堆里,占据空间。gc时候处理常量池的永久代数据比较复杂
1.8:放在元空间中,存在本地内存中。扩大堆的空间。通过设置参数。
四。gc的方法
标记清除法:计数对象,用了加1没有0.最后处理没有的;产生和很多垃圾碎片
复制法:分两块空间,一块为空,一块为对象数据。然后复制情况,费内存
标记-整理法:才用前面的两种加起来;
分代法:根据对象生命周期:年轻带,老年代,永久带
五。优化方案
1.回收机制的设定
2.参数的调优,根据实际设置大小和回收的比例
3.线程池和连接池设定
六。优化参数
1.禁用system.gc 防止触发full gc。非常消耗系统性能 -xx:-DisableExplicitGC
2.关闭偏向锁:概念:一个把锁被使用之后不主动释放,保留给当前使用者。预判等下一个进程来获取的时候再释放出来。
关闭:-xx:-useBiasedLocking
3.将新对象预留在年轻代,让其利用利为90%
-xx:TargetSruvivorRatio = 90
4.让大对象进入老年代
-xx :PetenureSizeThreshold = 10000000 ,1m
大小为1m的对象为大对象
5.设置对象进入年老代
设置在新生代经过31次回收还存活的对象,转移到老年代中。默认值15;
6.稳定的java堆:XMX XMS设置相同:最小堆内存和最大堆内存一样,避免频繁想系统申请内存资源
7.设置合理的垃圾回收器,针对不同分代不同设置方案。
8.matespace 存放的class元数据耗尽内存,分配maxmetaSpaceSize大小
七:常用的工具:监控jvm 性能变化
jconsole jstack jps jstat
八。怎么判断对象已死
1.引用计数法,使用+1,失效-1.0时候就是没有了
2.可达性分析算法。gc roots作为对象起点,从这些节点开始向下搜索,刚没有引用链时就是这个对象没被使用了。主流用法
双亲委派机制描述 :某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载
- 设计模式个人总结(面试使用)
- 线程个人总结(面试使用)
- 一些框架杂乱个人总结01(面试使用)
- wpf中使用MVVM模式进行开发,View与ViewModule的交互个人总结
- JVM基础知识个人总结
- UNICODE编码细节与个人使用总结
- Android NDK 个人使用状况总结
- 阿里面试经历及总结(数据研发、Java研发方向)+个人经历
- 使用本地JConsole监控远程JVM(最权威的总结)
- UML学习个人总结——ROSE使用
- 使用git/github管理ios项目 个人总结
- Sublime Text 插件个人使用总结&推荐
- java事件监听器使用小结(个人总结,有错请指)
- 个人总结面试题目三
- jsp中c标签的使用个人总结
- 【Linux】Linux 个人面试题目总结
- 个人使用angular的一些小总结
- spring的aop用法个人使用总结
- 数组使用个人总结