Java JVM

微前端实战:MicroApp内存泄漏优化策略与性能调优 本文分享了在大型后台管理系统微前端化过程中,使用MicroApp框架时遇到的内存泄漏实战问题与优化策略。通过深入分析沙箱机制,提出动态加载、精准卸载、沙箱配置优化及第三方库补丁等核心方案,并结合Vue/React子应用专项检查清单,有效解决了内存占用飙升问题,为微前端架构的性能调优提供了系统性解决方案。 阅读详情

转自:http://www.cnblogs.com/tianchi/archive/2012/11/11/2761631.html

在C里面我们想执行一段自己编写的机器指令的方法大概如下:

typedef  void (*FUNC)( int );
char * str = "your code" ;
FUNC f = (FUNC)str;
(*f)(0);

  也就是说,我们完全可以做一个工具,从一个文件中读入指令,然后将这些指令运行起来。上面代码中“编好的机器指令”当然指的是能在CPU上运行的,如果这里我还实现了一个翻译机器:从自己定义的格式指令翻译到CPU指令,那么就可以执行根据自定义格式的代码了。那么上面这段代码是不是相当于最简单的一个虚拟机了?下面来看JVM的总体结构:


ClassLoader的作用是装载能被JVM识别的指令(当然不只是从磁盘文件或内存去装载),那么我们先了解一下该格式:

魔数以及版本就不说了(满大街的文件格式都是这个东西),接着的便是常量池,其中无非是两种东西:

  1. 字面常量(比如Integer、Long、String等);
  2. 符号引用(方法是哪里的?什么样的?);

而我们知道,在JVM里面Class都是根据全限定名去找的,那么方法的描述当然也应该如此,那么就得到这些常量之间的关系如下:

 

在接下来的“访问权限”中表明了该Class是public还是private等,而this&super&interface则表面了“本类”、“继承自哪个类”、“实现了哪些接口”,实际上这里只是保存了代表这些信息的CONSTANT_Class_info的下标(u2)。

 

感觉这里的NameIndex和DescriptorIndex加起来和NameAndType有点像,那么为什么不直接用一个NameAndType的索引值表示?MethodInfo和FieldInfo之间最大的不同点就是Attributes。比如FieldInfo的属性表中存放的是变量的初始值,而MethodInfo的属性表中存放的则是字节码。那么我们来依次看这些Attributes,首先是Code:

 

有几个有意思的地方:

  1. 从Class文件中可以知道在执行的过程中栈的深度;
  2. 对于非静态方法,编译器会将this通过参数传递给方法;
  3. 异常表中记录的范围是指令的行数(而不是源代码的);
  4. 这里的异常是指try-catch中的,而与Code同级的异常表中的则是指throws出去的;

Exceptions则非常简单:

LineNumberTable保存了字节码和源码之间的关系,结构如下:

 

LocalVariableTable描述了栈帧中局部变量表的变量和源代码中定义的变量之间的关系,结构如下:

 

SourceFile指明了生成该Class文件的Java源码文件名(比如在一个Java文件中申明了很多类的时候会生成很多Class文件),结构如下:

Deprecated和Synthetic属性只存在“有”和“没有”的区别:

  1. Deprecated:被程序作者定为不再推荐使用,通过@deprecated注释说明;
  2. Synthetic:表示字段或方法是由编译器自动生成的,比如<init>; 

这也就是为什么Code属性后面会有Attribute的原因?

类加载的时机就很简单了:在用到的时候就加载(废话!)。下来看一下类加载的过程:

 

执行上面这段过程的是:ClassLoader,这个东西还是非常重要的,在JVM中是通过ClassLoader和类本身共同去判断两个Class是否相同。换句话说就是:不同的ClassLoader加载同一个Class文件,那么JVM认为他们生成的类是不同的。有些时候不会从Class文件中加载流(比如Java Applet是从网络中加载),那么这个ClassLoader和普通的实现逻辑当然是不一样的,通过不同的ClassLoader就可以解决这个问题。

但是允许使用不同的ClassLoader又引发了新的问题:如果我也声明了一个java.lang.Integer,但是里面的代码非常危险,怎么办?这里就引出了双亲委派模式:

除了顶层的启动类加载器外,其余的类加载器都应该有父类加载器(通过组合实现),它在接到加载类的请求时优先委派给父类加载器去完成。

这样的话,在加载java.lang.Integer的时候会优先使用系统的类加载器,这样就不会加载用户自己写的。在Java程序员看到有3种系统提供的类加载器:

  1. Bootstrap ClassLoader:负责加载<JAVA_HOME>\lib目录中的类库,无法被Java程序直接引用;
  2. Extension ClassLoader:负责加载<JAVA_HOME>\lib\ext,开发者可以直接使用;
  3. Application ClassLoader:加载ClassPath上所指定的类库,如果没有自己定义过自己的类加载器则会使用它;

这样默认的类会是有Application ClassLoader去加载类,然后如果发现要使用新的类型的时候则会递归地使用Application ClassLoader去加载(在前面的加载过程中提到)。这样,只有在自己的程序中能使用自己编写的ClassLoader去加载类,并且这个被加载的类是不能被别人使用的。

双亲委派模式不是一个强制性的约束,而是Java设计者推荐给开发者的类加载实现方式。双亲委派模式出现过的3次“破坏”:

  1. 为了兼容JDK 1.0,建议使用者去覆盖findClass方法;
  2. 在基础类要访问用户类的代码会出现问题(比如JNDI):线程山下文类加载器;
  3. 用户的一些需求,比如HotSwap、OSGI等; 

加载完完成后,接下来就要看程序是怎么运行的。栈帧是用于支持虚拟机进行方法调用和执行,帧的意思就是一个单位,在调用其他方法的时候会向栈中压入栈帧,结构如下:

 

在Class文件编译完成之后,在运行的时候需要多少个局部变量就已经确定(在前面Class文件中也已经看到过了),那么这里需要注意这个特性可能会引发GC(具体如何引发就不在这里细说了)。在栈中,总是底层的栈去调用高层的栈(并且一定的相邻的),那么他们在参数传递(返回结果)的时往往是通过将其压入操作数栈,有些虚拟机为了提高这部分的效率使得相邻栈帧“纠缠”在一起:

 

那么我们接下来要去看是方法是如何执行的,第一个问题就是执行哪个方法?在“面向过程”的编程中似乎不存在在个问题,但是在Java OR C++中这都是比较蛋疼的一个问题。原因就是平时不会这么用,但是你必须去搞明白= =。JVM确定目标方法的时候有两种方法:

  1. 静态分派:根据参数类型和方法名称来决定调用哪个方法。但是,并不是说没有发现匹配的类型就报错,比如有:func(int a),而在调用func('a')的时候也会调用该方法(当然是在没有func(char a)的前提下),这样给人的关键就有点像一个处理的链条。不管多么复杂,这些都是在编译期间确定的,因为这里是向上找的。
  2. 动态分派:最普遍的就是Interface a = new Implements(),a调用方法到底应该是哪个类的在编译期间是无法确定的。其实动态分派实现起来也很简单:在调用方法的时候先拿到对象的实际类型。

其实“静态”和“动态”给人的感觉还是比较模糊的,“静态分派”给人的感觉是根据参数的类型向上查找方法,“动态分派”给人的感觉则是根据实例的真实类型向上查找。虚拟机优化动态分派的效率一般是为类在方法区中建立一个虚方法表:

虚方法表中存放各个方法实际入口地址,如果某个方法在子类中没有被重写,那么子类的虚方法表里面的地址入口和父类相同方法的地址入口是一致的,都指向父类的实现入口。如果子类重写了这个方法,子类方法表中的地址将会被替换为指向子类实现版本的入口地址。其实往简单里说,就是一个预处理。

具体单个方法的执行非常简单,写一个简单的程序然后使用javap -c,再结合每条指令的含义就能大概知道程序时怎么执行以及返回的了(大体上就是基于栈),这里就不深入和细说了。

一般情况下,从Java文件到运行起来,总的会经历两个阶段:Java到Class文件和执行Class文件。第一个阶段其实就是编译了,在这个过程中比较有意思的是“语法糖”(其他的比如词法分析和语法分析就不说了,此处省略1万字~!~)。所谓Java的语法糖是:for遍历的简写、自动装箱、泛型等(其实有没有感觉String+String也是语法糖,在实际中会变成StringBuffer的append)。其中比较有意思的是泛型:

Java中的泛型和C++中的泛型原理是上不一样的:对于C++来说List<A>和List<B>就是两个东西,而在Java中List<A>和List<B>都是List<Object>,因为在Java中Object是所有对象的父对象,那么Object o可以指向所有的对象,那么就可以用List<Object>来保存所有的对象集了(感觉实现的有点废)。

这里涉及到一个问题就是对象删除,比如下面代码:

static void func(List<Integer> a){
        return;
}

在使用javap查看生成的Class的时候会发现:

static void func(java.util.List);
  Signature: (Ljava/util/List;)V
  Code:
   0:   return

其中根本没有任何Integer的痕迹,但是如果加上返回值,也就是:

static Integer func(List<Integer> a){
        return null;
}

此时再查看的时候就会变成:
static java.lang.Integer func(java.util.List);
  Signature: (Ljava/util/List;)Ljava/lang/Integer;
  Code:
   0:   aconst_null
   1:   areturn
通过泛型实现的原理可以理解很多在实际中会遇到的问题,比如使用List的时候莫名其妙的类型强制转换错误。

接下来开始讨论第二个部分,也就是Class文件的实际的执行。在C++中常会提到的两个概念是:Debug和Release,而在Java中常提到的两个概念是Server和Client(虽然他们划分的根据完全不一样),Client和Server两种模式对应两种编译器:

  1. Client对应C1编译:将字节码编译成本地代码并进行耗时短且可靠的优化,在必要的时候加入性能监控。
  2. Server对应C2编译:将字节码编译成本地代码并进行耗时比较长的优化,还可能会根据性能监控的结果进行一些不可靠激进的优化。

在监测器发现有热点代码(被调用了很多次的方法或者是执行很多次的循环体)的情况下,将会想即时编译器提交一个该该方法的代码编译请求。当这个方法再次被调用时,会先检查改方法是否存在被JIT编译过的版本,如果存在则优先使用编译后的本地代码。在默认的情况下,编译本地代码的过程和旧的代码(也就是解释执行字节码)是并行的,可以使用-XX:-BackgroundCompilation来禁止后台编译,也就是说执行线程会登岛编译完成后再去执行生成的本地代码。

在具体编译优化的时候有一个比较好玩的东西,逃逸分析(所谓逃逸是指能被从方法外引用),对于不会逃逸的对象可以进行优化:

  1. 在栈上分配对象,可以减少GC的压力;
  2. 不需要对为逃逸的对象进行线程同步;
  3. 如果一个对象无法逃逸,可以在方法里面不申明这个对象,而是放一些“零件”;

关于Java和C++效率的问题,感觉讨论起来就没有什么意义了:语言到最后肯定是要生成机器指令的,在语言的机制上面各有千秋,导致不同的语言之间生成机器指令的过程可能不同,但是这个生成的过程跟我们这些码农没有半毛钱关系(更准确的说我们生成的过程我们毛都不知道),所以在搞清楚之前就不要争到底哪个效率高(甚至是哪个更好)。 

程序的并发主要是考虑不同的线程操作同一块内存时候可能发生的一些问题(至于文件锁之类的东西,咳咳),首先就先了解线程和内存的关系:

 

这里的主内存就像是内存条,工作内存就像是寄存器+Cache。Java内存模型定义了8中操作,他们的执行如下:

 

Java虚拟机中最轻量级的同步机制:volatile,它的性质如下:

  1. 变量发生修改的时候会立刻被其他线程看到;
  2. 禁止指令重排序优化;

从Java内存模型操作的角度来看volatile的实现还是挺简单的:在use之前必须load,在assign之后必须store,这样就保证了每次用都是从主内存中读取,每次赋值之后都会同步到主内存(貌似说的是废话)。线程的同步主要是从三个方面考虑:

  1. 原子性:Long和Double需要特殊考虑;
  2. 可见性;除了volatile之外还有final(synchronized就不说了吧);
  3. 有序性:指令重排,当然可以禁止指令重排;

如果任何时候都考虑同步那代码写起来就累死了。下面是Java内存模型的天然先行发生关系:

  1. 控制流被执行的顺序和代码的顺序保持一致;
  2. unlock先行发生于后面对同一个锁的lock操作;
  3. 对volatile变量的写操作先行于后面对这个变量的读操作;
  4. Thread的start方法先行于线程的任何一个动作;
  5. 线程的所有动作都先行于线程的终止检测;
  6. 对线程interrupt方法的调用先行于被中断线程的代码检测到的中断事件的发生;
  7. 对象的初始化完成先行于finalize方法调用;
  8. 传递性;

其实上面的这八条规则还是很有意思的,如果其中的某一条不成立会发生什么?说到底Java线程还是用户级的线程,那么它究竟是个什么东西(在学C的时候也纠结过这个问题- -)。实现线程主要有几种方式:

  1. 使用一个内核线程(轻量级进程)来代理;
  2. 完全在用户态实现,内核都感觉不到;
  3. 用户和内核混合实现,各自做自己擅长的事情;

这里就不深入的去看了(虽然这里的介绍根没说一样),想想看都知道不同虚拟机在不同的操作系统上面的实现方式很可能是不一样,如果想深入看还是pthread比较有意思一点。关于线程的其他要注意的地方(比如状态转移什么的)就不在这里讨论了。

线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。

Java中线程共享的变量可以分为以下五种:

  1. 不可变:这个就不需要解释了(并不一定非得用final修饰);
  2. 绝对线程安全:也就是满足上面的线程安全描述的;
  3. 相对线程安全:简单的说应该是对单个行为的调用不会出错;
  4. 线程兼容:对象并不是线程安全,但可以通过调用方的同步来弥补;
  5. 线程对立:不管调用方怎么处理都不能在多线程环境下使用;

锁的话有以下几种实现方式:

  1. 互斥同步,并不是说等待的线程会一直等下去;
  2. 非阻塞同步,乐观(冲突并没有我们想象的那么多);

如果线程之间的切换非常频繁的话自旋锁是一个不错的选择,这样就不需要线程切换时候的系统调用的开销了。如果一个任务能够很快的完成的话,将整个过程都锁住或许是个不错的选择(而不是给每个子过程上锁)。其他的锁优化包括“轻量级锁”和“偏心锁”

人像抠图 + OpenGL ES 还能这样玩?没想到吧(附带源码) OpenGL ES 利用抠图算法实现人像留色。 阅读详情

相关推荐

主流双目相机技术参数横向评测:从ZED到国产新锐

本文对主流双目相机技术参数进行了横向评测,涵盖ZED、Bumblebee等国际品牌及国产新锐产品。详细分析了分辨率、帧率、视场角等关键参数,并针对机器人导航、AR/VR交互、工业检测等场景提供选型建议。特别推荐ZED相机在科研领域的成熟应用,以及国产方案在长基线设计和主动双目技术上的创新突破。

weixin_33670786的博客 318

【jvm】什么是动态编译

在动态编译后,通常需要使用自定义的类加载器来加载生成的字节码。这是因为默认的类加载器通常只加载已经存在于文件系统中的类。

王佑辉的博客 597

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1786

科普文:Java基础系列之[java动态编译]

在 Java 中,动态编译是指在运行时动态地编译 Java 源代码,生成字节码,并加载到 JVM 中执行。动态编译可以用于实现动态代码生成、动态加载、插件化等功能。动态编译可能在日常工作中所使用的场景不多,但在特定的场景下能够很好的解决我们所遇到的问题,本篇文章可以给大家提供一些视野,当你遇到类似场景时或许动态编译能够很好的解决它!

为无为,事无事,味无味。 1878

Image Sensor常见分辨率下HTS,VTS设置

image sensor,HTS,VTS

propor的专栏 4974

DIY音频必备:手把手教你用AB类功放模块打造高保真桌面音响(含电路图)

本文详细指导如何利用AB类功放模块DIY高保真桌面音响,涵盖选型指南、核心元器件清单、电路搭建与焊接工艺,以及系统调试与音质优化技巧。AB类功放以其接近A类功放的音质和B类功放的效率,成为音频爱好者的理想选择,适合有一定电子基础的实践者。

weixin_42665725的博客 443

一文学会 Java 动态编译

Java动态编译技术可以让我们在程序运行时动态地生成和加载Java代码,从而实现更加灵活和高效的应用程序。本文介绍了Java动态编译的基本概念、实现方法和相关案例。如果你对Java动态编译技术感兴趣,可以通过阅读的官方文档,进一步了解该技术的实现细节。同时,需要注意的是,Java动态编译技术虽然可以提供更高的灵活性和可扩展性,但在实际使用时也存在一些安全隐患。因为动态编译可以在程序运行时生成和加载代码,如果不加以限制和控制,可能会导致恶意代码的注入和执行。

Java是世界上最好的语言 3432

VMware虚拟机调用NVIDIA显卡全攻略:从3D加速到直通与vGPU

显卡虚拟化技术是虚拟化领域的关键组成部分,它通过在虚拟机中模拟或直接分配物理GPU资源,实现了图形渲染与通用计算的加速。其核心原理在于通过Hypervisor层对GPU指令进行拦截、转换或直接映射,从而平衡资源隔离与性能损耗。这项技术的核心价值在于提升资源利用率、实现计算环境隔离,并支持AI训练、3D渲染、科学计算等高性能负载的灵活部署。在应用场景上,轻量级图形界面加速、CUDA学习验证适合使用虚拟3D加速;而追求极致性能的机器学习训练、专业渲染则需依赖PCIe直通技术;对于企业级GPU资源池化与多租户共享

weixin_32308101的博客 1019

Ljava/util/List;

经检查方法存在,原因是方法名称冲突,改掉方法名称,正常运行。

qq_36395578的博客 7272

单片机设计具备断电记忆功能的计时器

本文介绍了如何设计一款具备断电记忆功能的计时器,利用单片机和EEPROM存储器实现了计时器值的保存和恢复。当然,在实际的设计中还需要考虑其他因素,如电源管理、时钟精度等,以确保计时器的正常运行和准确性。选择合适的单片机:在设计计时器时,我们需要选择一款具备存储功能的单片机,以便在断电后能够保存计时器的状态。可以优化显示方式,使用更加直观的界面来展示计时器的值;函数中,我们首先从 EEPROM 中读取计时器的初始值,然后在一个无限循环中每秒钟增加计时器的值,并将新的值写入 EEPROM 中。

RlDart的博客 1094

实战:利用 Agent Harness 自动化 PPT 制作

本文将带你从零开始,用轻量级Agent编排框架,结合主流大模型(GPT-4o、通义千问、文心一言等),搭建一套全自动化的PPT生成工作流:从用户输入自然语言需求,到需求解析、大纲生成、内容填充、数据匹配、排版美化、导出成品,全程不需要手动操作,最快10分钟就能产出符合要求的PPT。我们不会讲晦涩的Agent理论,所有步骤都有可直接运行的代码示例,哪怕你只有基础的Python语法基础,也能跟着一步步做出能用的自动PPT工具。

AI Agent Harness Engineering 569

"org.springframework.cloud.config.environment.Environment.addAll(Ljava/util/List;)V"异常处理

目录 1 使用springcloud config的时候报错 2 pom.xml依赖配置 3 处理办法 1 使用springcloud config的时候报错 [dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception...

u010482601的专栏 1640

手把手教你学SINULINK-- --Linear Transformer 模块

模块是 Simulink 中用于模拟理想变压器行为的重要工具。通过本文的详细介绍,希望你能更好地理解和使用模块。

MHD0815的博客 2613

JVM——JVM与Java体系结构

JVM简介、OpenJDK和OracleJDK、虚拟机与JVM、JVM整体结构、Java代码执行流程、JVM的架构模型、JVM生命周期、JVM的明星产品

码说芯语的博客 1868

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

这是一篇给Java小白看的JVM文章

很多Java开发人员,还不清楚JVM是什么,就直接涉足JVM调优。很多Java开发人员,说起JVM,只知道运行时数据区域(或称之为JVM内存布局或JVM内存结构)。还有很多Java开发人员,在被问起:“你知道Java内存模型吗?”,答:“知道,Java内存模型分为方法区、堆、…”。虽说“概念”这个词发明出来是为了方便交流和说明问题的,不用太过于较真。但是,答非所问就是你的不对了。如果你属于其中一者,我劝你看完这篇文章。本文就一个目的:认识JVM。

二蛋的博客 1472

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java进程之间以及跟JVM关系

先提出两个问题:1、命令启动了两个java程序,它们之间是什么关系?2、java程序又和JVM之间是什么关系,它们是共用一个JVM,还是每个java程序,都有一个JVM?演示1、用命令启动两个一样的java程序。2、用jvisual观察到有两个WhileTrue程序的进程。进程的概念在多道程序工作的环境下,操作系统必须能够实现资源的共享和程序的并发执行,从而使程序的执行出现了并行、动态和相互制约...

干货 2万+

深度学习工具包 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是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性

编写代码:程序员编写 Java 源代码。编译为字节码:Java 源代码编译为与平台无关的字节码。JVM 执行字节码:在每个平台上都有适配的 JVM 实现,它加载、验证并解释或编译这些字节码,使其在当前平台上执行。标准库封装平台差异:Java 标准库提供了平台无关的 API,隐藏了平台之间的差异。JVM 是执行 Java 字节码的运行时环境,它负责提供内存管理、线程管理等基础功能。JVM 和 Java 之间的关系非常密切,JVM 是 Java 平台不可或缺的组成部分。

weixin_45056021的博客 1337

从JVM Instructions看Java

我们都知道Java程序是运行在JVM里面的一段一段字节码,JVM需要做的就是把这些字节码转换成机器语言,使得Java程序能正确的运行在计算机上,说的更底层一点就是正确分配内存,执行CPU计算并且释放内存。所以任何一个程序如果能做到以下几件事:读入Java Class文件、分析Class文件格式、为变量对象方法动态分配内存、管理这些变量和内存的回收,都可以做为我们所谓的虚拟机为Java程序员服务。从

Ant Ren的专栏 1833

JVM是什么?Java程序为啥需要运行在JVM中?

JVM 代表Java 虚拟机,本质上是一个虚拟机或运行时环境,允许 Java 程序在多个设备和操作系统上运行和操作。Java 程序不能在没有 JVM 支持的机器上运行,它是 Java 运行时环境 (JRE) 的一个组成部分。JVM 具有许多共同运行 Java 程序的规范。它本质上是平台相关的,即每个操作系统都有不同的JVM。规范实现实例规范是正式描述 JVM 实现所需内容的文档,拥有单一规范可确保所有实现都是可互操作的。JVM 实现是满足 JVM 规范要求的计算机程序。

m0_73311735的博客 1249

java中的jvm_Java中JVM作用和特征,JVM是什么

首页>基础教程>基础知识>JDK&JRE&JVMJava中JVM作用和特征,JVM是什么JVM简介JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆...

weixin_39631755的博客 909

【Java】JVM

隔离加载类修改类加载的方式扩展加载类防止源码泄露自定义类加载器的父类加载器由方法设置,该方法返回的是。开发人员可以通过继承抽象类java.lang.classLoader类的方式,实现自己的类加载器,以满足一些特殊的需求在JDK1.2之前,在自定义类加载器时,总会去继承classLoader类并重写loadclass()方法,从而实现自定义的类加载类,但是在JDK1.2之后已不再建议用户去覆盖loadclass()方法,而是建议把自定义的类加载逻辑写在findclass()方法中。

athicket 1934

JVM——java体系和jvm介绍

JVM——java体系和jvm介绍 文章目录JVM——java体系和jvm介绍1、java的体系2、JVM介绍1.JVM概述2.常见的JVM3.JVM与java的关系3、JVM、JRE和JDK概念1.JVM( **Java Virtual Machine** ):2.JRE(Java RunTime Environment )3.JDK(Java Development Kit):3.三者之间的联系和区别4、java编译过程 1、java的体系 从传统意义上看来,JCP(java社区)官方定义的ja

江哈哈的博客 328

JAVA面试-JVM

一文带你吃透JVM,斩获大厂offer。

冲击AI顶流!!! 1076

《剑指JVM》Java与JVM——JVM与Java体系结构——引言篇1

🔥本篇概览:详细讲解了JVM与Java体系结构。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1140

java main jvm_Java当中的JVM

01在使用控制面板时的实质:Hello.java使用javac,然后变成为Hello.class通过运行java这个命令,在类加载器中(含有加载,验证,准备,解析,初始化,使用,卸载),到jvm为Java虚拟机中运行,在jvm中有方法区,堆内存,线程栈,本地方法栈,PC计数器。类加载器:加载,验证,class文件的版本是否能兼容当前的Java虚拟机版本,然后class文件要满足虚拟机的规范。准备,...

weixin_31618799的博客 206

JVM - 如何理解 Java、Jdk、Jre、Jvm ?

Java Virtual Machine(Java虚拟机),是虚拟出来的一个“操作系统”,在这个“操作系统”里面运行java程序的class字节码文件;JVM启动之后,在我们的电脑上或者服务器上表现出来的就是一个java进程,这个进程里面运行的是我们的Java程序;这个JVM本身是C语言开发的,并且不同的电脑操作系统是不同的版本,比如针对windows有windows的jvm,针对Linux有Linux的jvm; 问题思考:为什么说 java 是跨平台(Linux系统,Windows系统,Mac系统)的语

你今天真好看呀 739
上一篇: Java Beans
下一篇: java spring mvc 项目1
cmdssd1
博客等级 码龄17年 24粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值