3k 字 3 分钟

# JVM 内存模型如何分配的 # JVM 内存模型的划分 由于我们生产环境使用的虚拟机 HotSpot 居多,所以下面的描述都是基于 HotSpot 虚拟机而言的,对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 可能并不太一样 根据虚拟机规范,JVM 的内存分为 堆、虚拟机栈、本地方法栈、程序计数器、本地方法栈 5 部分 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM...
5.2k 字 5 分钟

# JVM 性能调优实战 # 调优的一些原则 多数的 Java 应用不需要在服务器上进行 GC 优化,虚拟机内部已有很多优化来保证应用的稳定运行,所以不要为了调优而调优,不当的调优可能适得其反 在应用上线之前,先考虑将机器的 JVM 参数设置到最优(适合) 在进行 GC 优化之前,需要确认项目的架构和代码等已经没有优化空间。我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过 GC 优化令其性能达到一个质的飞跃 GC 优化是一个系统而复杂的工作,没有万能的调优策略可以满足所有的性能指标。GC...
2.1k 字 2 分钟

# 如何解决线上 gc 频繁的问题 对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出 jstack 和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种: 代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致 Full GC 次数过多,系统缓慢; 代码中有比较耗 CPU 的操作,导致 CPU...
2.1k 字 2 分钟

# 内存溢出的原因有哪些,如何排查线上问题? java 内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看到下面的关键字的时候它就是堆栈溢出了: java.lang.OutOfMemoryError: ......java heap space..... 也就是当你看到 heap 相关的时候就肯定是堆栈溢出了,此时如果代码没有问题的情况下,适当调整 - Xmx 和 - Xms...
1.3k 字 1 分钟

# 有哪些垃圾回收算法? # 1. 标记 - 清除(Mark-Sweep)算法 分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 它的主要不足有两个: 效率问题,标记和清除两个过程的效率都不高。 空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 # 2....
1k 字 1 分钟

# ABA 问题遇到过吗,详细说一下 有两个线程同时去修改一个变量的值,比如线程 1、线程 2,都更新变量值,将变量值从 A 更新成 B。 首先线程 1 获取到 CPU 的时间片,线程 2 由于某些原因发生阻塞进行等待,此时线程 1 进行比较更新(CompareAndSwap),成功将变量的值从 A 更新成 B。 更新完毕之后,恰好又有线程 3 进来想要把变量的值从 B 更新成 A,线程 3 进行比较更新,成功将变量的值从 B 更新成 A。 线程 2 获取到 CPU 的时间片,然后进行比较更新,发现值是预期的 A,然后有更新成了 B。但是线程 1 并不知道,该值已经有了...
898 字 1 分钟

# 描述一下线程安全活跃态问题,以及竞态条件 线程安全的活跃性问题可以分为 死锁、活锁、饥饿 活锁 就是有时线程虽然没有发生阻塞,但是仍然会存在执行不下去的情况,活锁不会阻塞线程,线程会一直重复执行某个相同的操作,并且一直失败重试 我们开发中使用的异步消息队列就有可能造成活锁的问题,在消息队列的消费端如果没有正确的 ack 消息,并且执行过程中报错了,就会再次放回消息头,然后再拿出来执行,一直循环往复的失败。这个问题除了正确的 ack...
1.2k 字 1 分钟

# 英语作业 常州市完型填空 13 题 since + 时间点。如:I have been a student since last year. for + 时间段。如:I have been in the house for 7 days. 常州市完型填空 20 题 steal 偷 常州市作文 题目:你喜欢在空闲时间听音乐吗?请根据下列要求,用英语写一篇 90 词左右的短文介绍你最喜欢的音乐和音乐人。 内容包括: what music do you like best?why? Who is your favourite singer or musican?...
1.9k 字 2 分钟

# Happens-Before 规则是什么? 程序顺序规则:一个线程中的每一个操作,happens-before 于该线程中的任意后续操作。 double pi = 3.14; // A double r = 1.0; // B double area = pi * r * r; // C 一个线程中,按照程序顺序,前面的操作 Happens-Before 于后续的任意操作。这个还是非常好理解的,比如上面那三行代码,第一行的 "double pi = 3.14;" happens-before 于 “double r = 1.0;”,这就是规则 1...
3.3k 字 3 分钟

# jvm 有哪些垃圾回收器,实际中如何选择 图中展示了 7 种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。 新生代收集器(全部的都是复制算法):Serial、ParNew、Parallel Scavenge 老年代收集器:CMS(标记 - 清理)、Serial Old(标记 - 整理)、Parallel Old(标记整理) 整堆收集器: G1(一个 Region 中是标记 - 清除算法,2 个 Region...