jvm

2020面试必问之jvm与性能优化

我是研究僧i 提交于 2020-02-25 22:22:28
无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎。不管是工作还是面试中,JVM都是必考题。如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在JVM上了)。 本文将重点介绍面试过程中常见的 JVM 题目。 1.描述一下JVM加载Class文件的原理机制? 在面试java工程师的时候,这道题经常被问到,故需特别注意。 什么是类加载器? 3.类加载器有哪些? 什么是tomcat类加载机制? 这个题给大家一个小提示 5、类加载器双亲委派模型机制? 6.Java内存分配 Java堆的结构是什么样子的? 简述各个版本内存区域的变化? 参考:https://blog.csdn.net/rainnnbow/article/details/50541079 说说各个区域的作用? Java 中会存在内存泄漏吗 ,简述一下? Java 类加载过程? 什么是GC?为什么要有GC? 简述一下Java垃圾回收机制? 如何判断一个对 象是否存活? 垃圾回收的优点和原理,并考虑2种回收机制?基本原理是什么? 深拷贝 和浅拷贝 ? 什么是分布式垃圾回收(DGC)?它是如何工作的? 在Java中,对象什么时候可以被垃圾回收? 19.简述Minor GC和Major GC? Java中垃圾收集的方法有哪些? 21.讲讲你理解的性能评价及测试指标? 22.常用的性能优化方式有哪些? 23

JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!

五迷三道 提交于 2020-02-25 22:04:29
JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试。无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎。不管是工作还是面试中,JVM都是必考题。如果不懂JVM的话,薪酬会非常吃亏。其实学习JVM并不仅仅可以用于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。 JVM的优势 想要告别增删改查和简单开发,而是去做Java性能分析和调优工作,那么JVM绝对是一把助力的利剑。对于Java开发者而言,只有熟悉底层虚拟机的运行机制,才能通过JVM日志深入到字节码的层次去分析排查问题,发现隐性的系统缺陷,进而提升系统性能。 学习JVM的原因,本质是让你了解Java程序是如何被执行且优化的。这样一来,你才可以从内部入手,达到高效编程的目的。同时,你也可以为学习更深层、更核心的Java技术打好基础,且对于面试JVM时阿里是100%必问常问的高频点之一。 于是,一位有着十余年经验的互联网分布式高并发技术老兵,梳理自己多年 JVM 实战经验,写了这本书【实战Java虚拟机】,以帮助更多工程师更快,更深入的了解 JVM 作者注重理论联系实际,对于理论性较强的知识点安排了大量的实践案例来说明和进行实际操作,具有非常强的实践指导意义 书籍内容共分为十一个章节 第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。 第4

Java 字节码

こ雲淡風輕ζ 提交于 2020-02-25 20:38:32
Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于Java语言的深度理解和运用,毕竟是很少会有人涉及的话题。InfoQ中文站特地邀请IBM高级工程师成富为大家撰写这个《Java深度历险》专栏,旨在就Java的一些深度和高级特性分享他的经验。 在一般的Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其“ 编写一次,到处运行(Write once, run anywhere) ” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码

阿里架构师都离不开这一份深入浅出JVM教程PDF文档

柔情痞子 提交于 2020-02-25 20:06:38
JVM虚拟机,就像是古代大侠的内功心法,只有招数没有内功是不行的!我们Java程序员想要快速提升,最离不来的就是JVM! Java虚拟机是一个执行其他程序的程序。这是一个简单的想法,但这也是最伟大的编程想法之一。它打破了当时的编程技术状况,直到今日,仍然支持着程序设计上的革新。 你是否经历过这样的场景: 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就...... 想解决线上JVM GC问题,但却无从下手。 每次面试之前都要重新背一遍JVM的一些原理概念性的东西, 然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC,OOM等问题,一脸懵圈! 大多数同学学习JVM面临的痛点: 市面上真正适合大家学习的JVM资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,相信大多数同学看完这些书基本都是从入门到放弃。学透JVM难道就真的就没有一种适合大多数同学的方法吗? 今天我就给大家带来这一份深入浅出JVM教程PDF文档资料,相信能让同学们快速从原理到实践掌握JVM! 头条的篇幅有限,详细的内容大家可以来找我获取到之后去阅读,文档的获取方式: 点赞评论留言+转发文章+关注我后私信回复【学习】即可免费获取我这样一份文档资料! 其实,都知道JVM很重要,但就是觉得太难了。但如果按照这份文档进行系统的学习

jvm-类的装载

空扰寡人 提交于 2020-02-25 19:37:32
类的装载经过加载 、连接(验证、准备、解析)、初始化过程,最后转化为Class对象,存在方法区中。 1、类在什么情况下才会被装载? 1、创建类的实例:new关键字,反射、克隆、反序列化。 2、当调用类静态方法:使用了字节码invokestatic指令。 3、当使用类的静态字段时(final常量除外),比如使用了getstatic或者putstatic指令。 4、初始化子类时要求先初始化父类。 5、含有main方法的那个类。 上面的几种情况都属于主动使用,除了主动使用还有被动使用,被动使用不会引起类的初始化。 主动使用示例: public class Parent { static { System . out . println ( "parent init" ); } } public class Child extends Parent { static { System . out . println ( "child init" ); } } public class InitMain { public static void main ( String [] args ) { Child c = new Child (); } } ​ 运行结果: parent init child init 使用new关键字创建类的实例会装载相关类,以及在初始化子类时,必须先初始化父类。

JVM的判断对象是否已死和四种垃圾回收算法总结

感情迁移 提交于 2020-02-25 19:09:13
面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸、饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾。判断对象是否已死有引用计数算法和可达性分析算法。 1.引用计数算法 给每一个对象添加一个引用计数器,每当有一个地方引用它时,计数器值加 1;每当有一个地方不再引用它时,计数器值减 1,这样只要计数器的值不为 0,就说明还有地方引用它,它就不是无用的对象。如下图,对象 2 有 1 个引用,它的引用计数器值为 1,对象 1有两个地方引用,它的引用计数器值为 2 。 这种方法看起来非常简单,但目前许多主流的虚拟机都没有选用这种算法来管理内存,原因就是当某些对象之间互相引用时,无法判断出这些对象是否已死,如下图,对象 1 和对象 2 都没有被堆外的变量引用,而是被对方互相引用,这时他们虽然没有用处了,但是引用计数器的值仍然是 1,无法判断他们是死对象,垃圾回收器也就无法回收。 2.可达性分析算法 了解可达性分析算法之前先了解一个概念——GC Roots,垃圾收集的起点,可以作为 GC Roots 的有虚拟机栈中本地变量表中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中 JNI(Native 方法)引用的对象。 当一个对象到 GC Roots 没有任何引用链相连(GC Roots

JVM原理及性能调优

浪尽此生 提交于 2020-02-25 15:26:08
一、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。 二、JAVA代码编译和执行过程 Java代码编译是由Java源码编译器来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制; 类加载机制; 类执行机制。 Java源码编译机制 Java 源码编译由以下三个过程组成:分析和输入到符号表;注解处理;语义分析和生成class文件 流程图如下所示: 最后生成的class文件由以下部分组成: 结构信息: 包括class文件格式版本号及各部分的数量与大小的信息 元数据:

Java基础(一)语法基础

自闭症网瘾萝莉.ら 提交于 2020-02-25 01:45:00
文章目录 大纲 1.Java语言及JVM 什么是JDK、JRE、JVM,及其之间的关系: java编译运行原理 2.数据类型 3.运算符 赋值运算中的类型转换 4.流程控制 知识点 if语句 switch语句 循环语句 for each* break 与 continue 5.数组 使用过程 数组初始化 1)动态初始化 2)静态初始化 其他 6.方法 定义 方法调用之方法调用图解 方法的重载overload 方法的重写* 7.各类关键字* 大纲 1.Java语言及JVM 知识点: 1)什么是Java语言: Java是跨平台的纯面向对象的语言 2)JVM概念: JVM是运行在操作系统之上,是一个可以运行java代码的虚拟计算机; 对于不同的平台,有不同的虚拟机,其屏蔽了底层运行平台的差别,实现了“一次编译,导出运行”。 什么是JDK、JRE、JVM,及其之间的关系: JDK(Java Development Kit,Java开发工具包): 包含JRE以及一些开发工具 面向开发人员使用(开发用的) JDK:javac.exe:编译工具, java.exe:运行工具 JRE(Java Runtime Environment,Java运行时环境): 包含JVM以及一些核心的运行类库,面向运行人员使用(运行用的) 核心类库,简单理解就是已经写好的java代码(eg

【2019秋冬】【面经】JVM

血红的双手。 提交于 2020-02-25 01:18:29
Java运行时数据区/内存区域 程序计数器 虚拟机栈 基本数据类型和对象引用 Java堆 对象实例及数组 本地方法栈 native方法 方法区 被虚拟机加载的类,静态变量,常量,编译后代码 判断常量是废弃常量 看这个常量是否还被引用 判断类是无用类 1.该类不存在任何实例 2.该类的类加载器已经被回收 3.无法通过反射的方法调用该类 垃圾收集算法,特点 1.标记清除 常用于老年代,把要回收的进行标记,标记完成后统一回收 2.标记整理 用于老年代,把存活的统一向一边移动,按边界清除回收 3.复制算法 分两半,当一半快满时,把存活的移动至另一半 4.分代算法 把Java堆分为新生代和老年代 1/3 2/3 新生代按8:1:1的Eden和Survivor,每次使用一个Eden和一个Survivor,当快满时,把所有存活的放入另一块Survivor,另外两块清空 新生代没更新一次就+1,当达到15时自动转化为老年代 HotSpot为什么要分老年代新生代 对不同的代可以采用不同的回收算法,效率更高 常见垃圾收集器 Serial 单线程,新生代 ParNew 多线程,新生代,和CMS一起用 Parallel Scavenge 多线程,新生代,考虑吞吐量 Serial Old 单线程,老生代 Parallel Old 多线程,老生代 CMS 老生代,初始标记,并发标记,重新标记,并发清理 G1

JVM学习笔记---垃圾收集

早过忘川 提交于 2020-02-25 00:18:39
文章目录 3.1 垃圾收集(Garbage Collection)关注的问题 3.2 对象存活判断算法 3.2.1 引用计数算法 3.2.2 可达性算法分析(Rechbility Analysis) 3.2.3 再谈引用 3.2.4 生存还是死亡 3.2.5 回收方法区 3.3 垃圾收集算法 3.3.1 标记-清除算法(Mark-Sweep) 3.3.2 标记-整理算法(Mark-Compact) 3.3.3复制算法 3.3.4 分代收集算法(Generational Collection) 3.4 垃圾收集器 3.4.1 Serial 收集器 3.4.2 ParNew 收集器 3.4.3 Parallel Scavenge 收集器 3.4.4 Serial Old 收集器 3.4.5 Parallel Old 收集器 3.4.6 CMS 收集器 3.4.7 G1 收集器 3.5 内存分配策略 3.5.1 对象优先在Eden分配 3.5.2 大对象直接进入老年代 3.5.3 长期存活的对象进入老年代 3.5.4 动态对象年龄判定 3.5.5 空间分配担保 3.1 垃圾收集(Garbage Collection)关注的问题 哪些内存需要回收? 什么时候回收? 如何回收?  程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡,内存的分配和回收具备 确定性 ,所以回收比较方便