JVM培训序幕篇】的更多相关文章

明天老王要给我们讲JVM的知识,提前发了一个小Demo给我们看,代码如下: package demo; import java.util.*; public class Demo { public static class SkuKey { private String category; private String skuProperties; public SkuKey(String category, String skuProperties) { this.category = cat…
JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇 作为一个使用Java语言开发的程序员,我们都知道,要想运行Java程序至少需要安装JRE(安装JDK也没问题).我们也知道我们Java程序员编写的程序代码文件是*.java的,而JRE运行的是*.class的文件.所以,我们需要将java文件编译成class文件然后才可以.那么,你有没有想过,一个java文件是怎么运行起来的呢?中间都经历了哪些环节呢?我们都知道JVM是Java虚拟机,那么,有没有思考过JVM的内存模型是什么呢?我们n…
很精彩的一次内部分享,介绍了大部分的GC算法理论知识,JVM博大精深,本篇文章只是结合本次内部分享总结的一些理论知识,如果有大佬有疑问,欢迎留言指出! Concurrent:并发,程序一边运行一边做GC Parallel:并行,一块区域,一个人做清扫,需要100s,但是把区域分成两块,用两个人扫,时间就缩短了一半:所以GC算法有并行的,有不是并行的,这些都是可以根据自己的实际业务去选择的,只有最适合自己的GC算法: Stop The World:简称STW,某些GC算法当中,当需要做GC的时候,…
在<初步了解JVM第一篇>和<初步了解JVM第二篇>中,分别介绍了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下:执行引擎:负责解释命令,提交给操作系统执行. 启动类加载器(Bootstrap) 扩展类加载器(Extension) 应用程序类加载器(AppClassLoader) 用户自定义加载器(User-Defined) 执行引擎:负责解释命令,提交给操作系统执行. 本地接口:目的是为了融合不同的编程语言提供给Java所用,但是企业…
注:一下内容主要结合<深入理解JVM>3th总结而来. 接上一篇,我们来说说G1,G1作为现在的主要的JVM GC,被作为各大互联网主要使用的垃圾回收器,了解G1回回收原理和回收过程,才能帮组我们更好的定位问题,解决问题. -XX:+UseG1GC开启G1 GC G1内存划分 G1看起来和CMS比较类似,但是实现上有很大的不同. 传统分代GC将整体内存分为几个大的区域,比如Eden,S0,S1,Tenured等. 而G1将内存区域分为了n个不连续的,大小相同的Region,Region具体的大…
本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 引言 相信做 Java 开发的同学,对 IDEA 这个工具应该都不陌生,即使不使用 IDEA 做开发,那么对 Eclipse 这个工具应该也不会陌生,如果这两个都不用的同学,我就想弱弱问一句,您不会是在使用记事本吧? 上面除了那个记事本,我相信所有的同学都对 IDEA 或者说 Eclipse 这两个工具的打开速度深有印象吧. 只要你没自己改过启动参数,不管电脑多高的配置,我相信这个打开速度应该都快不到哪去. 前面写了这么多篇的 JVM…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.对象的实例化 在平常写代码的过程中,我们用class关键字定义的类只是一个类的模板,并没有产生类的对象,也没有分配内存.想要分配内存产生类对象,就要使用到一些创建对象的方式,比如常见的new关键字,虚拟机遇到new关键字,就会在内存中分配此类的内存空间,有了内存空间就可以往里面放定义好的数据并可以进行方法的调用,这就是对象的实例化. 创建对象的方式 (1).new 的方式 ①n…
内存布局**** ​ JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的稳定高效运行.不同的JVM对于内存的划分方式和管理机制存在部分差异.结合JVM虚拟机规范,一起来探讨jVM的内存布局.如下图所示: Heap 堆区 ​ Heap堆区是Java发生OOM(Out Of Memory)故障的地方,堆中存储着我们平时创建的实例对象,最终这些不再使用的对象会被垃圾收集器回收掉,而且堆是线程共享的.一般情况下,堆所占用的内存空间是JVM内存区域中最大的,我们在平时编码中…
1. jre的运行时主要jar文件rt.jar都很大,这导致了用java做的桌面客户端程序很难发布绑定jre发布.这在很大程度上限制了java桌面软件 的分发.可是,jre并不是在所有的用户计算机上都有安装,即使安装了,也未必我们期望的版本.因此,对jre做精简,减少体积是有必要的.请你给出一个 方案,来说说如何给jre减肥,以方便我们的桌面程序绑定jre发布.并给出一个基本的实现.对这个实现的要求是:对于任意给定java程序A,应用你的 方案和实现,可以从一个完整的jre中,抽取这个程序A的必…
内存模型 JDK1.6  JDK1.8  线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) 程序计数器 线程私有 两个作用 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行.选择.循环.异常处理. 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了. 程序计数器是唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期随着线…
本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 什么是类的加载? 类的加载指的是将类的 .class 文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的 Class 对象, Class 对象封装了类在方法区内的数据结构,并且向 Java 程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个类被 「首次主动使用」 时再加载它, JVM…
本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 可视化工具 在 JDK 中为我们提供了大量的 JVM 故障处理工具,都在 JDK 的 bin 目录下: 这其中除了大量的命令行工具以外,还为我们提供了更加方便快捷的可视化工具,主要是以下这 4 个: JConsole: 最古老的工具,早在 JDK 5 时期就已经存在的虚拟机监控工具. JHSDB: 名义上在 JDK 9 中才正式提供,但之前已经以 sa-jdi.jar 包里面的 HSDB(可视化工具) 和 CLHSDB(命令行工具)…
本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 引言 虽然我们前面介绍了各种图形化 JVM 故障处理工具,但是很多情况下,我们在处理问题的时候并没有图形化的操作环境可以使用,这时候,就需要用到 JDK 为我们提供的命令行工具了. 2. jps: 虚拟机进程状况工具 jps 绝对是使用频率最高的 JDK 命令行工具,它的作用是可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( Main Class , main() 函数所在的类)名称以及这些进程的本地虚拟机唯一 ID ( LVMI…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 1.垃圾 1.1.什么是垃圾 垃圾(Garbage)在Java语言中是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾. 如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占用的内存空间就会一直保留到应用程序结束,被保留的空间也无法被其他对象所使用,极可能导致内存溢出. 1.2.垃圾回收 垃圾回收(Garbage Collection)即常说的GC.GC的作用就…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 执行引擎是Java虚拟机中的核心组成部分. 执行引擎的作用就是解析虚拟机字节码指令,即执行一条条的代码流程,并得到执行结果. 我们可以先来看一下执行引擎在Java虚拟机中的位置, 可以看出,一个Java线程就是一个执行引擎的实例.则在一个JVM实例中就会有很多个执行引擎在工作,可能有的在执行我们编写的应用程序,有的在执行JVM内部程序,如垃圾收集器等. 1.执行引擎的工作过程 "虚…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.栈.堆.方法区的关系 虚拟机运行时的数据区如下所示: 即方法区是属于线程共享的内存区域. 我们可以通过如下代码来简单分析方法区和栈.堆之间的关系. 有代码: Person person = new Person(); 其对应关系图如下: 即源程序代码运行后,字节码文件中的Person类的元数据被虚拟机加载后放在了方法区.类加载的最终产物,一个对象实例new Person(),则…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操作系统的进程),一个进程对应着一个JVM实例.而一个JVM实例就对应着一个运行时数据区,则其中就包含着一个堆空间.一个进程中的多个线程共享这个堆空间. 几乎所有的对象实例和数组都在堆上分配内存(并非所有的对象都是在堆上分配内存,后面会提到这一特殊情况),即堆空间存储着绝大部分的对象.虚拟机栈中的栈帧…
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在执行Java程序时,会把它所管理的内存划分为不同的数据区域,即运行时数据区.有些数据区域是线程共享的,即这些区域会随着虚拟机的启动而创建,随着虚拟机的关闭而销毁.而另一些区域则是与线程对应,属于线程私有的.这些区域会随着线程开始而创建,随着线程的结束而销毁. 具体的划分如下: 多个线程共享的:堆.方…
今天第一次使用虚拟姐打断点,断点设置在了void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState tos_out) 了 在TemplateInterpreterGenerator.cpp中,这个函数之前看书就不太懂,现在debug时候就能分析的比较清楚了,这个函数的介绍在解密jvm的528页中有具体介绍 void TemplateInterpreterGenerator::generate_and…
JVM虚拟机基础 JVM虚拟机结构 vm的整体结构大致如下: 类加载器:类加载器用来加载Java类到JVM虚拟机中,源代码程序.java文件在经过编译器编译之后就被转换成字节代码.class文件,类加载器负责读取字节代码,并转换成java.lang.Class类的一个实例. 运行时数据区 元数据区:JDK1.8开始的说法,之前称为方法区Method-Area,存储已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据. 堆区:所有线程共享的一块内存区域,虚拟机启动时被创建用来存放对…
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 基础概念 一般JVM调优,重点在于调整JVM堆大小.调整垃圾回收器 jvm调优的目的是,减少full gc.降低gc停顿时间.提高吞吐量:调优的顺序="提高吞吐量">"降低gc停顿时间":在满足吞吐量的前提下,再降低gc停顿时间:若不能同时满足以上,则选择最适合系统的一种调优结果 JVM调优常用参数 -Xmx1024m:最大堆内存,当…
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 基础概念 GC=jvm垃圾回收,垃圾回收机制是由垃圾回收器Garbage Collection来实现的.进行GC的线程是后台的守护进程(后台运行.执行特定任务),它是一个低优先级进程:当可用内存低到一定程度时,自动运行(自启),从而实现对内存的回收,故垃圾回收的时间不确定: 浮动垃圾:jvm回收垃圾的同时,垃圾还在尝试产生,这些就是"浮动垃圾",即"…
https://www.cnblogs.com/xrq730/category/731395.html…
垃圾收集算法 标记-清除算法 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 缺点: 效率问题: 空间问题(标记清除后会产生大量不连续的碎片) 复制算法 它可以将内存分为大小相同的两块,每次使用其中的一块.当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉. 缺点: 消耗内存 标记-整理算法 根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接…
垃圾收集器 Serial 收集器 单线程收集器,不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束. ParNew 收集器 Serial 多线程版本. 新生代采用复制算法,老年代采用标记-整理算法. Parallel Scavenge 收集器 使用复制算法的多线程收集器. 关注点是吞吐量. 新生代采用复制算法,老年代采用标记-整理算法. Serial Old 收…
类加载过程 系统加载 Class 类型的文件主要三步 加载 通过全类名获取定义此类的二进制字节流 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表该类的 Class对象,作为方法区这些数据的访问入口 连接 验证 准备 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段 初始化零值, fianl 关键字修饰的会直接赋值,如 fianl int value = 111,则初始化为111,否则是0 解析 虚拟机将常量池内的符号引用替换为直接引用的过程 解析动作主要针对…
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量/方法,都需要在类信息已经加载进入内存的前提下.在Java虚拟机规范中,类加载过程也就是类的生命周期包括7个部分:加载.验证.准备.解析.初始化.使用.卸载.不过我们先不写这几个阶段,先讲讲类加载器的知识,然后再来看具体的类加载过程. 1. 类加载器 关于类加载器,我主要关注两个方面,一是类加载器的…
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎会好些,所以这篇改成详解字节码. 由于Java纯面向对象的特性,字节码只要能表示一个类的信息,就可以表示整个Java程序了,JVM只要能加载一个类的信息,就能加载整个程序了.所以,不管是字节码,还是JVM加载机制,关注点都是在类.我关注的点主要在于: 1. 由于字节码不是一次性全部加载进入内存,那么…
记录于 2022-01-02  17:25:12  GhostFace 1. 什么是JVM? 概念 来自百度百科 JVM是 Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(…