JVM底层之类加载器

Hotspot Klass模型——Java类内存表示机制 目录 1、类继承结构 2、MetaspaceObj 3、Metadata 4、Klass 5、InstanceKlass 6、Method 7、Java vtable 8、Java itable 9、InstanceKlass特殊子类 10、ArrayKlass 在分析thread.cpp的create_vm函数中(参考《Hotspot启动和初始化源码解析》)发现... 阅读详情

前言

这篇博客记录下JVM底层的类加载器,关于类加载器网络上有不少博客写到,我这边只是根据自己的理解记录下jvm类加载器的过程,可能不会太详细,只是用于自己平时偶尔翻翻回忆下自己的曾经所获所得。

JVM中的Klass模型

java中的每一个类在JVM中都是以Klass形式存在的,其中包含了元数据信息,包含属性信息、方法信息以及常量池。
Klass的模型结构如下:
在这里插入图片描述
最顶层的父类是MeaSpaceObj,然后元信息类Metadata是子类,而我们的Klass是是MetaspaceObj的子类,上图所描述的类继承关系指的都是C++对实现了JVM的类结构图,其中Klass有两个实现类InstanceKlass和ArrayKlass,
InstanceKlass有三个子类,分别是InstanceMirrorKlass、InstanceRefKlass、InstanceClassLoaderKlass

1.InstanceMirrorKlass:用于表示java.lang.Class,Java代码中获取到的Class对象,实际上就是这个C++类的实例,存储在堆区,学名镜像类
2.InstanceRefKlass:用于表示java/lang/ref/Reference类的子类
3.InstanceClassLoaderKlass:用于遍历某个加载器加载的类

Java中的数组不是静态数据类型,是动态数据类型,即是运行期生成的,Java数组的元信息用ArrayKlass的子类来表示:
1.TypeArrayKlass:用于表示基本类型的数组
2.ObjArrayKlass:用于表示引用类型的数组
比如我们在代码中这样写:

public static void main(String[] args) {
    int [] a = new int[2];
    Test [] tests = new Test[2];
    System.out.println(a);

    try {
        System.in.read();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

其中a和tests都是一个数组,而a是基本类型数组,tests是引用类型数组
在java的字节码中a是newarray类型,tests是anewarray类型,我们看下字节码:

public static main([Ljava/lang/String;)V
    TRYCATCHBLOCK L0 L1 L2 java/io/IOException
   L3
    LINENUMBER 9 L3
    ICONST_2
    NEWARRAY T_INT
    ASTORE 1
   L4
    LINENUMBER 10 L4
    ICONST_2
    ANEWARRAY com/luban/Test
    ASTORE 2
   L5

以上的NEWARRAY T_INT就是a
NEWARRAY T_INT就是tests
我们再来看在jvm中以C++形式存在的类型
我们打开cmd执行java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
打开HSDB jvm调试工具:

在这里插入图片描述

我们启动我们刚刚写的代码找到进程号7172:
在这里插入图片描述

查看我们的main进程的内存堆栈信息:
在这里插入图片描述
最后我们找到PSYounGen[I后面的地址就是我们的int数组
我们拿到INT数组的内存地址*(后面的0x开头的),打开HSDB菜单的Tools下Inspector菜单
然后输入我们的int数组的内存地址:

在这里插入图片描述

可以看到我们的int数组加载到JVM过后,C++对它的处理是类型是TypeArrayKlass,而TypeArrayKlass是Klass的子类,我们从上图也可以看出他们的继承关系;所以TypeArrayKlass其实就是C++用来描述我们JAVA中的基本类型数组的。
同理,我们根据ObjArray找到我们的引用类型的数组:
在这里插入图片描述

可以看到ObjArrayKlass就是用来描述我们java类中引用类型数组
这个就是我们的引用数组tests是ObjArrayKlass
同样的ObjArrayKlass也是Klass的子类

所以我们的int数组在jvm中的存在类型是TypeArrayKlass
引用数组在我们的jvm中存在类型是ObjArrayKlass

在这里插入图片描述
加载:
1、通过类的全限定名获取存储该类的class文件(没有指明必须从哪获取)
2、解析成运行时数据,即instanceKlass实例,存放在方法区
3、在堆区生成该类的Class对象,即instanceMirrorKlass实例

何时加载:
主动使用时

1、new、getstatic、putstatic、invokestatic(字节码层面的指令)
2、反射
3、初始化一个类的子类会去加载其父类
4、启动类(main函数所在类)
5、当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化

预加载:包装类、String、Thread

故:
当我们定义了一个类,在本来中有静态 属性和静态方法,就算这个类有静态代码块,那么我们如果通过类.静态属性或者类.静态方法,如果这些静态的属性或者方法不在本来,是在父类,那么初始化的工作是不会进行的,看下面例子:

public class T0804 {

    public static void main(String[] args) {
        System.out.println(T0804_01.str);
    }

}


class T0804_01 extends T0804_p{


    static {
        str +="#456";
    }

}

class T0804_p{
    public static String  str = "123";
}

最后输出的是123而不是123#456
这个例子就是getstatic
但是如果我们在T0804_p有静态代码块,也会执行静态代码块,而且顺序是先执行,如:

class T0804_p{
    public static String  str = "123";
    static {
        System.out.println("T0804_p init");
    }
}

最后输出
T0804_p init
123
我们再修改下代码如下:

public class T0804 {

    public static void main(String[] args) {
        new T0804_01();
        System.out.println(T0804_01.str);
    }

}


class T0804_01 extends T0804_p{

    public T0804_01(){
        System.out.println("T0804_01 ..");
    }

    static {
        System.out.println("T0804_01 init...");
        str +="#456";
    }

}

class T0804_p{
    public static String  str = "123";
    static {
        System.out.println("T0804_p init");
    }
    public T0804_p(){
        System.out.println("T0804_p ...");
    }
}

最后输出:
T0804_p init
T0804_01 init…
T0804_p …
T0804_01 …
123#456
所以当通过new初始化一个类的时候
1.先初始化父类的静态代码块;
2.再初始化本类的静态代码块;
3.然后又初始化父类的构造;
4.最后初始化自己的构造;
而调用static的时候就要判断你调用的这个类中的某个属性或者方法是否在本类,如果在父类,那么只会初始化父类的静态代码块,不会初始化本类的静态代码块,比如:

public class T0804 {

    public static void main(String[] args) {
        System.out.println(T0804_01.getstr());
    }

}


class T0804_01 extends T0804_p{

    public T0804_01(){
        System.out.println("T0804_01 ..");
    }

    static {
        System.out.println("T0804_01 init...");
        str +="#456";
    }

}

class T0804_p{
    public static String  str = "123";
    static {
        System.out.println("T0804_p init");
        str="1111";
    }

我们通过T0804_01.getstr()调用静态犯法getstr(),而getStr这个方法没有在T0804_01中,而是在它的父类T0804_p中,所以调用完成过后,不会执行T0804_01中的静态代码块,只会执行父类的静态代码块,最后输出如下:
T0804_p init
1111

验证

1、文件格式验证
2、元数据验证
3、字节码验证
4、符号引用验证

准备

为静态变量分配内存、赋初值

实例变量是在创建对象的时候完成赋值的,没有赋初值一说
如果被final修饰,在编译的时候会给属性添加ConstantValue属性,准备阶段直接完成赋值,即没有赋初值这一步

初始化

执行静态代码块,完成静态变量的赋值

静态字段、静态代码段,字节码层面会生成clinit方法
方法中语句的先后顺序与代码的编写顺序相关

何时解析

思路:
1、加载阶段解析常量池时
2、用的时候

还有一个比较经典的知识点就是我们我们要使用一个类的时候,什么情况下这个类加载了要执行静态代码块,那些情况不执行,我们都知道我们手动加载一个类的时候常用的有两种,
用Class.forName和ClassLoader中的loadClass

1. Class<?> clzz = T0804.class.getClassLoader().loadClass("com.luban.t0806.T0804_p");

   2.Class<?> clzz2 = Class.forName("com.luban.t0806.T0804_p");

最后只有2能初始化T0804_p中静态代码块

所以综上所述:通过Class.forName会加载class的时候是会执行我们的静态初始化操作;
而使用classloader的loadClass仅仅是给我们加载了我们所要求的class,不会执行任何初始化方法

下一篇我们来扯一下类加载系统和SPI机制(文采不行_)

jvm类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。它会通过二进制流的方式获取到字节码文件的内容,然后将获取到的数据交给Java虚拟机。虚拟机会在方法区和堆上生成对应的对象保存字节码信息。 阅读详情

相关推荐

从零到一:STM32CubeMX虚拟串口开发中的常见陷阱与优化策略

本文深入探讨了STM32CubeMX在USB虚拟串口开发中的常见问题与优化策略,涵盖数据流吞吐量瓶颈、实时性约束等核心挑战。通过实战案例和代码示例,详细解析了波特率同步异常、数据丢失等问题的解决方案,并提供了DMA配置和中断优先级调优的高级技巧,帮助开发者提升STM32虚拟串口的性能和可靠性。

weixin_29164185的博客 370

JVM

类加载过程 加载 >> 验证 >> 准备 >> 解析 >> 初始化 加载 在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的 main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的 java.lang.Class对象,作为方法区这个类的各种数据的访问入口 验证 校验字节码文件的正确性(cafe babe) 准备 给类的静态变量分配内存,并赋予默认值 解析 将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如

zzuhai的博客 897

DDR5内存ODT模式全解析:5种状态与实战配置指南(附时序图)

本文深入解析DDR5内存的片上终端电阻(ODT)机制,详细阐述了其五种核心状态(终结电阻禁用、RTT_WR、RTT_NOM_RD、RTT_NOM_WR、RTT_PARK)的定义、切换时序与工作原理。通过解读JESD79-5规范中的时序图,并提供基于模式寄存器的实战配置指南与代码示例,帮助硬件工程师和系统开发者优化信号完整性,解决高负载下的稳定性问题,并实现性能与功耗的最佳平衡。

weixin_29221753的博客 562

Java类加载之Class对象到Klass模型

这是没啥用的知识第一篇技术文章,澜叔准备聊一聊Java中的类加载机制。在写Java程序的时候,你不用知道类加载机制是啥,它从哪里来,要到哪里去,虽然这知识没啥用 ,但是,面试(吹水)或许能顶一顶。 每一个Java程序员在刚开始学Java的时候,第一个了解到的,一定是Java的灵魂——JVM。你写的JavaBug,I‘M sorry,Java代码最终一定是经过Java编译器编译成class文件后,交付给JVM进行逻辑执行。 那么你一定一定要疑惑(否则写不下去了),Java类是如何与JVM进行交互的呢.

weixin_37152234的博客 1585

使用C#调用百度地图并实现坐标点的设置以及读取

使用C#调用百度地图申请百度地图密钥以及查看百度API程序实现功能:最终图利用webBrowser控件展示地图 申请百度地图密钥以及查看百度API 网址:http://lbsyun.baidu.com/apiconsole/key#/home 网址:http://lbsyun.baidu.com/jsdemo.htm#c1_3 程序实现功能: 1、输入网址那可以调用本地的html文件,也可以访问其他网站 2、输入坐标、添加坐标按钮,可以将坐标值传入html文件中,显示在经纬度的文本框中 3、定位按钮可以

qq_39261042的博客 3734

matlab处理las点云(1)——las/laz格式解析【2024最新版】

matlab中的las/laz格式解析。博客长期更新,本文最近一次更新时间为:2024年11月9日。

点云侠的博客 8459

JVM第一天学习之类加载

都是一些代码图,然后分析结果 类加载过程 public class Test_1 { public static void main(String[] args) { System.out.printf(Test_1_B.str); } } class Test_1_A { public static String str = "A str"; static { System.out.println("A Static Block");

岁月 526

【PINN物理信息网络】基于PINN物理信息网络结合Wave 2D有限差分方法(python)

【PINN物理信息网络】基于PINN物理信息网络结合Wave 2D有限差分方法(python)

k8291121的博客 1818

Klass模型与类加载的详细机制

klass模型是jvm中的数据类型 这个数据类型表示的是一个java类 java语言是在jvm中运行而jvm是不认识java代码的我们使用javac编译的class文件jvm是不认识的 所以有一个类加载的动作 这个动作就是把class字节码拼装成一个klass类型 这个klass类型是c++中的一个类 klass里面有java类中的所有信息比如它的属性 方法 修饰符等成为类的元信息 这些信息放在元空间中 通过下面的klass类的继承关系图可以看出 metaspace中文意思就是元空间 meatadata

计算机王的博客 2106

软件设计师---计算机系统

软件设计师---计算机系统

我从不打没有准备的仗! 3万+

从Raw图像到超分辨率:真实场景下的图像增强全流程指南

通过本文的学习,您已掌握了利用Raw图像实现真实场景超分辨率的完整技术链——从数据生成的“真实感模拟”,到双分支CNN的“细节+色彩”协同建模,再到模型的训练与落地。本文将带您从理论到实践,掌握利用Raw图像实现真实场景超分辨率的核心技术,让您的图像在细节和色彩上都能“更上一层楼”。是相机传感器直接输出的原始数据,保留了最完整的亮度、色彩信息(如Bayer阵列的原始采样),这为超分辨率提供了“富矿级”的信息基础。该分支以低分辨率RGB图像为参考,学习“色彩变换矩阵”,让恢复的细节拥有真实的色彩表现。

FJN110的博客 139

JVM底层之类加载器详解

一、类加载器 JVM中有两种类型的类加载器,由C++编写的及由Java编写的。除了启动类加载器(Bootstrap Class Loader)是由C++编写的,其他都是由Java编写的。由Java编写的类加载器都继承自类java.lang.ClassLoader。 JVM还支持自定义类加载器。 各种类加载器之间存在着逻辑上的父子关系,但不是真正意义上的父子关系,因为它们直接没有从属关系。 1.1、启动类加载器 因为启动类是由C++编写的,所以当我们通过Java程序去看显示的是null。 启动类加载器不像其

沮丧的南瓜 1376

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析

LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。

AI天才研究院 1035

JVM第三讲 JVM从底层原理分析类加载过程

JVM第三讲 JVM从底层原理分析类加载过程

程序员路同学 161

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM之类加载器

一个Tomcat程序中是可以运行多个Web应用的,如果这两个应用中出现了相同限定名的类,比如Servlet类,Tomcat要保证这两个类都能加载并且它们应该是不同的类。如果不打破双亲委派机制,当应用类加载器加载Web应用1中的MyServlet之后,Web应用2中相同限定名的MyServlet类就无法被加载。Tomcat使用了自定义类加载器来实现应用之间类的隔离。每一个应用会有一个独立的类加载器加载对应的类。先来分析ClassLoader的原理,ClassLoader中包含了4个核心方法。

缘友一世的博客 1453

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JVM组成之类加载器

spi中使用了上下文中保存的类加载器进行类的加载,这个类一般就是应用类加载器,由此spi可以获取到应用类加载器。在自己的项目中创建一个java.lang.string类(在启动类加载器中已有相同类名的类被加载),不会被加载,会返回启动类中已被加载的string类。内容:当一个类加载器接收到加载类的任务时,会自下而上查找是否被加载过,在由顶向下进行加载(根据类的加载路径选择加载到哪个类加载器中)。如果一个类重复出现在三个类加载器的加载位置,英国由启动类加载器加载,根据双亲委派机制,它的优先级最高。

hguhbh的博客 874

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

深入理解JVM中的ClassLoader类加载器

文章目录深入理解JVM中的ClassLoader类加载器JVM的体系结构图JVM的位置JVM结构图中的class files文件JVM结构图中的类加载器ClassLoader的解释类加载器ClassLoader的作用类加载器的种类java类的加载机制双亲委派机制沙箱安全机制 深入理解JVM中的ClassLoader类加载器 JVM的体系结构图 先来看一下JVM的体系结构,如下图: JVM的位置 JVM的位置,如下图: JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JIN(

xzy的博客 3150

JVM内功心法-类加载之类加载器

JVM内功心法-类加载之类加载器 由于类加载器是负责这些和系统运行有关的所有类的加载行为,而针对不同位置的类,JVM提供了三种类加载器: 1.启动类加载器(BootStrap ClassLoader) 最顶层的加载类,主要加载核心类库,也就是我们环境变量下面%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等,还可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。 2.扩展类加载器

top_OMZ的博客 433

【JVM】一篇文章彻底理解JVM的组成,各组件的底层实现逻辑

java文件通过java源码编译器进行编译为.class文件,存储的是字节码(二进制数据),类加载器,通过验证、准备、解析、初始化流程、将字节码数据读到方法区中,并在堆中创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,通过编译器,将字节码翻译成底层系统指令,再交由 CPU 去执行。对于java来说,类加载器将.class文件(字节码二进制的数据),装载到jvm中,并将类的结构封装成一个class对象放到堆中。`.class文件,存储的是字节码(二进制数据)。

A的博客 3918

面试题之类加载器

一、简介 本文总结一些关于JVM中类加载器相关的面试题。 二、什么是类加载器? 类加载器,负责加载class字节码文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎Execution Engine决定。 类加载器的工作图大体如...

weixiaohuai的博客 1614

JVM —— 类加载器的分类,双亲委派机制

类加载器的分类,双亲委派机制:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器;JDK8及之前的版本,JDK9之后的版本;什么是双亲委派模型,双亲委派模型的作用,如何打破双亲委派机制

qq_44700578的博客 1628

JVM底层原理

1.基础 1.JVM整体架构 JVM(虚拟机):指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。 作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件匹配JVM对加载编译文件格式要求,任何语言都可以由JVM编译运行。比如kotlin、scala等。 b.jvm有很多,不只是Hotspot,还有JRockit、J9等等 2.JVM内存结构 3.类加载过程 1.加载:在硬盘上查找并通过IO读入字节码文件 2.连接:执行验证

可小辉的博客 3550

JVM底层原理学习(二)之类加载子系统

接上一篇文章 上一篇文章主要分析了为什么JVM可以跨平台,以及一个java文件的编译与反编译的过程。这一篇主要是介绍JVM的类加载子系统 类文件到虚拟机(类加载子系统)

依剑行走天下的博客 392

【JVM】类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。一个Tomcat程序中可以运行多个Web应用,如果这两个应用中出现了相同限定名的类,比如Servlet类,Tomcat要保证这两个类都能加载并且它们应该是不同的类。如果不打破双亲委派机制,当应用类加载器加载Web应用1中的MyServlet之后,Web应用2中相同限定名的MyServlet类就无法被加载了。Tomcat使用了自定义类加载器来实现应用之间类的隔离。

Decade_Faiz的博客 999

JVM底层之类加载

1、Klass模型 首先明确class 和klass的区别: class是Java类(Java代码),而klass是Java类在JVM的存在形式(c++代码) Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息…… 从继承关系上也能看出来,类的元信息是存储在原空间的(instanceKlass) ,对象是存储在堆区的(InstanceMirrorKlass) 类加载器将.class文件加载进系统,将.class文件解析,那么生成的是什么

milo 710
上一篇: JVM是如何得到数组长度的
下一篇: JVM类加载器子系统与SPI
Life  journey
博客等级 码龄17年 1万+粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值