Java 故障诊断

故障定位思路

Java 应用出现线上故障,如何进行诊断?

我们在定位线上问题时要有一个整体的思路,顺藤摸瓜,才能较快的找到问题原因。

阅读更多

ForkJoin框架

对于简单的并行任务,你可以通过“线程池 +Future”的方案来解决;如果任务之间有聚合关系,无论是 AND 聚合还是 OR 聚合,都可以通过 CompletableFuture 来解决;而批量的并行任务,则可以通过 CompletionService 来解决。

CompletableFuture

runAsync 和 supplyAsync 方法

CompletableFuture 提供了四个静态方法来创建一个异步操作。

1
2
3
4
public static CompletableFuture<Void> runAsync(Runnable runnable)
public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
阅读更多

Java IO 工具类

关键词:FileRandomAccessFileSystemScanner

本文介绍 Java IO 的一些常见工具类的用法和特性。

阅读更多

Java 内存管理

内存简介

物理内存和虚拟内存

所谓物理内存就是通常所说的 RAM(随机存储器)。

虚拟内存使得多个进程在同时运行时可以共享物理内存,这里的共享只是空间上共享,在逻辑上彼此仍然是隔离的。

内核空间和用户空间

一个计算通常有固定大小的内存空间,但是程序并不能使用全部的空间。因为这些空间被划分为内核空间和用户空间,而程序只能使用用户空间的内存。

使用内存的 Java 组件

Java 启动后,作为一个进程运行在操作系统中。

有哪些 Java 组件需要占用内存呢?

  • 堆内存:Java 堆、类和类加载器
  • 栈内存:线程
  • 本地内存:NIO、JNI
阅读更多

JVM 垃圾收集

程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。垃圾回收主要是针对 Java 堆和方法区进行

对象活着吗

引用计数算法

给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。

两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。

阅读更多