0%

JEP 425: Virtual Threads (Preview)

提示:本文翻译的时候,文档最新版本是 2022/06/08,所以本文可能存在一定的时效性问题,请读者注意。

总览

虚拟线程引入到 Java 平台。虚拟线程是轻量级的线程,可以大大减少编写、维护和监测高吞吐量并发应用程序的工作量。这是 预览 API .

目标

  • 使以简单的线程每请求方式编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展。
  • 让使用 java.lang.Thread API 的现有代码能够以最小的改动采用虚拟线程。
  • 使用现有的 JDK 工具轻松地对虚拟线程进行故障排除、调试和分析。

非目标

  • 我们的目标不是移除线程的传统实现,也不是默默地将现有的应用程序迁移到使用虚拟线程。
  • 它的目标不是改变 Java 的基本并发模型。
  • 在 Java 语言或 Java 库中提供新的数据并行结构不是我们的目标。流 API 仍然是并行处理大型数据集的首选方式。
阅读全文 »

JVM 相关总结(二)

GC 的背景与一般原理

为什么会有 GC

本质上是因为内存资源的有限性,因此需要大家共享使用,手工申请,手动释放。

原理

引用计数(Reference Counting)

可能导致循环依赖的问题

可达性分析(Reachability Analysis)

也可叫引用跟踪,通过一系列“GC Roots”根据引用关系向下搜索

可以作为 GC Roots 的对象

  1. 当前正在执行的方法里的局部变量和输入参数
  2. 活动线程(Active threads)
  3. 所有类的静态字段(static field)
  4. JNI 引用

此阶段暂停的时间,与堆内存大小,对象的总数没有直接关系,而是由存活对象(alive objects)的数量来决定。所以增加堆内存的大小并不会直接影响标记阶段占用的时间。

阅读全文 »

JVM 相关总结(一)

Java 字节码

什么是字节码?

Java bytecode 由单字节 (byte) 的指令组成,理论上最多支持 256(2^8=256)个操作码。实际上 Java 只使用了 200 左右的操作码,还有一些操作码则保留给调试操作。

根据指令的性质,主要分为四个大类:

  1. 栈操作指令,包括与局部变量交互的指令
  2. 程序流控制指令
  3. 对象操作指令,包括方法调用指令
  4. 算数运算以及类型转换指令
    阅读全文 »

使用 vercel 部署博客

使用 GitHub Pages 部署博客之后碰到一个问题,seo 相关的。

网址上报 google 之后,很快能被谷歌搜索到,但是在百度上报纸后,发现百度报错说爬取不到资源。上网查了一下,看到说的是:

2015 年,因为一些不能细说的原因,Github 开始拒绝百度爬虫的访问,直接返回 403。

阅读全文 »

github action 持续集成

原先一直觉得 hexo 慢,每次写完文章,clean 一下再 generate 然后 deploy 都要好久于是换了 hugo,但是 hexo 毕竟还是主题多,于是还是回来用这个了。最近发现个解决办法,就是使用持续集成,提交代码之后的事情让别人帮你做,有很多其他的 CI&CD 工具,但这次我是用的是 github 自带的 Github Action。

阅读全文 »

前言

面试的时候,当面试官问你 Java 基础,HashMap 可以说是一个绕不过去的话题,哪怕其他容器(比如 ArrayList,LinkedList)都不问,HashMap 也是不能不问的。不仅仅因为在平时工作中,HashMap 是一个很常用的数据结构,而且由 HashMap 这个数据结构其实能引出很多问题。比如最基本的 get()、put() 方法是吧,get() 就可以聊聊 equals() 方法跟 hashCode() 方法,这算是 Java 基础了吧;稍微升级一下难度,聊聊扩容过程,线程安全问题,进而引申到 ConcurrentHashMap,引申到多线程,引申到 Synchronized 关键字,引申到 JVM 虚拟机是吧,你看这样一联想,整个都串到一起了。

阅读全文 »