- 博客(8)
- 收藏
- 关注
原创 面试必问的JVM垃圾回收(三)-G1垃圾收集器
G1垃圾收集器简介G1垃圾收集器偏向于多处理器运行,满足stw时间短的同时实现高吞吐量。其特点包括:堆大小高达数十GB或更大,其中超过50%的Java堆占用实时数据。 对象分配和升级的速率可能会随时间而显着变化。 堆中有大量碎片。 预测的stw不超过几百毫秒,避免了长时间的垃圾收集暂停。G1在应用程序运行的同时执行其部分工作,尽管使用G1收集器的垃圾收集暂停通常很短,但应用程序吞吐量也往往会略微降低。G1是默认收集器。启用G1可以通过-XX:+UseG1GC在命令行上提供显.
2021-01-19 14:48:29
1396
1
原创 面试必问的JVM垃圾回收(二)
一、分代垃圾收集器:二、常见垃圾回收算法:1. 标记-清除算法 标记-清除算法从根集合GC Roots出发,关于GC ROOTS可以参照作者上一篇文章,沿引用链进行扫描,对存活的对象进行标记,标记完毕后,扫描整个空间中未被标记的对象进行回收.标记-清除算法不需要进行对象的移动,只需要处理已经死亡的对象,在存活对象比较多的情况下极为高效,但由于标记-清除算法直接回收不存活的对象,因此会造成内存碎片,内存碎片过多可能会导致更快的一次垃圾回收,比如需要分配大对象的时候.2.复制算法 复
2021-01-11 13:08:58
166
1
原创 面试必问的JVM垃圾回收(一)
什么是垃圾回收?引用的对象称为活动对象,不再被引用的对象将被视为死对象,被称为垃圾。找到并释放(也称为回收)这些对象所使用的空间的过程被称为垃圾收集。垃圾收集解决了许多(但不是全部)内存分配问题。您可以创建对象,无限期地继续引用它们,直到没有更多的内存可用。垃圾收集也是一种复杂的任务需要自己的时间和资源。用于组织内存、分配和释放空间的精确算法由垃圾处理收集器处理,这一系列过程对开发人员是隐藏的。空间通常是从一个大的内存池中分配的,就像堆一样,垃圾回收的时间由垃圾回收器决定。通常,整个堆或其子部分是当
2021-01-07 13:59:03
187
1
原创 Log4j2 自定义appender
Log4j 2介绍: Log4j 2是Java的流行日志记录程序包,几乎每个大型应用程序都包含其自己的日志记录或跟踪API,将日志语句插入代码是调试它的低技术方法。这也可能是唯一的方法,因为调试器并不总是可用或不适用。对于多线程应用程序和整个分布式应用程序通常是这种情况。 经验表明,日志记录是开发周期的重要组成部分。它具有几个优点。它提供有关应用程序运行的精确上下文。一旦插入到代码中,就无需人工干预即可生成日志输出。此外,日志输出可以保存在永久性介质中,以便以后进行研究。除了在开发周...
2020-12-26 20:24:34
2639
原创 百万tps生产环境java.lang.OutOfMemoryError: GC overhead limit exceeded问题排查
问题背景:数据同步平台生产环境任务停止,导致binlog gtid积压,业务方无法收到同步数据查看日志报错信息:java.lang.OutOfMemoryError: GC overhead limit exceeded错误信息截图如下:分析可知CopyOnWriteArrayList导致内存占用过高(关于线程安全的list会在之后的juc专栏统一剖析)GC overhead limit exceeded是什么错误呢?Exception in thread thread_name
2020-12-21 23:08:04
940
1
原创 jvm内存结构
java虚拟机规范:https://docs.oracle.com/javase/specs/jvms/se15/html/index.htmlRun-Time Data AreasThe Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual
2020-12-20 22:31:10
122
原创 String StringBuffer StringBuilder之间的区别
String:给String赋值,会在常量池中查找是否有相同的字符串常量,如果有则返回栈中的引用,如果没有则创建常量返回引用.new String()除了在栈和常量池中创建对象之外,同时会在堆中创建对象.StringBuffer:线程安全的String,jdk1.0之后出现,初始容量为16个字符,源码如下StringBuffer 不会像String一样改变字符串就会重新生成一个对象,而是以连接的方式直接拼接字符串.append(String str)为StringBuff
2020-12-19 22:48:29
2220
11
原创 String被final修饰
源码:为什么String被final修饰?String str = "test";给String变量对象赋值,在常量池生成一个常量,栈中有该常量的引用,如果字符串改变,则会copy一个新的值.原因一: final能够缓存结果,传参时不需要考虑谁会修改它的值,如果是可变类的话,则有可能需要重新拷贝出来一个新值进行传参,这样在性能上就会有损失。原因二: String设计成不可变的另一个原因是安全,当你在调用其他方法时,例如调用一些系统级操作指令之前,可能会有一系列校验,如果是可变类的
2020-12-18 17:31:09
609
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人