3 天前 / 浪客书心
网上看到一个很有意思的美团面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但发现都没答到根上,所以决定答一答。相信大家看完肯定会有收获,本文分以下几节来探讨。 线程崩溃,进程一定会崩溃吗? 进程是如何崩溃的——信号机制简介。 为什么在 JVM 中线程崩溃不会导致 JVM 进程崩溃? openJDK 源码解析。 1. 线程崩溃,进程一定会崩溃吗? 一般来说如果线程是因为非法访问内存引起的崩溃,那么进程肯定会崩溃。 为什么系统要让进程崩溃呢?这主要是因为在进程中,各个线程的地址空间是共享的。
48 天前 / sjf0115
1. 类加载器我们知道,虚拟机在加载类的过程中需要使用类加载器进行加载,而在 Java 中,类加载器有很多,那么当 JVM 想要加载一个 .class 文件的时候,到底应该由哪个类加载器加载呢?这时候就需要双亲委派机制来告诉 JVM 使用哪个类加载器加载。在讲解什么是双亲委派机制之前,我们先看一下有哪些加载器。 从 Java 虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器 Bootstrap ClassLoader,这个类加载器使用 C++ 语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由 Java 语言实现,独立于虚拟机外部...
64 天前 / BloomingRose
前言 大家好,我是程序员田螺。整理了几道高频的 JVM 面试题,小伙伴们加油呀! JVM 内存为什么要分成新生代,老年代新生代中为什么要分为 Eden 和 SurvivorJVM 中一次完整的 GC 流程是怎样的 CMS 收集器和 G1 收集器的区别 JVM 调优 CPU 飙升如何排查 1. JVM 内存为什么要分成新生代,老年代? 1.1 JVM 共享内存划分共享内存区 = 持久代 + 堆(jdk1.8 及以上 jvm 废弃了持久代)持久代 = 方法区 + 其他 Java 堆 = 老年代 + 新生代新生代 = Eden + S0 + S11.2 为什么分年老代和新生代新生代:主要存放新创建的对象,内存大小一般会比较小...
82 天前 / JavaPub
我是 JavaPub,专注于面试、副业,技术人的成长记录。 以下是 JVM 面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub 在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。 评论区见 [toc] JVM 基于 JDK8 1. 说一说 JVM 的主要组成部分点击放大看,一图胜千文 方法区和堆是所有线程共享的内存区域;而虚拟机栈、本地方法栈和程序计数器的运行是线程私有的内存区域,运行时数据区域就是我们常说的 JVM 的内存。
103 天前 / reesunhuang
今天为大家带来一篇 2 万字的硬核技术文章。 本文我们将从计算机组成原理的角度详细阐述对象在 JVM 内存中是如何布局的,以及什么是内存对齐,如果我们头比较铁,就是不进行内存对齐会造成什么样的后果,最后引出压缩指针的原理和应用。同时我们还介绍了在高并发场景下,False Sharing 产生的原因以及带来的性能影响。 相信大家看完本文后,一定会收获很多,话不多说,下面我们正式开始本文的内容~~ 本文概要。
127 天前 / 趣编程
1、引言本系列文章介绍如何修复 Elasticsearch 集群的常见错误和问题。 这是系列文章的第四篇,主要探讨:Elasticsearch JVM 堆内存使用率飙升,怎么办? 第一篇:Elasticsearch 磁盘使用率超过警戒水位线,怎么办? 第二篇:Elasitcsearch CPU 使用率突然飙升,怎么办? 第三篇:Elasticsearch 断路器报错,怎么办? 2、症状:高 JVM 内存使用率高 JVM 内存使用率会降低集群性能并触发断路器错误(导致内存熔断)。 为了防止这种情况发生,如果节点的 JVM 内存使用率持续超过 85%,官方建议采取措施降低内存压力。
158 天前 / sjf0115
作者:董伟柯,腾讯 CSIG 高级工程师 问题背景前段时间,某客户线上运行的大作业(并行度 200 左右)遇到了 TaskManager JVM 内存超限问题(实际内存用量 4.1G > 容器设定的最大阈值 4.0G),被 YARN 的 pmem-check 机制检测到并发送了 SIGTERM(kill)信号终止该 container,最终导致作业出现崩溃。这个问题近期出现了好几次,客户希望能找到解决方案,避免国庆期间线上业务受到影响。 在 Flink 配置项中,提供了很多内存参数设定。
164 天前 / 浪客书心
JVM 的主要作用是什么?JVM 就是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 屏蔽了与具体操作系统平台相关的信息,使 Java 程序只需生成在 Java 虚拟机上运行的目标代码 (字节码),就可以在不同的平台上运行。 请你描述一下 Java 的内存区域?JVM 在执行 Java 程序的过程中会把它管理的内存分为若干个不同的区域,这些组成部分有些是线程私有的,有些则是线程共享的,Java 内存区域也叫做运行时数据区,它的具体划分如下: 虚拟机栈 : Java 虚拟机栈是线程私有的数据区,Java 虚拟机栈的生命周期与线程相同,虚拟机栈也是局部变量的存储位置。
168 天前 / 逗逗
大家好,我是冰河~~ 最近很多小伙伴跟我说,自己学了不少 JVM 的调优知识,但是在实际工作中却不知道何时对 JVM 进行调优。今天,冰河就为大家介绍几种 JVM 调优的场景。 点击上方卡片关注我 在阅读本文时,冰河假定大家已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了 Hotspot 支持的垃圾回收器。 cpu 占用过高 cpu 占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束后 cpu 占用率就下降了,如果是这种情况其实可以不用太关心,因为请求越多,需要处理的线程数越多,这是正常的现象。
181 天前 / 三分恶
大家好,我是老三,“面渣逆袭“系列继续,这节我们来搞定 JVM。说真的,JVM 调优什么的一个程序员可能整个职业生涯都碰不到两次,但是,一旦用到的时候,那就是救命了,而且最重要的是——面试必问,所以,还能怎么办?整! 引言 1.什么是 JVMJVM——Java 虚拟机,它是 Java 实现平台无关性的基石。 Java 程序运行的时候,编译器将 Java 文件编译成平台无关的 Java 字节码文件(.class),接下来对应平台 JVM 对字节码文件进行解释,翻译成对应平台匹配的机器指令并运行。
222 天前 / Dr_Hydra
熟悉 Spring 的小伙伴们应该都对 aop 比较了解,面向切面编程允许我们在目标方法的前后织入想要执行的逻辑,而今天要给大家介绍的 Java Agent 技术,在思想上与 aop 比较类似,翻译过来可以被称为 Java 代理、Java 探针技术。 Java Agent 出现在 JDK1.5 版本以后,它允许程序员利用 agent 技术构建一个独立于应用程序的代理程序,用途也非常广泛,可以协助监测、运行、甚至替换其他 JVM 上的程序,先从下面这张图直观的看一下它都被应用在哪些场景: 看到这里你是不是也很好奇,究竟是什么神仙技术,能够应用在这么多场景下,那今天我们就来挖掘一下...
236 天前 / LinweiWang
1 垃圾回收相关算法垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。 判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法 、可达性分析算法。垃圾回收的常见算法有以下几个:标记 - 清除算法、标记 - 复制算法、标记 - 整理算法。1.1 引用计数算法(Reference Counting)在创建对象时关联一个与之相对应的计数器,当此对象被使用时加 1,相反销毁时 -1。当此计数器为 0 时,则表示此对象未使用,可以被垃圾收集器回收。
238 天前 / vivo互联网技术
作者:vivo 互联网技术团队 Li Guanyun、 Jessica Chen 一、背景 2021 年 2 月,收到反馈,视频 APP 某核心接口高峰期响应慢,影响用户体验。 通过监控发现,接口响应慢主要是 P99 耗时高引起的,怀疑与该服务的 GC 有关,该服务典型的一个实例 GC 表现如下图: 可以看出,在观察周期里: 平均每 10 分钟 Young GC 次数 66 次,峰值为 470 次; 平均每 10 分钟 Full GC 次数 0.25 次,峰值 5 次; 可见 Full GC 非常频繁,Young GC 在特定的时段也比较频繁,存在较大的优化空间。
247 天前 / LinweiWang
内容为之前学习笔记整理,本文示意图为自己学习所画。如果有问题欢迎指正。 1 内存布局总体结构根据 JVM 规范,JVM 内存共分为虚拟机栈(Virtual Machine Stacks)、堆(Heap)、方法区(Method Area)、程序计数器(Program Counter Registers)、本地方法栈(Native Method Stacks)五个部分。 Java 8 之前在堆(Heap)中除了年轻代(YongGen)、老年代(OldGen)之外还存在一个永久代(PremGen) 永久代存放:类的元数据、静态变量和常量 方法区(Method Area)存在于永久代之中 运行时常量池(Runtime Constant Pool)存在于方法区(Method Area)中 J...
253 天前 / LinweiWang
什么是 JVMJVM 即 Java Virtual Machine,中文名为 Java 虚拟机。 一般情况下 C/C++ 程序,编译成二进制文件后,就可以直接执行了;Java 需要使用 javac 编译成 .class 文件,还需要使用 Java 命令去主动执行它。JVM 就是识别 .class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数。Java 是一门抽象程度特别高的语言,提供了自动内存管理等一系列的特性。这些特性直接在操作系统上实现是不太可能的。而且有了 JVM 这个抽象层之后,Java 就可以实现跨平台了。Java 跨平台的意义在于一次编译,处处运行。