文章已同步至GitHub开源项目: JVMStudy
上面这种 OOM 比较好理解,在 main 方法中循环调用 main 方法,循环产生的大量形参都会在栈空间进行创建,当超过栈空间的大小,就会导致栈空间溢出,发生 OOM。
JVM提供了发生OOM时自动保存dump的参数。
刚接手的服务,正常稳定运行了很长一段时间,在大家伙收拾东西准备回家过年时,突然就抽风了。
只有经历地狱般的磨练,才能创造出天堂般的力量。
垃圾回收器、堆和运行时编译器默认选择
简单的介绍一下JVM(Java Virtual Machine)吧,它也叫Java虚拟机。虽然它叫虚拟机,但是实际上不是我们所理解的虚拟机,它更像操作系统中的一个进程。JVM屏蔽了各个操作系统底层的相关的东西,Java程序只需要生成对应的字节码文件,然后由JVM来负责解释运行
标记-复制
JVM的内存组成结构,以及JVM的内存管理
从如何判断对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两大类也常被称作“直接垃圾收集”和“间接垃圾收集”。
在一个风和日丽的中午,和同事小勇一起走在公司楼下的小公园里面,看到很多的小姐姐,心想什么时候能够和这些小姐姐一起讨论人生呀,美滋滋,嘿嘿嘿。
从前面的系列文章中,我们了解到了多cpu处理器的工作结构(内存、总线、多级缓存、CPU),所以也清楚,当多线程使用不当时,会带来的各种不一致甚至更严重的问题。以下将从Java并发编程的基础开始,介绍从启动一个线程到线程池的合理使用。
摘要:本文主要介绍类加载器、自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换。
String对象占用的内存空间是可以计算出来的,你学会了吗?
本文主要介绍Java中与字符串相关的一些内容,主要包括String类的实现及其不变性、String相关类(StringBuilder、StringBuffer)的实现 以及 字符串缓存机制的用法与实现。
结合高级Java笔试题, 一次学会 String#intern
String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字符串的数量,推荐尽量直接使用String Table中的字符串常量池中的元素。
极限就是为了超越而存在的。 —— 李浩宇.Alex
Java语法层面暂不支持的功能特性,并不代表JVM不支持(比如:Coroutine),总之,基于字节码增强技术,一切皆有可能。
从底层分析LockSupport原理机制
本文主要介绍Java中与字符串相关的一些内容,主要包括String类的实现及其不变性、String相关类(StringBuilder、StringBuffer)的实现 以及 字符串缓存机制的用法与实现。
结合高级Java笔试题, 一次学会 String#intern
指令重排序有两类,编译器重排序和处理器重排序。(至于内存系统指令重排较为复杂不是本章重点)
当学习一个新知识不知道从哪下手的时候,最有效的办法是梳理这个知识结构的脉络信息。就像JVM的学习,也是一个庞大的知识体系。例如:类加载、加载器、生命周期、性能优化、调优参数、调优工具、优化方案、内存区域、虚拟机栈、直接内存等等。
2021年的开始又是多灾难的一年,对于我们每个人来说,健康地活着比什么都重要。受到疫情的影响,很多公司都过得比较艰难,裁员更是普遍,所以对大部分来说保住饭碗就很不错了,更别说什么跳槽晋升了。
每次我们会被问到这个问题,我们都知道 Vector 是线程安全的,而 ArrayList是线程不安全的。今天想引申出几个问题。
本篇文章主要介绍JDK、JRE、JVM三者之间的关系,为后续的JVM内容讲解做铺垫。另外想深入学习JVM并不太容易,既要学习JVM规范也要上手应用实践,所以非常建议耐住性子一点点开始。
摘要:堆空间差不多是最大的内存空间,也是运行时数据区最重要的内存空间。堆可以处于物理上不连续的内存空间,但在逻辑上它应该被视为连续的。
众所周知,在java中内存主要分为以下几类:
JVM内存划分
堆分为年轻代和年老代。永久代是非堆内存,它又叫做方法区(一般的说法),主要存储已被加载的类信息、常量、静态变量。而该区域在java8已被删除,取而代之的是元空间,会在后面的章节细讲。
聊聊下面这些内容: Java 程序 CPU 占用高的排查思路 可能造成线上服务大量异常的 log4j 假异步 Kafka 异步发送的优化 On-CPU 火焰图的原理和解读 使用 Trie 前缀树来优化 Spring 的路径匹配
我们深入研究元空间的架构。我们描述了各个层和组件,以及它们是如何协同工作的。
随着系统架构、软硬件设施的不断完善发展,更大内存的使用,更高的系统目标,要支持更大的并发、更低的延迟、更大的吞吐量,这个时候,传统的GC已经无法满足需求,新一代GC - ZGC便应用而生。
摘要:堆空间差不多是最大的内存空间,也是运行时数据区最重要的内存空间。堆可以处于物理上不连续的内存空间,但在逻辑上它应该被视为连续的。