实战Java虚拟机:JVM故障诊断与性能优化 PDF 超清版

  • 更新时间:
  • 6294人关注
  • 点击下载

给大家带来的一篇关于Java虚拟机相关的电子书资源,介绍了关于Java虚拟机、JVM故障诊断、性能优化方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小35.76MB,葛一鸣编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.5分

编辑推荐

适读人群 :深入理解Java虚拟机实战,涵盖JDK 7到JDK 10,通过200余示例详解Java虚拟机中各种参数配置、故障排查、性能监控以及性能优化,技术全面,通俗易懂
★结构清晰。
采用从整体到局部的视角,每一章节对应单独的知识点,力求展示虚拟机的全貌。
★理论结合实战。
在每一个知识点后,都给出了演示示例供读者参考,帮助读者更好地消化
★专注专业。
对Java虚拟机的原理和实践做了丰富介绍,力求从多角度更专业地对JVM进行探讨。
★通俗易懂。
本书服务于广大虚拟机初学者,简单的白话文风格贯穿全书,使读者少盲点、无盲点。
★技术全面。

内容简介

不管技术如何发展,Java依然是一个充满活力的生态圈,学习Java的人也越来越多,但多数人学习Java虚拟机(JVM)时都会遇到瓶颈。本书将通过200余个示例详细介绍JVM中的各种参数配置、故障排查、性能监控及性能优化,帮助Java人突破瓶颈。
《实战Java虚拟机———JVM故障诊断与性能优化(第2版)》共11章,修订后版本涵盖Java 6~Java 10。第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。第4~5章介绍了垃圾回收的算法和各种垃圾回收器。第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心—Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。
《实战Java虚拟机———JVM故障诊断与性能优化(第2版)》不仅适合Java程序员阅读,还适合工作于Java虚拟机之上的研发人员、软件设计师、架构师阅读。

作者简介

★葛一鸣
51CTO特约讲师,国家认证系统分析师,获得Oracle OCP认证。长期从事Java软件开发工作,对Java程序设计、JVM有深入的研究,对设计模式、人工智能、神经网络、数据挖掘等技术有浓厚兴趣,开设了在线的《深入浅出Java虚拟机——入门篇》培训课程。

目录

  • 第1章 初探Java虚拟机 1
  • 第2章 认识Java虚拟机的基本结构 19
  • 第3章 常用Java虚拟机参数 37
  • 第4章 垃圾回收的概念与算法 60
  • 第5章 垃圾收集器和内存分配 84
  • 第6章 性能监控工具 138
  • 第7章 分析Java堆 205
  • 第8章 锁与并发 257
  • 第9章 Class文件结构 288
  • 第10章 Class装载系统 327
  • 第11章 字节码执行 359
展开阅读
精选笔记:Java高级之虚拟机加载机制的实例讲解

5小时34分钟前回答

Jvm要加载的是二进制流,可以是.class文件形式,也可以是其他形式,按照它加载的标准来设计就不会有太大问题。

以下主要就机制和标准两个问题分析一番:

首先来Java类文件的加载机制 ,跟变量的加载机制类似,它先把Class文件加载入内存,再对数据进行验证、解析和初始化,最终形成虚拟机可以直接使用的Java类型。由于Java是采用JIT机制,所以加载时会比较慢,但优点也明显,具有高度灵活性,支持动态加载和动态连接。

接下来就讲讲类的加载过程:

一个类加载的基本过程是按照下面的顺序 来,但也有不严格按照这个顺序来的,也有打乱顺序来的,如动态加载就得先初始化再解析。

1、加载

由虚拟机自行决定,但也有由于下面的阶段要执行而执行上面阶段的情况。

这时虚拟机会做三件事:

第一、通过全限定名读取文件的二进制流;

第二、把文件里的静态方法和变量放到方法区中;

第三、生成一个对象放入堆中,作为访问入口。

注意第一条,仅是读取二进制流,没说具体从什么文件中读,也没说从哪里读,所以造就Java很强的扩展性,可以从Jar、Zip中,也可以从网络层、数据库层等 。

主要是对象和方法区的声明。

2、验证

确保二进制流符合虚拟机的要求, 不符合会报VerifyError。

第一、文件格式验证,是否有魔数,是否符合Java文件的要求;

第二、元数据验证,是否符合Java代码规范,如abstract类是否直接被实例化,普通类有无间接或直接父类Object等;第三、字节码验证,对数据流和控制流进行分析,保证不会做出危害虚拟机的行为,如 是否调用不存在的指令,是否把父类赋值给子类,是否把对象赋值给一个非此类型的对象等;

第四、符号引用验证,主要是类、变量、方法描述是否能找的到,如全限定名是否能找到该文件,是否具有可访问性等。

主要对内部结构的判定

3、准备

为类变量赋初值,通常为0值如静态变量,而不会为实例变量赋值。

4、解析

将常量池中的符号引用转化为直接引用的过程。这里说的符号引用指变量类型,直接引用指可以直接定位到对象的句柄。类、方法、字段、接口解析,根据全限定名获得相关对象,拿到它的类型,若无对所在类访问权会抛出IllegalAccessError,无字段NoSuchFieldError,无方法NoSuchMethodError,是类不是接口会抛出IncompatibleClassChangeError

5、初始化

根据程序要求加载类和必要的资源。有且仅有四种情况,需要主动初始化后才能执行接下来的操作 ,所以要先执行上面的四步。

第一、有new或static关键字的类,new生成对象,static静态加载,这两个很明显要执行初始化了;

第二、使用类有父类,这没办法了;

第三、反射类里的方法,那肯定要初始化了对不对;

第四、执行的主类,用main方法的类。其他被动初始化的情况不需要考虑。

小例子:

public class SuperClass {
static {
System.out.println(“SuperClass!!”);
}
public static int value = 1;
}
public class SubClass extends SuperClass {
static {
System.out.println(“SubClass!!”);
}
}
public class TestClassLoad {
public static void main(String[] args) {
System.out.println(SubClass.value);
SuperClass superClass = new SubClass();
}
}
SuperClass!!
1
SubClass!!

执行结果说明一个问题: 子类调用父类变量的时候 ,子类没有初始化,因为 此时的代码关系跟子类无关 ;子类初始化的时候,父类也没有再初始化,因为 父类在当前方法体中已经初始化 过了。接口与父类的唯一区别在于, 接口初始化不会要求父接口,只有用到父接口才会初始化 ,同样的都会生成类构造器。

这个时候加载类构造器,会初始化类中所有变量,当然父类先于子类初始化

6、使用

加载完之后,该怎么样调用怎么样调用,绘图啊,计算啊等等

7、卸载

类不再被调用

两个类是否相等,主要在于第一使用同一个加载器加载,第二全限定名地址一致

为什么要提出上面的问题呢?接下来要讲讲虚拟机的一个加载机制。

在java虚拟机的角度来看,有两种类加载器,一种叫系统加载器(Bootstrap ClassLoader),一种叫自定义加载器(extends ClassLoader),这种呢又分为两个,一种叫应用加载器,一种叫扩展类加载器,一般默认为前者;而我们的应用程序加载主要由上面三个加载器相互配合完成的。三者的关系如Application–>Extension–>Bootsrap,双亲委派机制是指两两以组合的方式,子加载器先去调用父加载器的方法,没找到目标对象再去用子加载器

伪代码如下:

loadClass(String name,boolean resolve){
Class c=findLoadedClass()
if(c==null){
if(parent !=null)
c=parent.loadClass(name,false);
c=findBootstrapClassOrNull(name);
}catch(ClassNotFoundException e){ }
if(c==null)
c=findClass(name);
}

Java提倡我们去把自己调用类的逻辑写在findClass里,这样有助于双亲委派机制的正常使用。

破坏1、重写loadClass

破坏2、使用线程上下文加载器去让父加载器去调用子加载器的方法

破坏3、热加载 现在常用的做法是 自定义类加载器并 将原bug模块覆盖-OSGI

但由于自定义加载器之间的规则如果混乱,出现同时互相引用的问题,那么会最终找不到类,而出现线程死锁和内存泄露的问题。

关于热修复,也被称为插件,目前比较流行的有HotFix、Nuwa、DroidFix、AndFix等,这些框架均可以在github或其他地方找到,原理如上,方法多样,有覆盖的、有重定向的等等,通过配置、设置action等方式;而作为插件需要满足以下条件:

1、可以独立安装,但不可独立运行

2、具有向下兼容性,即可拓展性

3、只能运行在宿主程序中,而且可以被禁用、替换

以上这篇Java高级之虚拟机加载机制的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

展开阅读

资源下载

相关资源

  • Java虚拟机精讲

    Java虚拟机精讲

    HotSpotVM是目前市面上高性能JVM的代表作之一,它采用解释器+JIT编译器的混合执行引擎,使得Ja程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了HotSpotVM的方方面面

    大小:75 MBJava虚拟机

    立即下载
  • 深入解析Java虚拟机HotSpot

    深入解析Java虚拟机HotSpot

    编辑推荐 (1)作者是阿里云Java技术专家,热衷于研究编程语言的设计与实现,对Java虚拟机和编译器都有较深入的研究。 (2)深入分析HotSpot VM的核心源码,全面解析运行时、垃圾回收器、即时编译器的实现原理和工作机制 (3)详细描述虚拟机底层实现,同时与上层Java应用和库相结合,为JVM的开发、调优和排错指明方向 内容简介 很多JVM的底层技术细节你是否只了解表面? 面对JVM Crash或性能调优方面的问题时你是否会束手无策? 面对上层Java应用发生

    大小:149 MBJava虚拟机

    立即下载
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

    深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

    大小:253 MBJava虚拟机

    立即下载
  • 揭秘Java虚拟机:JVM设计原理与实现

    揭秘Java虚拟机:JVM设计原理与实现

    《揭秘Java虚拟机》Java工程师高质量成长的必读本,谷歌官方认可的android开发语言Kotlin的基石。看透JVM设计思想与原理,彻底领悟JAVA编程精髓,以不变应万变!

    大小:186.2 MBJava虚拟机

    立即下载
  • Scala与Clojure函数式编程模式:Java虚拟机高效编程

    Scala与Clojure函数式编程模式:Java虚拟机高效编程

    本书向读者展示了如何采用函数式方案来替代或简化面向对象编程中使用的诸多通用模式,同时还介绍了一些在函数式世界中广泛使用的模式

    大小:34 MBJava虚拟机

    立即下载

学习笔记

23小时56分钟前回答

带着新人看java虚拟机01(推荐)

1.前言(基于JDK1.7) 最近想把一些java基础的东西整理一下,但是又不知道从哪里开始!想了好久,还是从最基本的jvm开始吧!这一节就简单过一遍基础知识,后面慢慢深入。。。 水平有限,我自己也是很难把jvm将清楚的,我参考一本书《深入java虚拟机第二版》(版本比较老,其实很多大佬的博客都是参考的这本书的内容。。。),电子档pdf文件链接:https://pan.baidu.com/s/1bxs4i0gnVpz7Lkjl2fxS9g 提取码:n5ou ,有兴趣的小伙伴可以自己下载自己好好看看; 所谓jvm,又名java虚拟机。我们平常写java程序的时候几乎是感觉不到jvm的存在的,我们只需要根据java规范去编写类,然后就可以运行程序了,当然只有我们程……

14小时2分钟前回答

Java虚拟机常见内存溢出错误汇总

一、引言 从事java开发的小伙伴在平时的开发工作中,应该会遇见各式各样的异常和错误,在实际工作中积累的异常或者错误越多,趟过的坑越多,就会使我们编码更加的健壮,就会本能地避开很多严重的坑。以下介绍几个Java虚拟机常见内存溢出错误。以此警示,避免生产血案。 二、模拟Java虚拟机常见内存溢出错误 1、内存溢出之栈溢出错误 package com.jayway.oom; /** * 栈溢出错误 * 虚拟机参数:-Xms10m -Xmx10m * 抛出异常:Exception in thread "main" java.lang.StackOverflowError */ public class StackOverflowErrorDemo { public static void main(String[] args) { stackOverflowError(); } private static void stackOverflowError() { stackOverflowError(); } } 2、内存溢出之……

14小时40分钟前回答

java虚拟机运行时数据区分析

JVMmemorymodel 这篇文章主要介绍在JVM规范中描述的运行时数据区(RuntimeDataAreas)。这些区域设计用来存储被JVM自身或者在JVM上运行的程序所是用的数据。 我们先总览JVM,然后介绍下字节码,最后介绍不同的数据区域。 总览 JVM作为操作系统的抽象,保证同样的代码在不同的硬件或操作系统上的行为一致。 比如: 对于基本类型int,无论在16位/32位/64位操作系统上,都是一个32位有符号整数。范围从-2^31到2^31-1 无论操作系统或者硬件是大字节序还是小字节序,保证JVM存储和使用的内存中的数据都是大字节序(先读高位字节) 不同的JVM实现可能会有些区别,但大体上是相同的。 上图是一个JVM的总览 JVM解释编译器生成……