您的位置:首页 > 职场人生

jvm个人总结(面试使用)

2019-06-11 22:36 585 查看

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作为对象起点,从这些节点开始向下搜索,刚没有引用链时就是这个对象没被使用了。主流用法

双亲委派机制描述 :某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载

https://mp.weixin.qq.com/s/iyk359KRwQiMjVrAnJMM8g

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: