JVM类加载、概念和高级特性

基于FPGA的CORDIC算法实现——Verilog版 目前,学习与开发FPGA的程序员们大多使用的是Verilog HDL语言(以下简称为Verilog),关于Verilog的诸多优点一休哥就不多介绍了,在此,我们将重点放在Verilog的运算操作上。 我们都知道,在Verilog中,运算一般分为逻辑运算(与或非等)与算术运算(加减乘除等)。而在一开始学习Verilog时,老司机一定会提醒我们,“切记,千万别用‘/’除、‘%’取模(有的也叫取余)和‘ 阅读详情

目录

虚拟机类加载机制

概念

类加载过程:

加载

验证

准备

解析

初始化

类加载器

双亲委派模型 

虚拟机字节码执行引擎

栈帧

局部变量表

操作数栈

动态链接

程序编译与代码优化


虚拟机类加载机制

概念

1、类加载机制:描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

2、类型的加载、连接和初始化过程都是在程序运行期间完成的

类加载生命周期(类被加载到虚拟机内存到卸载出内存):加载-验证-准备-解析-初始化-使用-卸载

有且仅有五种必须立即对类初始化,即对类进行主动引用:
1、new关键字实例化对象,读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外),调用一个类的静态方法。
2、java.lang.reflect对类进行反射调用
3、初始化类时发现其父类没初始化,先初始化父类(接口不符合这一条,需要真正使用父接口时才会初始化父类)
4、JVM会先初始化主类(main()方法的类)
5、MethodHandle解析方法句柄,方法句柄对应的类没有进行初始化...

类加载过程:

加载

1、类全限定名获取二进制字节流
2、字节流静态存储结构转化为方法区运行时数据结构
3、内存中生成java.lang.Class对象(HotSpot存放在方法区中),作为方法区这个类各种数据的访问入口

注意:数组本身不通过类加载器创建,它是由java虚拟机直接创建的。

验证

确保Class文件字节流符合JVM要求。
1、文件格式验证:保证输入的字节流能正确解析并存储于方法区内
2、元数据验证:保证不存在不符合java语言规范的元数据信息
3、字节码验证
5、符号引用验证

准备

正式为类静态变量分配内存并设置初始值(零值),这些变量所使用的内存都将在方法区中进行分配。

实例变量将会在对象实例化时岁对象一起分配到java堆中。

public static int value = 123 准备阶段后 value的值时0;

public final static int value = 123 准备阶段后 value的值时123;

解析

符号引用替换为直接引用的过程
1、符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。
各种虚拟机实现的内存布局可以各不相同,但是他们能接受的符号引用必须都是一致的,因为符号引用的字面量形式明确定义在JVM规范的Class文件格式中。

2、直接引用:直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是和虚拟机实现的内存布局相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。
如果有了直接引用,那引用的目标必定已经在内存中存在。

类或接口解析、字段解析、类方法解析、接口方法解析

初始化:执行类构造器<client>()方法的过程
<client>()方法是有编译器自动收集类中所有类变量的赋值动作和静态语句块(static{})中语句合并产生的,编译器收集的顺序是有语句在源文件中出现的顺序决定的。

初始化

初始化阶段是执行类构造器<clinit>方法的过程

是类加载的最后一步,真正执行类中定义的java程序代码(或者说字节码)。

<clinit>:

自动收集类中所有类变量赋值动作和static{}中语句合并产生的。父类的<clinit>方法先执行。

接口的<clinit>方法不需要先执行父接口的,只有当父接口中定义的变量使用时,父接口才会被初始化


类加载器

类加载阶段中通过类全限定名来获取描述此类的二进制字节流,这个动作放在JVM外部去实现。

注意:类的唯一性由类和它的类加载器共同决定

双亲委派模型 

定义:类加载器之间的层次关系

启动类加载器: 负责将存放在<Java_HOME>\lib目录中的,以.jar结尾的的类库加载到JVM内存中。

扩展类加载器:负责加载<Java_HOME>\lib\ext目录中的所有类库,开发者可以直接使用这个类加载器。

应用程序类加载器(系统类加载器):负责加载用户类路径(classpash)上所指定的类库,开发者可以直接使用这个类加载器,程序没有自定义类加载器,默认就是用的这个类加载器

自定义类加载器

双亲委派模型的工作过程:收到类加载请求,自己不会加载这个类,而是把这个请求委派给父类加载器去完成,只有父类加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,自定义加载器才会尝试自己去加载。

虚拟机字节码执行引擎

栈帧

栈帧:用于支持虚拟机进行方法调用和方法执行的数据结构。(局部变量表、操作栈、动态链接、返回地址)
在活动线程中只有位于栈顶的栈帧才是有效的,称为当前栈帧。
与这个栈帧相关连得方法叫当前方法。在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了。

局部变量表

局部变量表:变量值存储空间,用于存放方法参数和方法内部定义的局部变量。局部变量不存在准备阶段,所以不会有默认赋值。reference代表对象实例引用。

容量以变量槽(slot)为最小单位,每个slot存放一个boolean、byte、chat...等类型的数据。虚拟机通过索引定位局部变量表,非static方法0索引位置存放的是当前对象的实例的引用(this),slot是可以重用的。

操作数栈

操作数栈:先入后出,最大深度在编译的时候已确定。当方法刚开始运行的时候,方法的操作数栈是空的,在方法执行过程中,字节码指令往操作数栈中写入和提取内容,也就是出栈和入栈操作。不同的操作数栈也可能会有一部分公用的内存,无需进行额外参数赋值传递。

例如:进行算术运算的时候是通过操作数栈来进行的,调用其它方法用操作数栈进行参数传递。

动态链接

动态链接:栈帧包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。
字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数。
静态解析:符号引用会在类加载阶段或者第一次使用的时候转化为直接引用。
动态链接:在每一次运行期间转化为直接引用。

方法返回地址

方法返回时可能需要在栈帧中保存一些信息,用来恢复它的上层方法的执行状态。

程序源码、词法分析、单词流、语法分析、抽象语法树、解释器、优化器、生成器、目标代码


方法调用


一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(直接引用)。
非虚方法:静态方法、私有方法、实例构造器<init>、父类方法、final修饰的方法;在类加载时就会把符号引用解析为该方法的直接引用。

高效并发

1、处理器、高速缓存、缓存一致性协议、主内存。主内存共享的多cpu回写数据到主内存时,以哪个为准?需要定义缓存一致性协议。jvm及时编译器有指令重排序的优化。

C#部署YOLO三种方案深度实测:OpenCV DNN vs ONNX Runtime vs TensorRT 在工业视觉项目落地阶段,C#生态下部署YOLO模型主要有三条技术路线。很多开发者仅凭经验选型,往往在部署后期踩中性能瓶颈、兼容故障、维护成本超标的坑。本文基于工控机常见硬件配置,针对YOLOv8系列模型做控制变量实测,从推理性能、部署难度、工业稳定性、综合成本等多个维度做横向对比,给出可直接落地的选型结论。 阅读详情

相关推荐

AI时代,程序员何去何从?别慌,看完这篇你就明白了

AI时代程序员的发展方向 摘要:随着AI代码助手的普及,程序员行业面临变革。本文通过实际案例展示AI写代码的能力与局限:AI能生成基础功能代码(如RESTful API、数据处理脚本),但缺乏业务理解、系统设计和复杂逻辑处理能力。程序员的核心价值在于需求分析、架构设计、性能优化等高层能力。未来程序员应: 掌握AI工具提升效率 专注于创新和架构设计 培养业务理解能力 持续学习新技术 AI不会取代程序员,但会淘汰不会使用AI的程序员。建议开发者拥抱AI工具,将其作为助手而非威胁,聚焦高价值工作。

yunque_xianguang的博客 908

什么是类加载

类加载 一、类加载的概念 ​ 我们在写一段代码之后,将其运行,显示结果,这个过程当中就涉及到了类加载。首先这段代码(源文件)被javac编译(java编译器)成字节码文件(.class文件),然后将此字节码文件加载到内存,并且对里面的数据进行校验、解析和初始化,最后形成可以被java虚拟机(JVM)直接使用的java类型,这就是虚拟机的类加载机制。 二、类加载的工具类加载器(Clas...

qq_42097790的博客 1378

fMRI数据处理:从DICOM到NIFTI(上)

哈喽,这里是系列fMRI数据处理文章专栏。包括从核磁拷贝完DICOM格式的文件,到整理数据,检查数据,数据预处理,后续分析等等内容。如果你是一个初学者,特别是心理学或者是刚踏入认知神经科学的小白,那么这个专栏可以帮助你从头到尾完成数据处理直到结果的可视化。如果你已经进入了认知神经科学领域,这里面的内容可能过于细致,并且找不到你想要的答案,不过可以在帖子下留言评论,欢迎大家提供宝贵的意见!如果是医学相关,可能这些内不太准确或专业,谨慎参考!

weixin_44933894的博客 2482

什么是类的加载

一、什么是类的加载 java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。 其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误...

a970066364的博客 5053

MCGSPro动画部件实战:用文本分段实现智能报警提示(附工程文件)

本文详细介绍了在MCGSPro组态软件中,如何利用动画部件的文本分段功能,高效实现触摸屏上的智能报警提示。通过绑定整数变量作为索引,一个部件即可动态切换多种状态信息,解决了传统方法画面臃肿、维护繁琐的痛点。文章提供了从变量定义、部件配置到逻辑联动的完整实战教程,并分享了工程文件复用与性能优化技巧。

weixin_28347369的博客 167

二次开发vba_CATIA VBA(VBS)二次开发:使用Search批量选择元素

在CATIA二次开发中很多在程序中进行自动交互的方法或函数都需要使用选择集作为参数,将几何元素按照要求批量添加到选择集中也是实现程序自动运行的有效方法。在前面的文章《CATIA使用VBA(VBS)二次开发时用户的交互选择》和《CATIA使用VBA(VBS)二次开发时工程图和草图位置的交互选择函数Indicate2D》中介绍了在CATIA VBA(VBS)二次开发中用户和选择集之间的交互操...

weixin_32497403的博客 1321

【Java虚拟机】JVM类加载机制和双亲委派模型

JVM的类加载机制和双亲委派模型

互联网小阿祥 838

C语言使用开源库libusb进行USB设备操作

https://libusb.info/libusb is a C library that provides generic access to USB devices. It is intended to be used by developers to facilitate the production of applications that communicate with USB hardware. It is portable: Using a single cross-platform AP

m0_60352504的博客 1554

深入理解——Java类加载机制

我们知道,我们写的java文件是不能直接运行的,我们可以在IDEA中右键文件名点击运行,这中间其实掺杂了一系列的复杂处理过程。这篇文章,我们只讨论我们的代码在运行之前的一个环节,叫做类的加载。按照我写文章的常规惯例,先给出这篇文章的大致结构; 首先,认识类加载机制,然后,详细介绍类加载的过程。最后,介绍了类加载器,还有双亲委派原则。 废话不多说,直接来看吧。 一、什么是类的加载 在介绍类的...

GSON的博客 3259

高通开发系列 - Linux/Ubuntu移植到QCS8xxx平台

QCS8250和QRB5165平台属于体系架构相同的芯片,前置是带cellular而后者不带,即前置有移动网络而后者没有。 BSP部分的软件内容有差异需要修改外,同一套代码编译出来的执行程序是可以运行的,不会存在体系架构、指令集不匹配的问题。 QCS8250平台没有Linux/Ubuntu的软件SDK,只有Android的SDK,但是它对应j兼容的QRB5165平台有LE(Linux)和Ubun(Ubuntu)SDK。所以我们需要做的就是用QRB5165 Linux/Ubuntu移植到QCS8250平台上来

fulinux的博客 3186

在STM32F103RBT6微控制器上利用USB虚拟Com端口技术,高效实现ADC数据传输:详细操作步骤与示例代码解析

以上就是在STM32F103RBT6上使用USB虚拟Com端口实现ADC数据传输的全部内容。虽然过程中有很多步骤和细节需要注意,但只要按照步骤来,理解每一段代码的作用,就完全可以掌握这个过程。在实际应用中,我们可能需要根据实际需要修改一些代码,如调整ADC的参数,改变数据的处理方式等。但是,只要理解了这个过程,我们就可以很灵活地进行修改。希望这篇文章对你有所帮助。如果你有任何疑问,欢迎在评论区留言,我会尽我所能进行解答。

qq_38334677的博客 1168

JAVA类加载器概念

Java类加载器(英语:Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。学习类加载器时,掌握Java的委派概念很重要。 每个Java类必须由某个类加载器装入到内存。Java...

学习使我快乐 542

YOLOv11涨点改进 | 首发全网创新、主干改进篇 | AAAI 2026 | PartialNet 主干让 YOLOv11 更加强大!引入部分通道机制 和 部分注意力卷积,全方面提升了模型的性能

本文提出PartialNet主干网络改进YOLOv11的方法,通过部分通道机制(PCM)和部分注意力卷积(PATConv)提升模型效率。PartialNet将特征图通道拆分并应用不同操作,显著减少计算量和内存占用。主要创新包括:1)部分通道机制实现计算优化;2)三种注意力模块(PATch/PATsp/PATsf)增强特征提取;3)动态部分卷积(DPConv)自适应调整计算复杂度。文章详细提供了代码实现和YOLOv11集成方法。

Ai缝合怪、助力小伙伴高效发论文 268

《深入理解Java虚拟机JVM高级特性与最佳实践》

Java虚拟机栈是线程私有的,它的生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型。Java堆是虚拟机所管理的内存中最大的一块,它是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例。方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虚拟机的类加载机制则是将描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

yangcme的博客 310

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度学习工具包 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")

《深入理解Java虚拟机JVM高级特性与性能优化》

Java虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表存放了编译期可知的各种基本数据类型、对象引用和returnAddress类型。加载阶段虚拟机需要完成三件事情:通过一个类的全限定名来获取定义此类的二进制字节流、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

zimskybo的专栏 364

怀旧版电脑GBC模拟器

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

JVM与Spring Boot详解

自定义类加载器允许开发者根据需求,对类加载过程进行扩展,实现一些特殊的功能,例如实现热插拔、模块化等。自定义类加载器需要继承类或实现接口,并重写方法来加载类。自定义Starter可以帮助开发者将常用的库和配置封装起来,方便其他开发者使用。创建Maven项目。添加依赖。编写自动配置类。打包并发布。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1078

JVM与Spring Boot核心解析

自定义类加载器允许开发者根据需要加载特定的类或资源。通过继承类或实现接口,可以创建自定义的类加载器,并重写findClass方法来指定类的加载逻辑。通过创建一个Maven项目,并添加Spring Boot的依赖和自定义配置,可以开发自定义的Starter。创建Maven项目,并添加Spring Boot依赖。添加自定义配置类,并使用注解。添加自定义Bean,并使用@Bean注解。创建模块,并添加自定义Starter的依赖。通过实现Endpoint接口,可以自定义健康检查端点。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 564

《深入理解java虚拟机 JVM高级特性与最佳实践》 读后日志

深入理解Java虚拟机 JVM高级特性与最佳实践 读后日志 走进java Java技术的一个重要优点是:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。 走进Java/2 概述 java不仅仅是一门编程语言,这是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型...

max90的博客 532

深入理解JAVA虚拟机--读书笔记

1.jvm 内存结构 1)程序计数器 较小的内存区域,可以看作是当前线程所执行的字节码的行号指示器;每条线程独立; 2)java虚拟机栈 描述java方法执行的内存模型,即每个方法在执行的同时都会创建一个栈帧用户存储局部变量表、操作数栈、动态链接、方法出口等信息;即一个方法的调用直至完成的过程对应着一个栈帧的入栈到出栈的过程。同样是线程私有; 3)本地方法栈 对应虚拟机使用的nativ

dada360778512的专栏 3932

Java虚拟机全面解析

网上有关Java虚拟机相关的博客非常多,对于Java虚拟机的理解一直是我的薄弱块,最近工作之余利用闲暇时间来深入学习一下有关Java虚拟机相关的知识点,弥补自己的缺陷,主要阅读的书籍是《深入理解Java虚拟机:JVM高级特性与最佳实践》,同时分享出以下几篇文章,文章内容基本上来自本书,写文章的目的一方面是为了加深对知识点的理解,另一方面是来增强自己的总结和表达能力,共勉。 Java虚拟机--之-...

u010349644的专栏 241

xshell监控虚拟机内存_读完这份JVM高级笔记,彻底玩转Java虚拟机,面试再也不用“虚”...

提到Java虚拟机(JVM),可能大部分人的第一印象是“难”,但当让我们真正走入“JVM世界”的时候,会发现其实问题并不像我们想象中的那么复杂。唯一真正令我们恐惧的,其实是恐惧本身。JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易。JVM 的知识点太散,不系统,所以不便于归纳总结,今天就来帮大家解决这个问题,读完这份JVM高级笔记,带你彻底玩转Java虚拟机,面试起来再...

weixin_39924329的博客 124

最新Android大厂高频面试题解析大全

2.Java有几种文件拷贝方式?哪一种最高效?3.使用FileChannel(文件通道)来实现文件快速复制4.JVM类加载机制详解JVM类加载过程5.JVM类加载机制详解类加载器与双亲委派模型6.Java实现线程同步的几种方式7.Java lO流之字节流与字节缓冲流8.Java内存管理:深入Java 内存区域9.Java垃圾回收10.Java中的ThreadLocal11.理解Java中的弱引用12.理解Java的强引用、软引用、弱引用和虚引用13.Java中的堆和栈的区别。

2401_84545213的博客 965

JVM面试知识点梳理

本文这个只是我自己整理的面试中多面到的一些JVM方面的知识点,就这样看它们都是孤立的,我是看《深入Java虚拟机》以及极客时间一个JVM系列的文章,才把这些概念给贯通的。 比如一个知识点:垃圾回收分Minor GC、Full GC。Minor发生在新生代,新生代分Eden、Survivor,而Survivor又分 From Survivor、To Survivor。新生代采用的是Copy机制的垃圾...

weixin_33752045的博客 171

Java基础知识(1)

1.概念以及提纲2.语言基础3.数据类型[一部分]4.操作符5.控制流程6.关键字清单1.概念以及提纲  Java技术是一种高级的面向对象的编程语言,也是一个平台,Java技术是基于Java虚拟机(Java Virtual Machine,JVM)的概念——这是语言和底层软件和硬件之间的一种转换器,Java语言的所有实现都是基于JVM的,从而使Java程序可以在有JVM的任何系统上运行。i.JVM详细介绍:1)JVM执行原理  JVM可以称为软件模拟的计算机,它可以在任何处理器安全地兼容并且执行.class

Intlgj的专栏 4133

Java基础

Java基础

潘潘她老公的博客 414

Java&JVM知识点最详细总结

自己整理的一些Java相关的知识点,内容有些比较散乱,后续会再调整 对于每个知识点,建议按照 为什么需要这个技术?这个技术的原理是什么?在实践中具体是怎么用的?的思路来进行学习。 类的实例化顺序 1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行 2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行 3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行 ...

Kaiyang_Shao的博客 771
上一篇: Effective Java
下一篇: JMM作用和原理
九号铅笔芯
博客等级 码龄9年 9粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值