1.常见的几种OOM?

①java.lang.StackOverflowError②java.lang.OutOfMemoryError:Java heap space③java.lang.OutOfMemoryError:GC overhead limit exceeded④java.lang.OutOfMemoryError:Direct buffer memory⑤java.lang.OutOfMemoryError:unable to create new native thread⑥java.lang.OutOfMemoryError:Metaspace

/*** 描述:GC overhead Limit* jvm参数配置演示:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+MaxDirectMemorySize=5m* GC回收时间过长会抛出OutOfMemroyError,过长的定义是,超过98%的时间来做GC并且只回收了不到2%的堆内存* 连续多次GC都只是回收了不到2%的极端情况下才会抛出,假如不抛出GC Overhead limit错误会发生什么呢?* CPU使用率一直是100%,而GC没有任何成功** @author xinjiao.yu@marketin.cn* @create 2020/2/24 21:41* @since 2.16.3*/
public class GCOverheadDemo {public static void main(String[] args) {int i=0;List<String> list = new ArrayList<>();try{while(true){list.add(String.valueOf(++i).intern());}}catch (Exception e){System.out.println("**************i:"+i);e.printStackTrace();throw e;}}
}
/*** 描述: 配置参数:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m* 故障现象:Exception in thread "main" java.lang.OutOfMemroyError:Direct buffer memory* 导致原因:* 写NIO程序经常使用ByteBuffer来读取或者写入数据,这是一种基于通道channel和缓冲区buffer的I/O方式,* 他可以使用natice函数库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作* 这样能在一些场景中显著提高性能,因为避免了在java堆和native堆中来回复制数据** ByteBuffer.allocate(capability)第一种方式是分配JVM内存,属于GC管辖范围,由于需要拷贝所以速度相对慢* ByteBuffer.allocateDirect(capability)第2中方式是分配OS本地内存,不属于GC管辖范围,不需要拷贝所以速度快* 但如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象就不会回收,这时候堆内存充足,但本地内存已经用光了* 再次尝试分配本地内存会出现OutOfMemoryError,那么程序直接崩溃** @author xinjiao.yu@marketin.cn* @create 2020/2/24 22:00* @since 2.16.3*/
public class DirectBufferMemoryDemo {public static void main(String[] args) {
//        System.out.println("配置的maxDirectMemory:"+(sun.misc.VM.maxDirectMemory()/(double)1024/1024)+"MB");ByteBuffer bb = ByteBuffer.allocateDirect(6*1024*1024);}
}
/*** 描述:* JVM参数:-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m* java8以后使用metaspace来替代永久代* metaspace是方法区在hotspot中的实现,他与持久代最大的区别在于:metaspace并不在虚拟机内存中而是使用本地内存* 即在java8中,class metadata被存储在metaspace的native memeory* 永久代(java8后被元空间metaspace取代了)存放一下信息:* 虚拟机加载的类信息* 常量池* 静态变量* 即使编译后的代码** @author xinjiao.yu@marketin.cn* @create 2020/2/25 13:33* @since 2.16.3*/
public class MetaspaceOOMDemo {class OOMTest{}public static void main(String[] args) {int i = 0;while(true){i++;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(OOMTest.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {return methodProxy.invokeSuper(o,args);}});}}
}

2.四大垃圾回收方式:

①串行垃圾回收器(Serial)他为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,不适合生产环境②并行垃圾回收器(Parallel)多个垃圾收集线程并行工作,此时用户线程是暂停的,③并发垃圾回收器(CMS)用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行)不需要停顿用户线程,互联网公司多用他,适用对响应时间有要求的场景。④G1垃圾回收器,将堆内存分割成不同的区域然后并发的对其进行垃圾回收。

3.G1垃圾收集器:

.G1垃圾收集器是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求,另外还具有以下特性:①像CMS收集器一样,能与应用程序线程并发执行②整理空闲时间更快③需要更多的时间来预测GC停顿时间④不希望牺牲大量的吞吐量⑤不需要更大的Java Heap,他同CMS相比在以下方面表现的更出色:①G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片②G1的Stop Thr World(STW)更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿时间。G1主要改变是Eden,Survivor,Tenured等内存区域不在是连续的,而是变成了一个个大小一样的region,每个region从1m到32m不等,一个region有可能属于Eden,Survivor,Tenured内存区域。

4.G1垃圾收集器特点:

①G1能充分利用CPU,多核环境硬件优势,尽量缩短STW②G1整体上采用标记-整理算法,局部是通过复制算法,不会产生内存碎片③宏观上看G1之中不在区分年轻代和老年代,吧内存划分成多个独立的子区域④G1收集器里面将整个内存区域都混合在一起了,但其本身依然在小范围内要进行年轻代和老年代的区分,保留了新生代和老年代,但不再是物理隔离,而是一部分region的集合且不需要region是连续的⑤G1虽然是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor堆做复制准备,G1只有逻辑上的分代概念,每个分区都可能随G1的运行在不同代之间前后切换。

5.liunx命令:

①top,uptime系统性能命令的精简版②mpstat -P ALL 2查看所有CPU信息③pidstat -u 1 -p 进程号:每个进程使用cpu的用量分解信息③free应用程序可用内存数④内存查看额外:pidstat -p 进程号 -r 采样间隔秒数⑤df -h查看磁盘剩余空间数⑥iostat -xdk 2 3:磁盘IO性能评估⑦pidstat -d 采样间隔时间 -p 进程号:查看磁盘IO

6.假如生成环境出现cpu占用过高,请你谈谈你的分析思路和定位?

①先用top命令找出cpu占比最高的②ps -ef或者jps进一步定位,得知怎么样一个后台程序惹的事③定位到具体线程或者代码:ps -mp 进程 -o THREAD,tid,time,参数解释-m显示所有的线程-p pid进程使用cpu的时间,-o 改参数后是用户自定义格式④将需要的线程id转换成16进制格式(英文小写格式)⑤jstack 进程id | grep tid(16进制线程id小写英文) -A60

7.github搜索命令:①搜索关键字在项目名,描述,readme中:xxx关键词 in:name,readme,descripte②搜索点赞数在某个范围:xxx关键词 stars:>=5000③查询forks数大于300的xxx关键词 forks:>500④xxx关键词 forks:200..400 starts:1000..2000查询关键词点赞数在1000到两千⑤awesome xxx关键词:一般是用来收集学习,工具,书籍类的项目⑥高亮显示一行:地址后面紧跟#L行号⑦高亮显示多行:地址后面紧跟#L开始行号-L结束行号⑧嗖某个地区活跃的大佬:location:beijing language:java

OOM以及垃圾收集器相关推荐

  1. 七种垃圾收集器和垃圾回收、分代收集、GCROOTS相关概念、GC如何判断一个对象可以被回收

    文章目录 垃圾收集器概述 垃圾回收算法 1)标记-清除算法(Mark-Sweep)(DVM 使用的算法) 2)复制算法(Copying) 3)标记-整理算法(Mark-Compact) 4)分代收集( ...

  2. Java常见GC算法_垃圾收集器及内存分配_G1垃圾收集器

    常见GC算法 引用计数法: 每个对象都有一个计数器, 对象被引用一次, 计数器+1, 当对象引用失败一次. 计数器-1, 当对象计数器等于0, 说明对象没有被应用, 就可GC 优: 运行过程中, 可随 ...

  3. JVM内存管理:深入垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  4. 【转】JVM内存管理:深入垃圾收集器与内存分配策略

    2019独角兽企业重金招聘Python工程师标准>>> Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收 ...

  5. JVM面试(四)-垃圾回收、垃圾收集器、GC日志

    垃圾回收.垃圾收集器.GC日志 什么是垃圾?(垃圾的概念) 什么是垃圾回收?(垃圾回收的概念) 为什么要垃圾回收?(垃圾回收的原因) 如何定义垃圾? 引用计数算法 什么是循环引用 可达性分析算法 哪些 ...

  6. 垃圾收集器以及三色标记

    分代收集理论 当前虚拟机的垃圾收集采用分代收集算法,只是根据对象存活周期的不同将内存分为几块. 一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法 新生代:每次 ...

  7. JVM面试题整理-Java内存区域与内存溢出异常、垃圾收集器和内存分配策略

    参考: https://blog.csdn.net/zd836614437/article/details/64126826 https://blog.csdn.net/u011225629/arti ...

  8. Java——七种垃圾收集器+JDK11最新ZGC

    JDK1.8之前的堆内存示意图: 从上图可以看出堆内存的分为新生代.老年代和永久代.新生代又被进一步分为:Eden 区+Survior1 区+Survior2 区.值得注意的是,在 JDK 1.8中移 ...

  9. JVM垃圾收集—垃圾收集器及常见组合参数

    链接: JVM垃圾收集-垃圾收集算法 上一篇介绍了垃圾收集算法及分区,这篇我们来学习垃圾收集器 文章目录 Serial ParNew Parallel Scavenge Serial Old Para ...

最新文章

  1. Windows Mobile 5.0 设备的目录变化
  2. WinCE 7 Mouse HOOK
  3. 数组中存储不定个数的元素
  4. Mobileye采用单目摄像头做ADAS太不精确
  5. 【Android 逆向】逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )
  6. STM32开发 -- VS2017错误
  7. 一个墙纸还可以改变使用裁剪工具改变图像
  8. 单片机中断机制对日常生活的启示_单片机原理部分课后习题解
  9. python3和php7哪个好_性能是Flask的3倍!比PHP7还快!这个Python框架你值得拥有!
  10. 动态规划入门(一)——数字三角形
  11. FTP:226 transfer done but failed to open directory
  12. 免费盈利模式是骗人的吗?
  13. 为什么把持久化放到Domain Object是不OO的.
  14. 软件项目经理新手上路16 - 后记,一切才刚刚开始
  15. java day06【类与对象、封装、构造方法】
  16. 音视频编解码标准简介
  17. “网红蜥蜴”背后的创业路,他潜心于宠物蜥蜴的研发与产业化_汇新云
  18. Seismic Unix安装
  19. python微信抢红包神器_Python自动抢红包教程详解
  20. MMDetection3D 1.1:统一易用的 3D 感知平台

热门文章

  1. Vim与Python真乃天作之和
  2. visio电路图怎么连线_还在用visio画电路图?不看后悔!
  3. 剑灵各大区服务器地图位置,剑灵各地图区域 时装获取详细方法总汇
  4. 绝佳表现电商各类促销活动插画素材|玩转大促购物节
  5. 物联网浪潮之下,前端工程师如何迎刃而上?
  6. Centos7配置Hadoop出现Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)的解决
  7. oracle19数据库对内存要求,在天堂 - 技术老男
  8. Ubuntu18.04编译c语言程序
  9. 爬虫项目:获取movie
  10. 小白如何学习运营公众号?