jvm
文章平均质量分 82
深入理解jvm读书笔记,jvm故障分析与实战笔记,遗漏错误请指出,山人自会修改
文章目录:https://github.com/shiker1996/jvm-knowledge/blob/master/README.md
shiker1996
误人子弟之误人子弟,补更频繁~~~~~
展开
-
从字节码角度看对象创建与参数传递
对象的创建上篇文章从字节码的角度分析了异常处理和线程安全中的原子性,现在我们再从字节码的角度看一下对象的创建是一个怎样的过程,先从一简单的面试题开始。假如有如下方法:public String string() { String str = new String("abc"); return str;}问整个方法用到了哪些运行时数据区域?看到这道题,大...原创 2021-12-09 22:43:20 · 260 阅读 · 0 评论 -
IntegerCache、longCache缓存策略与String.intern()用法说明
一道经典面试题:public class Main { private Integer a = 123; private Integer b = 128; private Long c = 123L; private Long d = 1000L; String str = "abc"; public static void main(String[] args) { Mai...原创 2021-12-15 23:07:11 · 283 阅读 · 0 评论 -
自己动手在Cent OS6.9上编译OPENJDK
之前看jvm的时候就尝试编译一下jdk(为什么要自己编译openjdk呢,一方面可以帮助我们了解jvm的运行机制,另一方面我们可以得到jdk的debug版本,而debug版本的调试工具更丰富),但是时间有限,没成功之后也没再管(考试周。。。==||),今天终于有时间把这个坑补上了。看网上都是ubuntu上编译的jdk,为了不雷同,就换个环境吧。没想到换了个环境之后各种坑都有遇上了,实际上并不一帆风...原创 2022-01-23 23:50:29 · 328 阅读 · 0 评论 -
JVM故障诊断与性能优化--运行时数据区(一)
Java对象之家--Java堆java堆一般被分为新生代和老年代。其中新生代存放新生对象,老年代存放老年对象(年龄判断见深入理解jvm二),新生代有可能分为eden区,s0区,s1区,s0和s1区也被称为from区和to区,他们是两块大小相等、可以互换角色的内存空间(实际上是为了进行垃圾回收,即复制算法)。下面通过示例展示java堆、方法区、java栈之间的关系:public class Simp...原创 2022-01-23 23:49:47 · 363 阅读 · 0 评论 -
JVM故障诊断与性能优化--jvm参数了解(二)
跟踪垃圾回收和类加载信息1.跟踪垃圾回收示例---读懂日志:package chapter3;/** * 创建实例,演示垃圾回收,进行4次minorGC * * @author shiker * 预设参数:-verbose:gc -Xms20M -Xmx20M(设置堆容量为20M) -Xmn10M(新生代容量10M) -XX:SurvivorRatio=8(survivor占比8:...原创 2021-12-18 21:29:31 · 613 阅读 · 0 评论 -
JVM故障诊断与性能优化--垃圾回收概念与算法(三)
认识垃圾回收垃圾:指的是存在于内存中的、不会再使用的对象。如果垃圾不会收会占用大量内存导致内存溢出。常用的垃圾回收算法1.引用计数法只要有其它对象引用了此对象,该对象的引用计数器+1,当引用失效时计数器-1。当计数值为0时,对象就可能不再使用。缺点:无法处理循环引用的情况,加法操作和减法操作对系统性能有影响。2.标记清除法标记阶段,首先通过根节点,标记所有根节点...原创 2021-12-18 21:28:57 · 136 阅读 · 0 评论 -
JVM故障诊断与性能优化-垃圾收集器与内存分配(四)
1.垃圾收集器相关概念见:深入理解jvm--垃圾收集器与内存分配策略(二)垃圾收集器的开关 参数 新生代使用的GC 老年代使用的GC -XX:+UseSerialGC serialGC serialOldGC -XX:+UseParNewGC ...原创 2021-12-18 21:28:21 · 386 阅读 · 0 评论 -
JVM故障诊断与性能优化-性能监控工具(五)
Linux下的性能监控工具1.显示系统整体资源使用情况-top命令2.监控内存和CPU-vmstat命令vmstat 1 3示例1--使用vmstat查看java程序占用内存情况package chapter6;import java.util.Random;//去package名放入linux中运行public class HoldLockMa...原创 2021-12-18 21:28:08 · 161 阅读 · 0 评论 -
jvm故障诊断与性能优化(六)--分析Java堆
找到内存溢出的原因1.堆溢出当对象的大小之和大于由Xmx指定的堆空间大小时,会发生溢出错误。示例1--堆溢出(8G内存环境下)public class SimpleHeapOOM { public static void main(String[] args) { ArrayList<byte[]> list = new ArrayList<byte...原创 2021-12-15 23:08:20 · 507 阅读 · 1 评论 -
AOP的底层实现--ASM
在ASM的核心组件中,Opcodes接口定义了一些常量,尤其是版本号、访问标识符、字节码等信息。ClassReader用于读取Class文件,它的作用时进行Class文件的解析,并可以接受一个ClassVisitor,ClassReader会将解析过程中产生的类的部分信息,比如访问提示符、字段、方法逐个送入ClassVisitor,Class Visitor在接受到对应的类信息后,可以进行各自的处...原创 2021-12-15 23:08:07 · 344 阅读 · 0 评论 -
jvm运行时数据区与内存管理机制
提纲运行时内存区域 1.程序计数器 1. 当前线程所执行的字节码的行号指示器。 2. 如果线程郑在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器的值则为空。 3. 此内存区域是唯一一个在Java虚拟机规范中没有定义任何out of memory情况的区域 2. Java虚拟机栈 1. 每个方法在执行时都会创...原创 2022-01-23 23:50:48 · 222 阅读 · 2 评论 -
jvm垃圾收集器与内存分配策略
提纲判断对象的存活状态垃圾收集主要区域:Java堆和方法区。因为只有在程序运行时才能知道创建哪些对象,所以这部分的内存分配和回收都是动态的。1.引用计数算法:定义:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器值就减1;任何时候计数器为0的对象是不可能在被使用的。 优点:实现简单,判定效率高。 缺点:很难解决对象之间相互循环引用的问...原创 2022-01-23 23:50:19 · 255 阅读 · 1 评论 -
虚拟机性能监控与故障处理
提纲JDK的命令行工具1.进程状况查看工具jps -l输出主类的全名 Jps -q省略主类的名称 Jps -m输出进程启动时传递给主类main()函数的参数 Jps -v输出进程启动时jvm的参数2.虚拟机统计信息监视工具jstat [ option vmid [interval(查询间隔)[s|ms] [count(次数)]] ]例:C:\U...原创 2021-12-18 21:29:13 · 437 阅读 · 0 评论 -
JVM调优分析与实战
提纲案例分析1. 高性能硬件上的部署策略 在高性能硬件上部署程序,目前主要有两种方式: 通过使用64位JDK来使用大内存 使用若干个32位虚拟机建立逻辑集群来利用硬件资源。使用64位JDK来使用大内存的缺点:1. 内存回收导致的长时间停顿2. 现阶段,64位JDK的性能测试效果普遍低于32位JDK3. 需要保证程序足...原创 2021-12-18 21:28:42 · 240 阅读 · 0 评论 -
jvm类文件结构
提纲无关性的基石字节码构成了平台无关性的基石虚拟机和字节码存储形式是语言无关性的基础Class文件的结构无符号数:属于基本的数据类型,以u1、u2、u4、u8来分别代表一个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用描述数字、索引应用、数量值或者按照UTF-8编码构成字符串值。表:是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以...原创 2021-12-18 21:27:36 · 111 阅读 · 0 评论 -
jvm类加载机制
提纲类加载的时机类的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。加载、验证、准备、初始化和卸载顺序确定。虚拟机规范严格规定了有且只有5种情况必须立即对类进行初始化:1. 遇到new、getstatic、putstatic或invokestataic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的代码场景是:使...原创 2021-12-18 21:27:24 · 104 阅读 · 0 评论 -
jvm字节码执行引擎
提纲运行时栈帧结构栈帧是用于支持虚拟机进行方法调用个方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始到执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,成为当前栈帧,与这个栈帧相关联的方法称为当前方法。执...原创 2021-12-18 21:26:49 · 301 阅读 · 0 评论 -
jvm类加载与执行子系统
提纲案例tomcat:正统的类加载器结构web服务器要解决的问题:部署在同一个服务器上的两个web应用程序所使用的java类库可以实现相互隔离。部署在同一个服务器上的两个web应用程序所使用的java类库可以实现共享。服务器需要尽可能的保证自身的安全不受部署的web应用程序影响。支持jsp应用的web服务器,大多数需要支持hotspot功能。java类库放置在t...原创 2021-12-15 23:09:59 · 166 阅读 · 0 评论 -
jvm类的早期优化
提纲概述java编译器分类:前端编译器:把*.java文件转变成*.class文件的过程后端运行期编译器(JIT编译器):把字节码转变成机器码的过程静态提前编译器(AOT编译器):把*.java文件编译成本地机器码的过程javac编译器编译过程:解析与填充符号表词法分析:将原代码的字符流转变为标记(Token)集合。程序编写的最小元素是单个字符,编译过程的最小元素是标记。关键字、变量名...原创 2021-12-15 23:09:47 · 108 阅读 · 0 评论 -
jvm晚期优化
提纲即时编译器解释器与编译器解释器优点:解释执行节约时间编译器优点:编译执行提高效率即时编译器:将热点(运行频繁的)代码编译成与本地平台相关的机器码,并进行各层次的优化。完成这个任务的编译器成为即时编译器。hotspot虚拟机内置两个即时编译器,client compiler和server compiler,简称为C1编译器和C2编译器。hotspot会根据自身版本与宿主机的性能自行选择运行模式。...原创 2021-12-15 23:09:33 · 135 阅读 · 0 评论 -
java内存模型
提纲Java内存模型设计规则:这个模型必须定义的足够严谨,才能让java 的并发访问操作不会产生歧义,也必须定义的足够宽松,使虚拟机有足够的自由空间去利用硬件的各种特性来获取更好的执行速度。主内存与工作内存Java内存模型的主要目标时定义程序中各个变量的访问规则,即在虚拟机中将变量(不包括局部变量和方法参数)存储到内存和从内存中取出变量这样的底层细节。Java内存模型规定了...原创 2021-12-15 23:09:15 · 131 阅读 · 0 评论 -
线程安全与锁优化
提纲、1. 锁的基本概念和实现线程安全面向过程的编程思想:把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理数据。面向对象的编程思想:站在现实世界的角度去抽象和解决问题,把数据和行为都看做是对象的一部分。当多个线程访问一个对象时,如果不用考虑这些线程在运行环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其它的协调操作,调用...原创 2021-12-15 23:09:01 · 262 阅读 · 0 评论