JVM
JVM入门级知识总结
coder1qiang
路漫漫其修远兮...
展开
-
JVM知识概览
JVM体系结构:第1篇:内存与垃圾回收篇第2篇:字节码与类的加载篇第3篇:性能监控与调优篇第4篇:大厂面试篇原创 2020-07-23 12:37:19 · 325 阅读 · 0 评论 -
01 JVM与Java体系结构
1. 前言高级语言 → 汇编语言 → 机器指令 → CPU执行C语言需要程序员自己来分配内存和回收内存,而Java全部交给JVM进行分配和回收。内存动态分配、垃圾收集技术、垃圾回收算法、即时编译器JIT、底层原理等。图1-1 Java应用程序2. Java生态圈Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。作为一个平台,Java虚拟机扮演着举足轻重的作用。Groov原创 2020-07-23 22:06:31 · 368 阅读 · 0 评论 -
02 类加载器子系统
1. 内存结构概述图2-1 JVM内存结构(中)图2-2 JVM内存结构(英)如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎2. 类加载器与类的加载过程2.1 类加载器子系统的作用图2-3 类加载器子系统类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎Execution Engine决定。加载的类信息存放于一原创 2020-10-12 20:07:59 · 535 阅读 · 0 评论 -
03 运行时数据区1
1. 运行时数据区概述内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。我们通过磁盘或者网络IO得到的数据,都需要先加载到内存中,然后CPU从内存中获取数据进行运算。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。图3-1 运行时数据区的完整图示Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟原创 2020-10-20 11:33:31 · 516 阅读 · 0 评论 -
04 运行时数据区2
5. 堆图3-28原创 2020-10-27 00:12:42 · 269 阅读 · 0 评论 -
05 运行时数据区3
6. 方法区图3-42原创 2020-10-30 17:13:38 · 296 阅读 · 2 评论 -
06 对象的实例化&内存布局&访问定位
1. 对象的实例化美团对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服Java对象头里有什么?图4-1 对象的实例化创建对象的步骤:判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、链接和初始化(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader + 包名 + 类名为Ke原创 2020-10-30 23:39:18 · 176 阅读 · 1 评论 -
07 直接内存
直接内存(Direct Memory)不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO(JDK1.4引入NIO,JDK1.7引入NIO2),通过存在堆中的DirectByteBuffer操作Native内存。package com.coder.java;import java.nio.ByteBuffer;import java.util.Scanner;/** * IO .原创 2020-10-31 23:21:12 · 267 阅读 · 0 评论 -
08 执行引擎
1. 执行引擎概述执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识原创 2020-11-01 22:46:38 · 336 阅读 · 0 评论 -
09 StringTable
1. String的基本特性String:字符串,使用一对""引起来表示。String s1 = "StringTable"; // 字面量的定义方式String s2 = new String("StringTable");public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ... }String声明为final的,不可被继承;String实原创 2020-11-03 12:03:56 · 190 阅读 · 0 评论 -
10 垃圾回收概述
1. 垃圾回收概述1.1 什么是垃圾?图8-1 JVM知识概览图8-2 Java和C++的区别垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?蚂蚁金服你知道哪几种垃圾回收器,各自的优缺点,重点讲一下CMS和G1?JVM GC算法有哪些,目前的JDK版本采用什么回收算法?G1回收器的回收过程?GC是什么?为什么要有GC?GC的两种判原创 2020-11-03 15:00:56 · 185 阅读 · 0 评论 -
11 垃圾回收相关算法
1. 垃圾回收概述图8-1 2. 垃圾回收相关算法3. 垃圾回收相关概念4. 垃圾回收器原创 2020-11-09 13:34:40 · 323 阅读 · 0 评论 -
12 垃圾回收相关概念
1. System.gc()的理解在默认情况下,通过system.gc()者Runtime.getRuntime().gc() 的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而system.gc() )调用附带一个免责声明,无法保证对垃圾收集器的调用。(不能确保立即生效)JVM实现者可以通过system.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能原创 2020-11-10 12:19:26 · 258 阅读 · 0 评论 -
13 垃圾回收器
GC分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本新特性语法层面:Lambda表达式、switch、自动拆箱装箱、enumAPI层面:Stream API、新的日期时间、Optional、String、集合框架底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量池位置变化垃圾收集器原创 2020-11-12 15:00:41 · 311 阅读 · 0 评论 -
14 实战OOM
1. Java堆溢出Java堆用于存储对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会产生内存溢出异常。JVM参数设置:-Xms5m -Xmx5m -XX:+HeapDumpOnOutOfMemoryError-Xms5m:将堆的最小值设置为5m;-Xmx5m:将堆的最大值设置为5m;将堆的最小值参数-Xms与堆的最大值参数-Xmx设置为一样的,此堆即不可自动扩展;-XX:+原创 2020-11-12 15:04:37 · 295 阅读 · 0 评论 -
15 Class文件结构
1. 概述Java是跨平台的语言,JVM是跨语言的平台。JVM不与Java语言绑定,JVM只与Class文件这种特定的二进制文件格式相关联。.java → .class:前端编译器(javac)的主要任务就是负责将符合Java语言规范的Java源代码编译为符合JVM规范的字节码文件。除了javac之外,还有一种前端编译器是内置在Eclipse中的ECJ(Eclipse Compiler for Java),和javac的全量式编译不同,ECJ是一种增量式编译器。ECJ编译器采取的编译方案是把未编译原创 2020-11-12 15:12:06 · 228 阅读 · 0 评论 -
16 JVM性能监控与故障处理工具
1. 基础故障处理工具1.1 jps:虚拟机进程状况工具jps:JVM Process Status Tool,用于列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中注册的主机名。jps命令格式:jps options hostidjp原创 2020-11-12 15:12:33 · 259 阅读 · 0 评论