0
点赞
收藏
分享

微信扫一扫

八股文之九jvm

有点d伤 2022-02-19 阅读 72

n个多核cpu以及他的三级缓存和主内存的交互,有一个缓存一致性的协议在里面,cpu在读取主内存对象的时候,若对象被锁住了,则做个监听然后继续去做其他事情,这个行为就是指令重排序。单线程保证重排序后的结果相同

可见性 :当线程栈变化后主动刷新主内存
原子性
有序性

jvm栈:局部变量区 操作数栈方法的返回地址 动态链接》》》栈桢在递归中无限引用就会栈溢出
native栈系统接口 程序计数器 运行到哪一步
堆对象的数据位 方法区 (元空间代替了永久代 静态变量 类加载器

高潮算法:
1.标记清理,引发碎片
2.标记整理,代价太大 所有对象的内存移动
3.复制算法 2*内存

young区采用复制算法,对象赵申息斯,交替存储
老年代 存活15次后进入老年代;大对象 满了后full gc 引起程序全部暂停使用标记清理算法

垃圾收集器:
1.young parnew 2.old cmg 3新的jdkg1

JVM调优工具

(1)调优可以依赖、参考的数据有系统运行日志、堆栈错误信息、gc日志、线程快照、堆转储快照等。

①系统运行日志:系统运行日志就是在程序代码中打印出的日志,描述了代码级别的系统运行轨迹(执行的方法、入参、返回值等),一般系统出现问题,系统运行日志是首先要查看的日志。

②堆栈错误信息:当系统出现异常后,可以根据堆栈信息初步定位问题所在,比如根据“java.lang.OutOfMemoryError: Java heap space”可以判断是堆内存溢出;根据“java.lang.StackOverflowError”可以判断是栈溢出;根据“java.lang.OutOfMemoryError: PermGen space”可以判断是方法区溢出等。

③GC日志:程序启动时用 -XX:+PrintGCDetails 和 -Xloggc:/data/jvm/gc.log 可以在程序运行时把gc的详细过程记录下来,或者直接配置“-verbose:gc”参数把gc日志打印到控制台,通过记录的gc日志可以分析每块内存区域gc的频率、时间等,从而发现问题,进行有针对性的优化。

避免创建过大的对象及数组:过大的对象或数组在新生代没有足够空间容纳时会直接进入老年代,如果是短命的大对象,会提前出发Full GC。

避免同时加载大量数据,如一次从数据库中取出大量数据,或者一次从Excel中读取大量记录,可以分批读取,用完尽快清空引用。

当集合中有对象的引用,这些对象使用完之后要尽快把集合中的引用清空,这些无用对象尽快回收避免进入老年代。

可以在合适的场景(如实现缓存)采用软引用、弱引用,比如用软引用来为ObjectA分配实例:SoftReference objectA=new SoftReference(); 在发生内存溢出前,会将objectA列入回收范围进行二次回收,如果这次回收还没有足够内存,才会抛出内存溢出的异常。
避免产生死循环,产生死循环后,循环体内可能重复产生大量实例,导致内存空间被迅速占满。

尽量避免长时间等待外部资源(数据库、网络、设备资源等)的情况,缩小对象的生命周期,避免进入老年代,如果不能及时返回结果可以适当采用异步处理的方式等。

举报

相关推荐

八股文之mybatis

八股文总结

【八股文】小米

前端八股文

Spring八股文

Java八股文

0 条评论