Java-JVM探析

JAVA中JVM 一、什么是JVMJVM是Java Virtual Machine(Java 虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是平台无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。 阅读详情

一、概述

JVM 是 Java 虚拟机(Java Virtual Machine)的缩写,它是 Java 程序运行的执行引擎。它屏蔽了底层操作系统的差异,让 Java 字节码可以在不同平台上运行。更重要的是在虚拟机自动内存管理机制的帮助下,不再需要手动释放内存,不容易出现内存泄露和内存溢出问题。

Java 编译器(javac)把 .java 文件编译成 .class 字节码,而 JVM 负责执行这些字节码。

了解虚拟机的运行机制有助于在我们开发中,更容易发现问题,找到内存泄漏原因…

须知:

  • JVM 是规范(接口标准)
  • HotSpot / ART/Dalvik 是实现(具体虚拟机)
  • PC 端的虚拟机是HotSpot,安卓端则使用的是ART/Dalvik

二、 JVM 核心组件(构成体系)

JVM 主要由以下部分组成:

在这里插入图片描述

类加载器系统(Class Loader Subsystem)

  • 加载 .class 文件(可来自文件系统、网络等)
  • 双亲委派模型:防止类的重复加载

执行引擎(Execution Engine)

负责将字节码转为机器码并执行。

  • 解释器(Interpreter):逐行解释执行
  • JIT 编译器(Just-In-Time):热点代码编译成本地机器码,提高效率

本地接口(Native Interface)

通过 JNI(Java Native Interface)调用 C/C++ 等底层库。

运行时数据区(Runtime Data Area)

这是 JVM 运行时用于存储各种数据的内存区域:

区域说明
方法区(Method Area)存储类元数据、静态变量、常量池(JDK 8后并入元空间)
堆(Heap)存储对象实例,GC 主要作用区域
虚拟机栈(VM Stack)每个线程一个,存储栈帧、局部变量
本地方法栈用于执行 native 方法
程序计数器(PC)当前线程执行的字节码行号

前面三个只简单了解下即可,因为在开发中 运行时数据区 才是我们需要重点关照的。

三、 运行时数据区

运行时数据区(Runtime Data Area)是 JVM 在执行 Java 程序时用于内存分配的关键部分。掌握这部分知识对解决内存泄漏、优化性能和理解 Java 内部机制至关重要。 当然也是面试的重灾区!

程序计数器 (Program Counter Register)

每个线程都有其独立的程序计数器,这是一个非常小的内存空间,用于保存当前线程正在执行的字节码指令的地址。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地方法,则计数器的值为undefined。

在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

此内存区域是唯一 一个在Java虚拟机规范中没有规定OutOfMemoryError情况的区域。

特点:

  • 线程私有
  • 唯一一个不会出现 OutOfMemoryError 的区域

用途: 支持线程切换(线程上下文切换时,保存和恢复执行位置)

Java 虚拟机栈(VM Stack / Java Stack)

与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。

栈中的每个元素称为栈帧(Frame),栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址等。

经常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),其中所指的“堆”就是Java堆,而所指的“栈”就是现在所讲的虚拟机栈,或者说是虚拟机栈中局部变量表部分。

局部变量表

存储方法参数和方法内部定义的局部变量、存放基本数据类型、对象引用(reference)和returnAddress类型

局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关位置)和returnAddress类型(指向了一条字节码指令的地址)。

以变量槽(Slot)为最小单位,32位类型占1个Slot,64位类型占2个Slot

其中64为长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

操作数栈

操作数栈是栈帧内部的一个后进先出(LIFO)的工作区,用于存储计算过程中的临时数据。JVM 执行算术运算、方法调用传参、存储中间结果等操作时,都会依赖操作数栈。例如,执行 **iadd**(整数加法)指令时,JVM 会从操作数栈弹出两个整数相加,再将结果压回栈中。

动态链接

动态链接存储了指向运行时常量池中当前方法引用的信息,用于支持方法调用时的动态绑定(如多态)。在类加载阶段,符号引用(如方法名)会被解析为直接引用(实际内存地址),动态链接确保方法调用能正确找到目标方法,包括虚方法(如接口或重写方法)的动态分派。

方法返回地址

方法返回地址记录了方法执行完毕后应该回到的指令位置。如果方法正常结束(**return**),JVM 会使用该地址恢复调用者的执行;如果方法异常退出(未捕获的异常),JVM 会查找异常表处理,并跳转到对应的异常处理代码,而非原返回地址。


如果栈空间不足:StackOverflowError、 如果无法分配内存:OutOfMemoryError

在开发中常见的就是栈溢出,如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,比如一个方法自己调用自己,就会报这个错误。如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

特点:

  • 线程私有**,每个线程一个独立的虚拟机栈**
  • 生命周期和线程相同
  • 编译期间确定大小,运行期不会改变

本地方法栈(Native Method Stack)

为 native 方法(JNI调用C/C++) 服务,类似虚拟机栈,但用于 native 方法执行时的栈帧保存。

在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定。HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

其中“HotSpot” 指的是虚拟机能通过运行时分析,自动找出运行频率高的代码(热点代码),并用 JIT 编译器将其编译为机器码,从而提高性能。 它是最主流的 JVM 实现,支持高性能执行、JIT 编译、多种 GC 策略,是 Java 应用程序运行的核心引擎。

特点:

  • 线程私有。
  • 不是所有 JVM 都区分虚拟机栈与本地方法栈(HotSpot JVM 就合并处理了)。

堆(Heap)

Java 堆是 JVM 中最大的一块内存区域,也是所有线程共享的。它用于存放对象实例和数组。几乎所有的对象实例和数组都在这里分配内存,是 Java 内存管理(GC)工作的重点区域。

Tips:但随着JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上就不那么绝对了。

在这里插入图片描述

JDK 7 及以前,方法区被称为永久代 (Permanent Generation),它位于堆的内部!

虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

现代垃圾回收器通常采用分代收集 (Generational Collection) 的思想,将堆划分为新生代 (Young Generation) 和老年代 (Old Generation)。

堆
├── 新生代(Young)
│   ├── Eden 区
│   └── Survivor 区 (S0 / S1)
└── 老年代(Old)
  • 新生代:用于存放新创建的对象。又细分为 Eden 空间、From Survivor 空间和 To Survivor 空间。大多数对象在 Eden 区创建,经过 Minor GC 后存活的对象会进入 Survivor 区,多次 Minor GC 仍然存活的对象会进入老年代。
  • 老年代:存放生命周期较长的对象,或者在新生代中多次 GC 后仍然存活的对象。

堆是可伸缩的,启动时可以指定其大小,也可以在运行时动态扩展或收缩。

-Xms256m -Xmx1024m  # 设置堆初始和最大大小

当堆中没有足够的内存完成实例分配,并且垃圾收集器也无法再提供更多内存时,就会抛出 OutOfMemoryError。

特点:

  • 线程共享
  • 是 GC 管理的主要区域。
  • 大部分对象在 Eden 区创建(新生代)。

方法区(Method Area)(JDK 8 前)

方法区是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JVM 加载类时将类的信息放入方法区,也被称为“永久代”(PermGen Space)。

尽管在JDK 7及之前的方法区(永久代)从物理角度看是堆的一部分,但由于其独特的作用和管理方式,在解释Java内存模型时,常常将其与堆的其他部分区分开来描述。

虽然方法区是 GC 的一部分,但其回收条件相对苛刻,主要是针对废弃常量和无用的类进行回收。

在这里插入图片描述

从 JDK 8 开始,永久代被彻底移除,方法区由元空间 (Metaspace) 实现,元空间使用的是本地内存 (Native Memory)。

异常情况:

  • java.lang.OutOfMemoryError: PermGen space(JDK 8 前)
  • java.lang.OutOfMemoryError: Metaspace(JDK 8 后)

当方法区无法满足内存分配需求时,会抛出 OutOfMemoryError。在 JDK 7 以前的永久代中,更容易出现 OutOfMemoryError;在 JDK 8 后的元空间中,由于使用本地内存,相对来说不容易出现此问题,但也并非不可能。

特点:

  • GC 不频繁,但会发生
  • 线程共享
  • 被称为“永久代”(PermGen Space)——直到 JDK8。
运行时常量池

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量 (Literal) 和符号引用。字节码中的常量(字面值、符号引用)在类加载后放入运行时常量池。

  1. 字面量: 字面量分为文本字符串(如: “abc”,1等)和用final修饰的成员变量(实例变量和静态变量)
  2. 符号引用: 符号引用包括三种:类的全限定名,方法名和描述符,字段名和描述符。

除了编译期已确定的常量,还可以在运行时动态地将一些数据放入常量池,例如 String 类的 intern() 方法。

intern() 的主要作用是确保返回的字符串常量池中具有相同值的一个引用。具体来说,当调用 intern() 方法时,如果字符串常量池中已经包含了一个等于此 String 对象的字符串(使用 equals(Object) 方法进行比较),则返回常量池中的这个字符串的引用。否则,将此 String 对象添加到字符串常量池中,并返回对该对象的引用。

与方法区一样,当常量池无法再申请到内存时,会抛出 OutOfMemoryError。String.intern() 时如果池满会导致内存溢出(尤其是 JDK 7 前后行为不同)。

直接内存(堆外内存)

除了 JVM 规范中定义的 运行时数据区(堆、方法区、栈等),在实际的 HotSpot 虚拟机中,还有一个重要概念叫做 直接内存(Direct Memory),也称为 堆外内存(Off-Heap Memory)。

  • 它是在 Java 堆外 向 操作系统本地内存 申请的内存空间,不受 JVM 堆大小(-Xmx)限制。直接受操作系统管理。
  • 通过 Unsafe 类 或 NIO 包中的 ByteBuffer.allocateDirect() 申请。

作用:

减少堆内存复制

  • 在进行 I/O 操作(比如网络传输、文件读写)时,如果使用普通堆内存,数据需要在堆 → 内核缓冲区之间复制。
  • 使用直接内存可以直接操作操作系统的内存缓冲区,减少一次复制,提高性能。

大数据缓存

  • 用于缓存海量数据,而不影响 JVM 堆 GC。

当直接内存达到最大限制时就会触发GC,如果回收失败则会引起OutOfMemoryError。

四、JMM(Java Memory Model)

Java 内存模型 (JMM) 是 Java 语言规范的一部分,它定义了在多线程环境下,线程如何通过内存进行交互。简单来说,JMM 规范了当一个线程修改了共享变量时,另一个线程何时以及如何能够“看到”这个修改。

JMM 的核心概念:主内存(Main Memory)与工作内存(Working Memory)

在这里插入图片描述

在多核处理器架构下,每个处理器都有自己的高速缓存 (Cache),并且数据最终会存储在主内存 (Main Memory) 中。JVM 运行在这样的硬件之上,为了优化性能,编译器和处理器都可能对指令进行重排序。如果没有一个明确的内存模型来规范这些行为,多线程程序的行为将会变得不可预测,容易出现各种并发问题,如可见性问题、原子性问题和有序性问题。


JMM 主要解决了以下三个并发编程中的核心问题:

1. 可见性 (Visibility):

  • 可见性是指当一个线程修改了共享变量的值,其他线程能够立即(或者在某个确定的时间点)看到这个修改。
  • 在多核系统中,每个线程可能拥有自己独立的 CPU 缓存。当一个线程修改了变量,这个修改可能只反映在其私有缓存中,而没有立即写入主内存。其他线程从自己的缓存中读取到的可能是旧的值,这就导致了可见性问题。
  • JMM 通过特定的同步机制来保证可见性,例如 volatile 关键字、synchronized 关键字、final 字段等。
    • volatile:保证变量对所有线程的可见性,禁止指令重排序。
    • synchronized:通过加锁,保证可见性和原子性。
    • final:在构造函数完成之前,禁止对该变量的重排序。

2. 原子性 (Atomicity):

  • 原子性是指一个操作是不可中断的,要么全部执行成功,要么全部不执行。
  • 例如,i++ 看起来是一个简单的操作,但它实际上包含了三个独立的步骤:读取 i 的值、对 i 进行加 1、将新的值写回 i。在多线程环境下,这三个步骤可能被其他线程打断,导致非原子性问题。
  • JMM 通过 synchronized 关键字、java.util.concurrent.atomic 包下的原子类等机制来保证原子性。

3. 有序性 (Ordering):

  • 有序性是指程序中指令的执行顺序。
  • 为了提高性能,编译器和处理器可能会对指令进行重排序。重排序分为两种:
    • 编译器重排序 (Compiler Reordering):编译器在不改变单线程程序语义的前提下,可能会对指令进行重排序。
    • 处理器重排序 (Processor Reordering):处理器在执行指令时,也可能会对其进行重排序。
  • 在单线程环境下,这些重排序是透明的,不会影响程序结果(称为 “as-if-serial” 语义)。但在多线程环境下,重排序可能会导致意想不到的结果。
  • JMM 通过 “happens-before” 原则来保证有序性,并使用内存屏障 (Memory Barriers/Fences) 来防止特定类型的重排序。

JMM 的核心目标就是:在保证程序正确性的前提下,允许编译器和处理器进行必要的优化。

这里只需要了解每个线程有自己独立的工作内存,JMM 就是这些众多的线程中的交通警察,为了维护和平与正义…重要是程序正常运行而存在的。

五、JVM 与 JMM 之间的关系

JVM 和 JMM 是紧密关联的,它们的关系可以理解为:

  • JMM 是一个规范/抽象模型:JMM 定义了一套规则,它是一个理论模型,描述了多线程程序在内存中如何交互,以及这些交互应该满足哪些一致性保证。它不直接是 JVM 的某个组件,而是对 JVM 实现的要求。
  • JVM 是 JMM 的实现者:JVM(特别是其执行引擎和内存管理部分)是 JMM 规范的具体实现者。JVM 必须遵循 JMM 定义的规则,以确保 Java 程序在各种硬件和操作系统上都能表现出一致的并发行为。

这里与上面说过的 JVM 是一种规范并无矛盾,JMM 可以看作顶级规范,凌驾与 JVM 之上,程序运行的基本规则!

打个比方:

  • JMM 就像是交通法规。它规定了车辆(线程)在道路(内存)上行驶时必须遵守哪些规则(可见性、原子性、有序性),以确保交通安全(并发程序的正确性)。
  • JVM 就像是汽车制造商和道路管理者。汽车制造商(JVM 的 JIT 编译器、垃圾回收器等)要确保他们生产的汽车(线程)能够遵守交通法规;道路管理者(JVM 的内存管理机制)要确保道路(主内存和缓存)的基础设施能够支持交通法规的实施(通过内存屏障等手段)。

总结来说:

JMM 是一个抽象的规范,规定了多线程环境下内存访问的行为,而 JVM 则是这个规范的具体实现者,它通过内部机制(如内存屏障、JIT 优化)来遵循 JMM 的规则,从而为 Java 开发者提供了可靠的并发编程环境。

六、最后

本来还想写写 GC 的发展史及不同版本的差异呢,发现啰啰嗦嗦写了一大堆,而且有些内容还只是浅尝辄止,毕竟 JVM 的知识涉及太多了,远不止几千字就能够说明白的,本篇文章仅当对 JVM 的了解了,如果有描述错误的地方还请批评指正。后面再单独写一篇关于垃圾回收的文章。

YOLOv11数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强 本文介绍了YOLOv11目标检测中的数据集增强技术,重点解决图像与标注标签同步扩充的关键问题。文章系统分析了三类增强方法:几何变换(翻转、旋转、缩放)、颜色变换(亮度、对比度调整)和高级增强(Mosaic、MixUp),并探讨了其在小样本检测、复杂场景泛化和多方向目标识别等场景的应用价值。针对核心的标签同步问题,提供了基于Python和OpenCV的详细代码实现示例,展示如何对图像进行水平翻转和缩放操作时精确调整YOLO格式边界框坐标。该技术能有效解决训练数据不足和多样性匮乏问题,显著提升模型的泛化性能。 阅读详情

相关推荐

从零开始:如何利用Device Monitoring Studio构建高效数据监控系统

本文详细介绍了如何利用HHD Device Monitoring Studio从零开始构建高效数据监控系统。涵盖基础架构设计、核心功能解析、实战部署指南及高级数据分析技术,帮助用户实现非侵入式监控,提升设备调试和网络协议分析效率。特别适合物联网和工业自动化领域的开发者与运维人员。

weixin_29201859的博客 327

Java-interface-jvm 层面的实现探析

Java 多态 JVM 层面实现 只是解析了类,本篇探析 interface 层面的实现。 测试代码 interface Eat package com.example.demo.invokeinterface; public interface Eat { void eat(); } interface Fly package com.example.demo.invokeinterface; public interface Fly { void fly(); } implement

power_to_go 331

Unity Shader实战:用Matcap给你的低模角色快速换上‘次世代’材质(附完整Shader代码)

本文详细介绍了Unity中Matcap技术的实战应用,通过Shader代码实现低模角色的次世代材质表现。Matcap技术利用预烘焙光照贴图,显著提升材质质感同时保持极低性能消耗,特别适合移动游戏和独立开发。文章包含完整Shader代码、平面模型着色优化方案及动态环境反射增强技巧,帮助开发者快速提升低模视觉效果。

weixin_28718755的博客 385

JAVA—JVM详解

JAVA—JVM详解 一、JVM 1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 通过JVM,Java实现了平

weixin_51356824的博客 2万+

【PLL】分频器设计权衡:从CMOS到CML的电路实现与优化

本文深入探讨了PLL中分频器的设计权衡,比较了CMOS和CML两种电路实现的优缺点。通过实际案例分析,展示了如何在速度、功耗和噪声之间取得平衡,特别是在5G射频芯片和Wi-Fi 6E等高频应用中的优化实践。文章还提供了混合架构设计和电源噪声协同优化的实用技巧,适合电路设计工程师参考。

weixin_42521843的博客 442

VS2019+CAXACAD2023二次开发教程(一、环境搭建)

CAXACAD2023的二次开发相关文件和库都在的文件夹下。CAXACAD2023的默认开发环境是VS2019,如果是用VS2019的环境话,可以直接安装这个插件,安装好后就可以一键新建的项目,新建的项目会自动帮我们配置好所有的环境,并且生成必要的代码和初始的框架。(本来想用VS2022的,但配置环境太麻烦,用VS2022,增加一个环境变量是可以运行自带的例程的,但新建项目要配置的东西和环境太多,就放弃折腾了)

weixin_42968757的博客 4616

JVM——JVM与Java体系结构

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

码说芯语的博客 1867

Selenium|通过更改亚马逊amazon的配送地获取当地的cookie

如果我们需要拿到国外配送地的商品信息,这个时候就需要用到selenium或者pypputeer自动化的方法去更改配送地,拿到当地的cookie信息,之后,携带当地的cookie使用requests发送请求,就可以拿到国外配送地的商品数据信息。一般来说,我们访问亚马逊,亚马逊的配送地一般显示的是国内,但是国内的商品信息和国外的商品信息其实是存在很大差别的,比如你在搜索框输入某个关键词,看到的

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 992

JVM监控:JVM监控指标、JVM监控界面实现、Java监控JVM

本文概要: 1、监控JVM的哪些指标; 2、一目了然的JVM监控的UI界面; 3、Java代码获取JVM监控状态。 1、监控JVM的哪些指标 javaVersion /** Java版本号 */ ...

tjiyu的博客 1万+

哨兵1号回波数据(L0级)包格式解析与成像参数提取

提取哨兵1号数据包的辅助数据、回波数据、定标数据。matlab代码在文末

3124

18006.STM32通过SPI读取LAN9253数据

【代码】18006.STM32通过SPI读取LAN9253数据。

写给自己的笔记 554

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

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

二蛋的博客 1472

MATLAB 与 STK 互联的两种连接方式详解

批量仿真推荐使用方法一;交互分析推荐使用方法二。可以根据具体任务灵活切换,也可以同时使用两种方式,提升建模与仿真的效率。

weixin_52370774的博客 1566

Java——jvm篇

汇总了java面试中常见的jvm相关问题

Michael_Jay的博客 3044

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java进程之间以及跟JVM关系

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

干货 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java-什么是JVM?JVM有什么作用?

在java的学习中会经常见到JVM这个词,但是都没有对JVM有一个明确的解释,我也是在学习过程中遇到了许多知识提及JVM,所以就去查阅资料,写下一些自己查到的理解。 JVM解释 JVM全称为Java Virtual MAchine-Java虚拟机,我们可以直观的从名字上得出一个定义:JVM是java上的一个虚构出来的计算机,是一个位于Java与操作系统之间的中间态。有自己完善的硬件结构,如处理器、...

阿巴卡的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性

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

weixin_45056021的博客 1337

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

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

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

如何通过Java命令行查看JVM参数

要通过Java命令行查看JVM的启动参数,你可以使用Java的java命令结合一些特殊的选项,但是java命令本身并不直接提供一个选项来列出所有JVM启动参数。

DKPT的博客 2138

JVM_Java虚拟机<深入理解Java虚拟机>走进JVM

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?栈:跨平台性、指令集小、指令多、执行性能比寄存器差言包括:Java、Scala、Groovy、Kotlin;

Coastlise的博客 1168

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

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

m0_73311735的博客 1249

【Java】JVM

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

athicket 1934

【Java】JVM基本组成

2. 为了提高执行效率,JVM 还会在运行期间,JVM 通过热点代码的统计分析,识别高频的方法调用,循环体、公共模块等,当超过阈值时,JVM 会基于。:在程序运行过程中,随着时间的推移, JIT 开始慢慢发挥了作用,把热点代码编译成本地代码后,以后执行相同的代码,即可直接交给CPU 执行,带来更高的执行效率。:不同的平台,执行字节码时,都需要各自的 虚拟机版本,用于将字节码翻译成当前平台可以执行的。:不同的平台,相同的源代码,编译的字节码是相同的,所以字节码文件可以在不同平台“通用”;

weixin_71491685的博客 1562

JAVA面试-JVM

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

冲击AI顶流!!! 1076

java(JVM)

JVM的学习和垃圾回收器的学习笔记

m0_64021225的博客 1480

从JVM Instructions看Java

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

Ant Ren的专栏 1833
上一篇: 在安卓中使用 FFmpegKit 剪切视频并添加文字水印
下一篇: Java垃圾回收(GC)探析
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值