随笔分类 - JVM详解
摘要:一、相关概念 1、System.gc()的理解 通过System.gc()或Runtime.getRuntime().gc()的调用,会显式触发Full GC,对新生代和老年代进行回收,释放垃圾对象占用的内存。 然而System.gc()调用附带一个免责声明,它无法保证对垃圾收集器的调用。即:只是告
阅读全文
摘要:一、概述 1、什么是垃圾 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集的三个经典问题: (1)哪些内存需要回收? (2)什么时候回收? (3)如何回收? 垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃
阅读全文
摘要:一、概述 1、介绍 直接内存,不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。是Java堆直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。通常,访问直接内存的速度会优于Java堆,即读写性能高。因此处于性能考
阅读全文
摘要:一、对象的实例化 1、创建对象的方式 2、创建对象的步骤 脑图:https://www.processon.com/view/link/61701a927d9c087040525226 3、对象属性赋值的步骤 ①属性的默认初始化——对应脑图中"创建对象的步骤"4 ②显式初始化——对应脑图中"创建对象
阅读全文
摘要:一、概述 1、介绍 《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。但对于HotSpot JVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。 所以,方法区看作是一块独立于Java堆的内存空
阅读全文
摘要:一、堆 1、介绍 Java运行程序对应一个进程,一个进程就对应一个JVM实例。一个JVM实例就有一个运行时数据区(Runtime),Runtime里面,就只有一个堆,一个方法区。这里也阐述了,方法区和堆是一个进程一份。而一个进程当中,可以有多个线程,那就意味着一个进程中的多个线程会共享堆空间和方法区
阅读全文
摘要:一、概述 1、介绍 类比一下:红框就好比内存的运行时数据区,在各自不同的位置放了不同的东西。而厨师就好比执行引擎。 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定
阅读全文
摘要:一、概述 1、JVM内存结构 简图: 详图-英文: 详图-中文: 二、类加载器 1、介绍 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则有Execution Engine决
阅读全文
摘要:一、概述 1、前言 你是否也遇到过这些问题? (1)运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! (2)解决线上JVM GC问题,但却无从下手。 (3)新项目上线,对各种JVM参数设置一脸茫然,然后gg。 (4)每次面试的时候都要被问到这些问题,一脸蒙蔽。 大部分Java开发人员,除会在
阅读全文