分类 Java 相关 下的文章

Java 静态方法的返回值泛型使用与调用 static method generic return type and invoke

泛型(generic)类型在 Java 中使用特别频繁, 尤其在各种集合类(Collection)中. 一般如果自定义的类要使用泛型, 那么需要在类定义的时候, 声明泛型, 如:

public class MyClass<T> {...}

那么, 如果想在类的静态方法里上使用泛型, 以及如何在调用的时候, 传入泛型类型呢?

- 阅读剩余部分 -

监控指标的常见异常规则

我们收集各种层级的数据, 包括: 硬件层, hypervisor层, VM OS 层, JVM 层, 应用框架层, 应用层 或者基于 Docker 的 Node 数据, Pod 数据, Container 数据. 收集这么多数据大多数是为了出错时做分析, 不出错时做优化用. 把数据都转为时序数据后, 就可以对它们做异常检测和提前预知.
常见的异常检测是基于时间周期的, 比如每周的数据基本模式都是一样, 每天的数据模式也大致相同, 对比去年或前年的数据基本也可以用. 影响这些异常检测效果的一般有下面几种情况:

  1. 有些国家的冬令时和夏令时之间的转换;
  2. 有较大影响力的体育,政治事件, 比如美国超级碗会影响在线销售订单, 英国王室婴儿出生新闻会影响英国在线销售订单;
  3. 某些时间点的较大规模促销, 抢购会影响异常检测;
  4. 过年, 过节会影响, 这里有很大程度是因为无法发货, 或者发货也到不了导致的不购买;

- 阅读剩余部分 -

如何快速确认由具体某个类引起的JVM内存泄漏

在流量大致稳定的情况下, JVM 运行一段时间之后, 它的内存使用会趋于稳定, 我们通常认为这个时候做完一次 Full GC 之后的使用内存为稳定使用内存, 一般我们对 JVM 堆(heap) 大小的设置通常对比这个值做参考, 设置年轻代, 老年代的值. 当发生内存泄漏的时候, FuLL GC 之后的内存使用量表现为逐渐增大, 直到内存全部耗尽, 频繁的发生 full GC. 对于内存泄漏的问题, 我们一般捕获 heap dump, 然后分析, 当一个或一类对象实例所直接或间接占用的内存比例非常高的时候, 或者占用巨大的时候, 我们就会怀疑该类或对象. 那么有没有在不做 heap dump 的情况下, 快速定位某个对象是不是发生内存泄漏的方法呢?

- 阅读剩余部分 -

解决 JVM AttachNotSupportedException 的问题

对于 JVM GC overhead 的问题, 通常要在 overhead 很高的时候做 heap dump, 这样捕获的 dump 文件才更有意义. 可是在 GC overhead 很高的时候, 它消耗的 CPU 也很高, 通常把机器的 CPU 全占满. 这个时候尝试去使用 jcmd, jmap 去做 heap dump, 很高的概率会得到这个异常:

com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
    at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
    at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:213)
    at sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:140)
    at sun.tools.jcmd.JCmd.main(JCmd.java:129)

那么如何解决这个问题呢?

- 阅读剩余部分 -

诊断由于 blocking socket 未设置 socket timeout 而引起的线程卡住( thread stuck)

Java 既有早期的 blocking IO (面向流的Input/output stream, 面向字符的 Reader/Writer), 又有之后加入的 NIO/ NIO 2 (Channel & Buffer). 很多应用都是使用的 早期的 blocking 的 IO. 不论是 blocking IO 还是 NIO 都要注意 socket timeout 问题, 如果不设置, 都会引起应用卡在 IO 的问题.

- 阅读剩余部分 -