- 博客(364)
- 收藏
- 关注
原创 15. 栈帧
以下内容来自 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6 自己翻译概述栈帧被用来存储数据和局部结果以及执行动态链接,方法和调度时异常的返回值。每次调用方法的时候都会创建一个新的栈帧,当方法调用结束的时候栈帧也随即被销毁,无论这个方法成功与否(会抛出未捕获的异常)。栈帧是被jav...
2020-02-20 13:15:48
499
原创 14. 三个字节码分析
第一个字节码分析package com.zj.study.jvm.bytecode;/* javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。 -v -verbose,输出附加信息(包括行号、本地变量表,反汇编等详细信息) -c,对...
2020-02-20 13:06:12
677
原创 13. 字节码文件解析
魔数魔数:所有的.class字节码文件的前4个字节都是魔数,魔数值为固定值:0xCAFEBABE版本信息魔数之后的4个字节为版本信息,前2个字节是次版本号(minor version),接下来2个字节是主版本号(major version)。主版本52对应的是java8(1.8)。minor version是0,major version是52,所以,该文件的版本号为1.8....
2020-02-20 13:00:15
527
原创 12. 字节码整体结构
字节码整体结构https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html 官网帮助文档Java字节码整体结构图3. Java字节码整体结构.png对于图的解释说明类型名称数量u4(表示占据4个字节)magic(魔数)1u2minor_version(次版本号)1...
2020-02-20 12:56:13
332
原创 11. 类的卸载
类的卸载当某一个类如MySample类被加载、连接和初始化后,它的生命周期就开始了。当代表MySample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,MySample类在方法区内的数据也会被卸载,从而结束MySample类的生命周期一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期由Java虚拟机自带的类加载器所加载的类,在虚...
2020-02-20 00:43:14
367
原创 10. 线程上下文类加载器
概述当前类加载器(Current ClassLoader):加载当前类的类加载器每个类都会使用自己的类加载器(即加载自身的类加载器)来去加载其他的类(指的是所依赖的类)如果ClassX引用了ClassY,那么ClassX的类加载器(加载ClassX的类加载器)就会去加载ClassY(前提是ClassY尚未被加载)线程上下文类加载器(Context ClassLoader)定...
2020-02-19 23:56:39
399
原创 09. 类加载器命名空间
命名空间每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类关于命名空间,看几个例子首先分别定义MyCat、MySample、MyClassLoader类package com.zj.study.jvm.c...
2020-02-19 13:22:30
232
原创 08. 双亲委派模型
双亲委派模型在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都有且只有一个父加载器某一个类加载器想要加载一个特定的类,并不是立刻由自己加载,而是把这个加载的动作委托给自己的父亲完成,父亲上面还有父亲,再委托给父亲的父亲完成,一直往上追溯到最顶层的根类加载器,由根类加载器尝试加载需要的.class文件,如果根类加载器加载不成功,则把流程往...
2020-02-19 12:04:38
151
原创 07. 自定义类加载器
第一个自定义类加载器继承抽象类ClassLoaderpublic class MyTest16 extends ClassLoader{}定义classLoaderName,fileExtension两个成员变量public class MyTest16 extends ClassLoader{ // 类加载器名字 private String...
2020-02-19 11:18:11
131
原创 06.类加载器负责的范围
类加载器负责的范围,首先看张图003. 各类加载器范围.png通过代码验证如下结论public class MyTest18 { public static void main(String[] args) { System.out.println(System.getProperty("sun.boot.class.path")); ...
2020-02-19 09:54:42
363
原创 05. 类加载器
类加载器类加载器用来把类加载到Java虚拟机中,从JDK1.2版本开始,类的加载过程采用双亲委派机制,这种双亲委派机制能更好地保证Java平台的安全,在此机制中,除了Java虚拟机自带的根类加载器之外,其余的类加载器都有且只有一个父类加载器,当Java程序请求加载器loader1加载Sample类时,loader1首先委托自己的父加载器去加载Sample类,若父加载器能加载,则有...
2020-02-19 09:29:59
233
原创 03. 类连接
类连接阶段分类验证:确保被加载的类的正确性准备:为类的静态变量分配内存,并将其初始化为默认值解析:把类中的符号引用转换为直接引用类被加载后,就进入连接阶段,连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去验证类的验证的内容类文件的结构检查语义检查字节码验证二进制兼容性的验证类的准备在准备阶段,Java虚拟机为类的静态变量分配内存,...
2020-02-11 10:27:19
390
原创 02. 类的加载
类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存中创建一个java.lang.Class对象(规范并未说明Class对象位于哪里,HotSpot虚拟机将其放在了方法区中)用来封装类在方法区的数据结构类的加载的最终产品是位于内存中的Class对象Class对象封装了类在方法区内的数据结构,并且向Java程序员提供...
2020-02-11 10:27:09
177
原创 01. 类加载相关概念
Java虚拟机与程序的生命周期在如下几种情况下,Java虚拟机将结束生命周期执行了System.exit()方法程序正常执行结束程序在执行过程中遇到了异常或错误而异常终止由于操作系统出现错误而导致Java虚拟机进程终止类的生命周期1. 类生命周期.png在Java代码中,类型的加载(class interface enum)的加载、连接与初始化过程都...
2020-02-11 10:26:54
151
原创 04. 类初始化
类的初始化步骤假如这个类还没有被加载和连接,那就先进行加载和连接假如这个类存在直接父类,而且这个父类还没有被初始化,那就先初始化直接父类假如类中存在初始化语句,那就依次执行这些初始化语句类的初始化时机主动使用(七种)创建类的实例访问某个类或接口的静态变量,或者对该静态变量赋值调用类的静态方法反射(如Class.forName("com.test.Test")...
2020-02-11 10:26:36
191
原创 16. Hadoop RPC 使用概述
下图给出了DFSClient调用ClientProtocol.rename()方法的流程图15. ClientProtocol.rename()调用流程图.png首先看下RPC协议的定义部分。ClientProtocol协议定义了HDFS客户端与Namenode交互的所有方法,但是ClientProtocol协议中的方法的参数是无法在网络中传输的,需要对参数进行序...
2019-12-20 23:35:15
299
原创 15. Hadoop RPC框架之服务端Stub
服务端Stub程序会将通信模块接收的数据反序列化,然后调用服务程序对应的方法响应这个RPC请求。具体来说,就是Server类是服务端从网络接收RPC请求的类,成功接收一个RPC请求后,Server会调用call()方法响应这个请求RPC.Server.call()实现了父类Server的抽象方法call()。RPC.Server.call()代码如下所示public Writa...
2019-12-19 13:42:17
247
原创 14. Hadoop RPC框架之客户端Stub
客户端的Stub可以看作是一个代理对象,它会将请求程序的RPC调用序列化,并调用Client.call()方法将这个请求发送给远程服务器,这些请求对于对于客户端调用程序是完全透明的。客户端Stub程序做的第一件事就是将RPC请求序列化,Hadoop 2.X默认使用protobuf作为序列化工具,当然Hadoop RPC框架也支持其他的序列化框架。Hadoop定义了RpcEngin...
2019-12-18 11:36:09
438
原创 13. Hadoop RPC框架之通信模块
Hadoop作为分布式存储系统,各个节点之间的通信和交互是必不可少的,所以需要实现一套节点间的通信交互机制,Hadoop框架并没有使用JDK自带的RMI(Remote Method Invocation,远程方法调用),而是基于IPC(Inter-Process Communications,进程间通信)模型实现了一套高效的轻量级RPC框架,这套RPC框架底层采用了JavaNIO、...
2019-12-17 19:27:58
263
原创 12. RPC框架结构
RPC(Remote Procedure Call Protocol,远程过程调用协议)是一种通过网络调用远程计算机服务的协议。RPC协议假定存在某种网络传输协议,如TCP或UDP,RPC会使用这些协议传递RPC请求以及相应信息。RPC协议使得分布式程序的开发更加容易。RPC采用客户端/服务器模式,请求程序就是一个客户端,而服务提供程序就是一个服务端。客户端首先会发送一个有参数的...
2019-12-16 16:41:47
256
原创 11. HDFS主要流程之HA切换流程
在Hadoop 2.X之前,Namenode是HDFS集群中可能发生单点故障的节点,即每个HDFS集群中只有一个Namenode,一旦这个节点不可用,整个HDFS集群就将处于不可用状态。HDFS的高可用(High Availability,HA)方案就是为了解决上述问题而产生的,下图给出了一个HA HDFS集群,图片来源https://issues.apache.org/jira/...
2019-12-15 23:22:00
923
原创 10. HDFS主要流程之Datanode启动、心跳及执行Namenode指令流程
看一下Datanode和Namenode的交互流程,包括Datanode启动时的注册流程、心跳流程、数据块汇报以及增量汇报等流程,如下图所示10. Datanode与Namenode交互流程.pngDatanode启动后与Namenode的交互主要包括三个部分,握手、注册、块汇报以及缓存汇报Datanode启动后会首先通过DatanodeProtocol.ver...
2019-12-14 20:39:23
549
原创 09. HDFS主要流程之客户端追加数据流程
客户端除了可以执行写入新的HDFS文件操作外,还可以打开一个已有文件并执行追加写操作,下面是追加写的几个步骤打开已有的HDFS文件客户端首先调用DistributedFileSystem.append()方法打开一个已有的HDFS文件,append()方法会先调用ClientProtocol.append()方法获取文件最后一个数据块的位置信息,如果文件的最后一个数据块已经...
2019-12-13 10:55:53
643
原创 08. HDFS主要流程之客户端写流程
下图是客户端写流程图9. HDFS主要流程之客户端写流程.png主要有以下几个步骤创建文件HDFS客户端写一个新文件时,会首先调用DistributedFileSystem.create()方法在HDFS文件系统中创建一个新的文件。这个方法底层会通过调用ClientProtocol.create()方法通知Namenode执行对应的操作,Namenode会首...
2019-12-12 21:17:44
227
原创 07. HDFS主要流程之客户端读流程
主要流程如下图所示8. HDFS主要流程之客户端读流程.png分为如下几个步骤打开HDFS文件HDFS客户端首先调用DistributedFileSystem.open()方法打开HDFS文件,这个方法在底层会调用DFSClient.open()方法,该方法会返回一个HdfsDataInputStream对象用于读取数据块。HdfsDataInputStre...
2019-12-12 21:16:57
381
原创 06. HDFS流式接口
DataTransferProtocolDataTransferProtocol是用来描述写入或者读出Datanode上数据的基于TCP的流式接口,HDFS客户端与Datanode以及Datanode与Datanode之间的数据块的传输就是基于DataTransferProtocol接口实现的。HDFS没有采用Hadoop RPC来实现HDFS文件的读写功能,是因为Hadoop ...
2019-12-12 21:16:00
584
原创 05. HDFS RPC接口之InterDatanodeProtocol和NamenodeProtocol
InterDatanodeProtocolInterDatanodeProtocol是Datanode与Datanode之间的接口,主要用于租约恢复操作,具有的方法如下图所示4. InterDatanodeProtocol方法.png只有initReplicaRecovery()和updateReplicaUnderRecovery()两个方法。客户端打开一...
2019-12-12 21:14:19
373
原创 04. HDFS RPC接口之DatanodeProtocol
DatanodeProtocol是Datanode与Namenode间的接口,Datanode会使用这个接口与Namenode握手、注册、发送心跳、进行全量及增量数据块汇报。Namenode会在Datanode的心跳响应中携带Namenode指令,Datanode收到Namenode指令后会执行对应的操作。注意,Namenode向Datanode下发Namenode指令是没有其他任何接口的,只会通...
2019-12-12 09:58:01
466
原创 03. HDFS通信协议之ClientDataNodeProtocol
ClientDataNodeProtocol定义了Client与DataNode之间的接口,具体的方法如下图所示1. ClientDataNodeProtocol方法.pngClientDataNodeProtocol定义的接口可以分为两部分,一部分是支持HDFS文件读取操作的,例如getReplicaVisibleLength()以及getBlockLocalPa...
2019-12-11 10:12:27
626
原创 02.HDFS通信协议之ClientProtocol接口
ClientProtocol定义了所有由客户端发起的、由Namenode响应的操作,这个接口非常大,有80多个方法,把这些方法分为如下几类HDFS文件读相关的操作 HDFS文件写以及追加写的相关操作 管理HDFS命名空间(namespace)的相关操作 系统问题与管理相关的操作 快照相关的操作 缓存相关的操作 其他操作HDFS文件读操作、HDFS文件写与追加写操作、以及命令空间的...
2019-12-10 18:31:15
1780
1
原创 01.HDFS通信协议概述
HDFS通信协议HDFS作为一个分布式文件系统,它的某些流程是非常复杂的,常常涉及Datanode、Namenode、Client三者之间的配合、相互调用才能实现,为了降低节点间代码的耦合性,提高单个节点代码的内聚性,HDFS将这些节点间的调用抽象成不同的接口HDFS节点间的接口主要有两种类型一是Hadoop RPC接口,HDFS中基于Hadoop RPC框架实现的接口二是...
2019-12-09 20:59:52
2018
原创 02. 类加载机制
类加载机制一个类从加载到使用,一般会经历下面这个过程加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载JVM在什么情况下会加载一个类JVM在执行过程中,一般在什么情况下会加载一个类呢?也就是说,啥时候会从 *.class字节码文件中加载这个到内存中,其实就是在你代码中使用到这个类的时候。比如,代码中包含"ma...
2019-12-06 18:04:10
156
原创 01. java代码是怎么运行起来的
java代码是怎么运行起来的编写源代码程序,即*.java打包,打成jar包或者war包,打包过程中,会有编译的过程,将*.java文件编译成 *.class文件JVM其实就是一个进程JVM要运行 *.class 文件中的代码,首先要将这些 *.class文件中包含的类加载进来,此时就会用到类加载器类加载器把编译好的 *.class字节码文件给加载到JVM中,供后续使用...
2019-12-06 17:25:41
106
原创 174、Spark运维管理进阶之作业资源调度动态资源分配原理
什么是动态资源分配spark 1.2开始,引入了一种根据作业负载动态分配集群资源给你的多个作业的功能。这意味着你的作业在申请到了资源之后,可以在使用完之后将资源还给cluster manager,而且可以在之后有需要的时候再次申请这些资源。这个功能对于多个作业在集群中共享资源是非常有用的。如果部分资源被分配给了一个作业,然后出现了空闲,那么可以还给cluster manager的资源池中,并且...
2019-11-05 16:04:15
378
原创 mac 电脑下Virtualbox 折腾记
记录换了mac电脑,又想折腾下大数据,记录下入坑爬坑过程网络设置管理 -> 主机网络管理器,添加仅主机(Host-Only)网络需要使用的网卡偏好设置 -> 网络 添加NAT网络需要的网卡安装虚拟机,网卡设置固定虚拟机ip地址,不让每次重启虚拟机ip地址就变目录/etc/sysconfig/network-scripts/ 下的ifcfg-enp0s3 内容如下...
2019-11-05 16:02:39
554
原创 python 批量文件名的大量重复的字符串
import os #遍历文件夹def listFilename(path1): fileList=os.listdir(path1) for file in fileList: mypath=path1+'/'+file if os.path.isdir(mypath): listFilename(mypath) ...
2019-10-17 20:02:57
293
原创 05.决策树公式推导
ID3决策树信息熵,是度量样本集合纯度最常用的一种指标,其定义如下Ent(D)=−∑k=1∣Y∣pklog2pkEnt(D) = -\sum_{k=1}^{|\mathcal{Y}|}p_{k}\log_{2}p_{k}Ent(D)=−k=1∑∣Y∣pklog2pk其中D={(x1,y1),(x2,y2),⋯ ,(xn,yn)}D=\left \{ (x_{1},y_{1}),...
2019-09-20 10:06:15
1743
1
原创 04. 对数几率回归公式推导
广义线性模型指数族分布指数族(Exponential family)分布是一类分布的总称,该类分布的分布律(或者概论密度函数)的一般形式如p(y;η)=b(y)exp(ηTT(y)−a(η))p(y;\eta ) = b(y)exp(\eta^{\mathrm{T}} T(y)- a(\eta))p(y;η)=b(y)exp(ηTT(y)−a(η))其中,η\etaη称为该分布的自然参...
2019-09-15 13:44:52
1440
2
原创 03. 多元线性回归公式推导
多元线性回归公式推导求解权重w^\hat{w}w^的公式推导推导思路Created with Raphaël 2.2.0开始由最小二乘法导出损失函数$E_{\hat{w}}$证明损失函数$E_{\hat{w}}$是关于$\hat{w}$的凸函数对损失函数$E_{\hat{w}}$关于$\hat{w}$求一阶偏导数令一阶偏导数等于\vec{0}解出$\hat{w}$结束流程图数学符号不能正确...
2019-09-13 22:46:57
1862
原创 02. 一元线性回归公式推导
一元线性回归公式推导求解偏置b的公式推导推导思路Created with Raphaël 2.2.0开始由最小二乘法导出损失函数E(w,b)证明损失函数E(w,b)是关于w和b的凸函数对损失函数E(w,b)关于b求一阶偏导数令一阶偏导数等于0求b结束由最小二乘法导出损失函数E(w,b)最小二乘法是最小化均方误差来进行模型求解的,E(w,b)就是所有样本的均方误差加和,均方误差是真实值yi...
2019-09-13 22:44:30
2379
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人