JVM底层实现原理(字节码执行细节与垃圾回收)

【JVM】一文掌握JVM垃圾回收机制 作为Java程序员,除了业务逻辑以外,随着更深入的了解,都无法避免的会接触到JVM以及垃圾回收相关知识。JVM调优是一个听起来很可怕,实际上很简单的事。 感到可怕,是因为垃圾回收相关机制都在JVM的C++层实现,我们在Java开发中看不见摸不着;而实际很简单,是因为它说到底,也只是JVM替我们实现的垃圾对象回收机制,也是普通的程序代码,只要理解了垃圾回收器的底层设计思想,掌握JVM调优并非难事! 阅读详情

1、何为JVM:
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
2、JVM的重要性
在学习java时我们能会知道java语言为什么会如此受人们爱戴,一部分原因是来自它的跨平台性,之所以跨平台是因为java笼统来说属于编译型语言(当然细致来说是:编译——解释型),编译一次后以字节码文件(.class)文件保留在机器中,JVM在解析字节码文件时,可以根据操作系统的不同而解析成相应的机器码(隐藏底层细节的特性)。Java源文件执行过程如下:
在这里插入图片描述

3、JVM、JRE、JDK
说到JVM必不可少的会联系起JRE、JDK。搞清三者之间的关系是每位java学者都必须掌握的。
JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。

JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。

JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

以上定义太过于官方言语,简记:某某某,是。。。,提供。。。,具体如下
JDK:Java开发工具包,是Java开发环境的核心组件,提供编译、调试和运行一个Java程序所需要的所有工具,可执行文件和二进制文件。
JRE:Java运行时环境,是JVM的实现,提供了运行Java程序的平台。
JVM:Java虚拟机,是负责将字节码转换为机器码的地方,提供了内存管理/垃圾回收和安全机制等。

图解:
在这里插入图片描述
4、JVM的底层原理
在这里插入图片描述
(1)、总体组成分为三部分:
类装载器(ClassLoader):用来装载.class文件

执行引擎:执行字节码,或者执行本地方法

运行时数据区(内存模型):方法区(元空间)、堆内存、虚拟机栈(线程)、PC寄存器(程序计数器)、本地方法栈

常考重点:运行时数据区各个区的作用
内存堆:存放new出来的对象。
虚拟机栈:局部变量(方法中的变量)、引用变量。
方法区:类信息(对象的代码、属性、方法)、常量、静态变量。
本地方法栈:提供本地方法的服务。
程序计数器:字节码的位置指示器。
其中方法区和内存堆是线程共享的。
(2)、工作原理
假设一java程序如下:
在这里插入图片描述
main方法是程序的主入口,率先会在“栈”中创建一个main线程,它具有自己独立的内存空间,相当于一个小的“栈”,同时它会给main方法其它对象分配内存空间,称为:“栈帧”。如图:
在这里插入图片描述
思考:compute()方法中有自己的变量和表达式,JVM该如何去执行它们呢?
compute()栈帧内存中又分为四个部分:局部变量表、操作数栈、动态链接、方法出口。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
顾名思义,局部变量表是给局部变量分配内存空间的地方,操作数栈是给变量赋值时存放数值的地方,此时JVM通过执行上示图中的指令码(出栈入栈)来完成赋值操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建一个新的线程时,不仅会在栈中分配一块内存空间还分在程序计数器区中分配一块内存空间,用来记录JVM执行的位置(红色框):
在这里插入图片描述
在这里插入图片描述
程序计数器的作用:当有优先级更高的线程抢占cpu时,该线程就会被挂起,再次执行时cpu可以根据程序计数器记录的位置来承接执行。
那么谁来修改程序计数器的值及其它动作的驱动呢?就是它——字节码执行引擎(谨记组成图)
动态链接:当某个对象调用某个方法时,要在方法区找到它的位置,而动态链接就是记录所在方法区的入口位置。
方法出口:当mian方法调用并执行完compute方法时,找到方法出口记录的位置并继续执行下一条语句。
在这里插入图片描述
当main方法中的math对象要去调用其它方法或变量时,会先去堆中找到内存地址。说白了“堆”就是存放对象内存地址空间的。
5、JVM垃圾回收原理
垃圾回收原理时进行JVM调优的重要路径也是JVM原理的重要知识点。回收方法(算法)有:标记-整理算法、标记-清除算法、复制算法、分代收集算法。
这里具体讲一下JVM常用的“分代收集算法”和“复制算法”。
JVM的内存可以分为堆内存和非堆内存。堆内存分为年轻代和老年代。年轻代又可以进一步划分为一个Eden(伊甸)区和两个Survivor(幸存)区组成。
在这里插入图片描述
(1)、JVM堆内存的分配:
如图:
在这里插入图片描述

JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64。JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此我们一般设置-Xms和-Xmx相等以避免在每次GC 后调整堆的大小。

通过参数-Xmn2G 可以设置年轻代大小为2G。通过-XX:SurvivorRatio可以设置年轻代中Eden区与Survivor区的比值,设置为8,则表示年轻代中Eden区与一块Survivor的比例为8:1。注意年轻代中有两块Survivor区域。
(2)、老年代和年轻代:
Minor GC(年轻代GC):
对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,因为Java大多数对象都是朝生夕灭,所以Minor GC非常频繁,而且速度也很快。

Full GC(老年代GC):
Full GC是指发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。
(3)、垃圾回收方式:
大对象和长期存活的对象将进入老年代,每一次MinorGC(年轻代GC),对象年龄就大一岁,默认15岁晋升到老年代,通过-XX:MaxTenuringThreshold设置晋升年龄。
第一次MinorGC:Eden区被GC-Root标记的对象为“非垃圾对象”,就会被“复制算法”复制到Survivor1区,幸存下来的分代年龄就会加1
第二次MinorGC:Eden、Survivor1区幸存下来的对象会共同挪到Survivor2区,同时分代年龄加1
第三次MinoorGC:Eden、Survivor2区幸存下来的对象会共同挪到Survivor2区,同时分代年龄加1
。。。。。以此反复,当对象年龄等于15时,会被放到老年代区
当老年代内存满时,会进行一次full gc,伴随着STW(Stop The Work):清理垃圾时会停掉其他线程。
优化——减少STW——减少full gc:因为full gc是在整个堆里清理垃圾,STW发生概率大。

(4)JVM如何判定一个对象是否应该被回收?(重点掌握)
判断一个对象是否应该被回收,主要是看其是否还有引用。判断对象是否存在引用关系的方法包括引用计数法以及root根搜索方法。
root根搜索方法:可达性分析算法————GC Roots
将“GC Roots”对象作为起点,从这些结点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。
GC Roots根结点的对象:
a、栈引用的对象
b、方法区中类静态属性引用的对象
c、方法区中常量引用的对象
d、native方法引用的对象
在这里插入图片描述

(5)、垃圾回收算法(重点)
HotSpot虚拟机采用了root根搜索方法来进行内存回收,常见的回收算法有标记-清除算法,复制算法和标记整理算法。

标记-清除算法:
标记-清除算法执行分两个阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,并且会产生内存碎片。
在这里插入图片描述
复制算法:
复制算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另一个区域中。复制算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。
在这里插入图片描述
标记-整理算法:
标记-整理算法结合了“标记-清除”和“复制”两个算法的优点。也是分两个阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
在这里插入图片描述
垃圾回收算法是垃圾收集器的算法实现基础,年轻代垃圾回收一般采用复制算法(回想到年轻代的多区结构:Eden,s1,s2),老年代垃圾回收一般采用标记-清除和标记-整理算法。

(6)垃圾收集器(主要掌握CMS)
结合第五知识点,垃圾收集器就是垃圾回收算法的具体实现。
主要包括七种,即Serial、Serial Old、ParNew、Darallel Scavenge、Parallel Old以及CMS、G1收集器。如下图所示:
在这里插入图片描述

CMS的垃圾收集过程分为4步:
初始标记:需要“Stop the World”,初始标记仅仅只是标记一下GC Root能直接关联到的对象,速度很快。
并发标记:是主要标记过程,这个标记过程是和用户线程并发执行的。
重新标记:需要“Stop the World”,为了修正并发标志期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录(停顿时间比初始标记长,但比并发标记短得多)。
并发清除:和用户线程并发执行的,基于标记结果来清理对象。
在这里插入图片描述
那么问题来了,如果在重新标记之前刚好发生了一次MinorGC,会不会导致重新标记阶段Stop the World时间太长?
答:不会的,在并发标记阶段其实还包括了一次并发的预清理阶段,虚拟机会主动等待年轻代发生垃圾回收,这样可以将重新标记对象引用关系的步骤放在并发标记阶段,有效降低重新标记阶段Stop The World的时间。
CMS垃圾回收器的优缺点分析:
CMS以降低垃圾回收的停顿时间为目的,很明显其具有并发收集,停顿时间低的优点。
缺点主要包括如下:
在这里插入图片描述

*参考视频:https://ke.qq.com/webcourse/index.html#cid=230866&term_id=100272363&taid=3625450614261202&vid=5285890807081339152*
参考资料:牛客网《Java开发岗高频面试题全解析》

用C++从零实现JVM:深入解析字节码执行、垃圾回收与JIT编译原理 Java虚拟机(JVM)作为Java生态的基石,其核心在于提供一个跨平台的运行时环境,将Java字节码转换为可执行的机器指令。其工作原理涉及类加载、内存管理、字节码解释与即时编译等多个关键子系统。理解JVM的内部机制,对于进行性能调优、排查线上问题以及深入理解编程语言运行时至关重要。在工程实践中,手动实现一个简化版JVM是掌握这些原理的有效途径。通过使用C++这样的系统级语言,开发者可以深入控制内存布局、线程调度和机器码生成,从而透彻理解垃圾回收(GC)算法如何管理对象生命周期,以及即时编译器(JIT)如何 阅读详情

相关推荐

JVM虚拟机技术原理与实现

Java是Sun公司推出的Java语言和Java平台的总称,在操作系统中安装Java平台后Java应用程序即可直接运行。Java程序被编译成字节码解释执行,使Java程序与平台无关。Java是一种技术,由Java编程语言、Java类文件格式、Java虚拟机(JVM)和Java API组成。JVM是Java 技术的核心,必须在指定的机器或者设备中安装部署JVM后才能够运行Java 程序。

悦分享 663

【Java jvm工作原理 全面详细】简单理解

AVM一、JVM基础知识(一)java跨平台解释(二)JVM介绍(三)JDK、JRE、JDK三者关系(四)JVM的生命周期启动和消亡:JVM运行起点:JVM的两种线程:二、JVM的工作机制(类加载机制)(一)类加载时机(二)类加载器(三)双亲委派模型(四)类加载详细过程 一、JVM基础知识 (一)java跨平台解释 注意:我们提到java跨平台性,就会想到JVM,但能跨平台的是java程序,而不是...

qq_44682003的博客 1635

基于LendingClub数据的信贷分析和建模报告

一:课题分析 二:数据获取 三:数据探索 3.1主要特征含义理解 3.2特征分布 3.2.1目标特征分布 3.2.2分类变量的分布 3.2.3连续数值特征分布 3.2.4时序特征分布 3.2.5文字特征分布 3.2.6两两特征的协方差 四:数据预处理 4.1数据集划分 4.2特征缺失值识别与处理 4.2.1严重缺失值的处理 4.2.2缺失值填充 4.3同值性特...

棒子皮蹦蹦床 2万+

【转】JVM介绍

1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字...

weixin_34200628的博客 427

变色龙哈希函数 Chameleon Hash 可变型区块链

哈希函数 Hash: 众所周知,区块链有着极其优秀的安全性就是因为其充分使用了哈希函数。 哈希简单用一句话来讲,就是:将任意长度输入的字串可转换成一个固定长度的字串,通过原始字串可以很容易地算出转换后的字串,通过转换后的字串很难还原出原始字串。 哈希函数特征: 1. 对于任意m作为输入,得到输出的结果,很难找到另一个输入m'  (m'不等于m),使得m'的Hash结果也为同样的输出

新手村 1万+

在Ubuntu上通过Wine完美运行企业微信的详细指南

本文提供了在Ubuntu系统上通过Wine兼容层安装和运行企业微信的详细教程。针对官方未提供Linux版本的痛点,指南推荐使用Ubuntu Kylin团队优化打包的Wine环境,通过简单的命令行步骤即可完成部署,并涵盖启动、中文输入法配置、文件管理等常见问题的解决方案,帮助用户实现高效、稳定的办公沟通。

weixin_29306317的博客 232

JVM之前世今生实现讲解

JVM之前世今生实现讲解前世今生虚拟机始祖JDK1.0Classic虚拟机JDK1.2Exact VMHotSpot VM(第一)特点天下第二:BEA JRockit/ IBM J9 VMBEA JRockit VM研究方向后续IBM J9 VM研究方向优点后续专有虚拟机VEA Liquid VM简介后续Zing优点 前世今生 首先放出一张图,这张图是《深入理解JAVA虚拟机》中的配图,本文也是根据这本书进行的记录。 虚拟机始祖 虚拟机始祖——Classic/Exact VM JDK1.0 虚拟机Vir

北洋的博客 1601

DDR内存条选购避坑指南:单Rank vs 双Rank性能实测对比(附2024年颗粒推荐)

本文深入解析了内存条中单Rank与双Rank设计的原理与性能差异。通过实战测试对比,揭示了双Rank内存在高负载场景(如3D渲染、视频剪辑)中凭借Rank Interleaving技术带来的显著性能优势,并提供了2024年针对不同用户需求的DDR4/DDR5内存选购策略与避坑指南。

ik678901的博客 1130

深入元空间

完成一次垃圾回收,此时O类型的两个对象已被清理,剩下的P类型的对象和类加载器的实例一起被复制到了Survivor区域。但是,此处虽然O类型不再使用,但是对应的元空间的内存占用不能被释放,因为这个类加载器,不仅仅负责O类型,还负责P类型,而P类型还存在实例,因此不可以被回收。此时,存在两个类型为O的对象,一个类型为P的对象,对应的类加载器的实例是深蓝色的那个圆。bootstrap类加载器和application类加载器是不会被回收的,而动态类加载器,在其负责加载的类对象不再使用时会被回收。

『程序员·小李』的博客 1429

Label Studio保姆级教程:从零搭建医疗影像标注平台(DICOM格式支持)

本文提供基于Label Studio从零搭建医疗影像标注平台的保姆级教程。针对DICOM格式支持,详细阐述了环境部署、DICOM深度集成与预处理、团队协作权限管理以及质量审核闭环等核心环节,旨在构建一个高效、可落地的医疗AI数据标注解决方案,助力模型落地。

nft7creator的博客 304

路径规划 | 图解RRT*算法(附ROS C++/Python/Matlab仿真)

RRT*算法针对传统RRT算法进行了渐进最优改进,在添加节点到搜索树的过程中进行重连选择。本文图解RRT*算法原理,并采用ROS C++、Python、Matlab三种语言实现算法,加深理解

FRIGIDWINTER的博客 9405

JVM专题七:JVM垃圾回收机制

中,我们介绍了JVM内存主要分哪些区域,这些区域分别是干什么的,同时也举了个例子,在运行过程种各个区域数据是怎样流转的。细心的小伙伴可能发现一个问题,在介绍完方法弹栈以后就没有介绍后续流程了。方法执行完以后,堆内存存放的对象实例咋整呢,带着这样的疑问进入今天的内容。

Jeremy程序员 2万+

手把手教你学simulink实例--基于Simulink的航空航天器飞行轨迹规划与仿真详细介绍

航空航天器飞行轨迹规划是实现高效、安全和精确飞行的关键技术。通过Simulink进行航空航天器飞行轨迹规划与仿真,可以验证控制算法的有效性、优化飞行路径,并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个航空航天器飞行轨迹规划系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的航空航天器飞行轨迹规划与仿真系统。该系统能够根据实时环境变化动态调整飞行轨迹,从而提高飞行效率、降低燃料消耗并提升安全性。

MHD0815的博客 390

JVM垃圾回收器上篇

有了前面的理论铺垫,接下来我们正式开始学习实际垃圾回收器。

javashitu的博客 1612

FPGA入门200例(17):如何阅读RTL原理图(Schematic)?将Verilog代码与门级电路对应

本文针对FPGA开发新手常见误区,重点讲解了RTL原理图的重要性和阅读方法。文章指出,仅通过仿真验证代码会导致板级测试异常,而RTL原理图能直观呈现Verilog代码对应的硬件结构(门电路、寄存器、多路选择器等)。通过"识别基础元件→跟踪信号路径→验证逻辑关系"的三步法,新手可以建立代码与硬件的映射思维,排查冗余逻辑、意外锁存器等错误。文章还结合Vivado/Quartus工具操作指南和典型代码案例,帮助读者掌握从代码到硬件实现的转换过程,避免混淆RTL与门级原理图、忽略信号位宽等常见误

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 201

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

细谈JVM垃圾回收与部分底层实现

JVM系列文章目录 初识JVM 深入理解JVM内存区域 玩转JVM对象和引用 JVM分代回收机制和垃圾回收算法 细谈JVM垃圾回收与部分底层实现 细谈JVM垃圾回收与部分底层实现JVM系列文章目录前言并发标记与三色标记三色标记漏标的原因CMS中解决漏标问题的方案G1中解决漏标问题的方案G1和CMS解决漏标问题的区别G1中的部分技术细节G1的内存区域不固定跨代引用与CradTable、RsetCradTbaleRset安全点和安全区域安全点安全区域低延迟的垃圾回收器垃圾回收器三项指标EplisonZGCSh

羽毛的博客 707

深度学习工具包 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详解

jvm核心知识点讲解

H_xxxxd的博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JVM上篇学习3--内存与垃圾回收

JVM上篇学习3–内存与垃圾回收 执行引擎 StringTable 垃圾回收概述

xu_jin_shan的博客 3826

JVM基础学习:基本原理、JVM结构、垃圾回收机制及回收算法、jdk1.8和jdk1.7区别

1、JDK的基本概念 我们可以把Java程序设计语言、Java虚拟机、 Java API类库这三部分统称为JDK( Java Development Kit),JDK是用于支持Java程序开发的最小环境。另外,可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE( Java RuntimeEnvironment),JRE是支持Java程序运行的标准环境。 ...

小喵的博客 6400

JVM与垃圾回收笔记

JVM与垃圾回收1.JVM与Java体系结构1.1 Java虚拟机1.1.1 简介1.1.2 作用1.1.3 特点1.1.4 JVM的位置1.2 JVM的整体结构1.3 java代码执行流程1.4 JVM的架构模型1.5 JVM的生命周期1.5.1 虚拟机的启动1.5.2 虚拟机的执行1.5.3 虚拟机的退出1.6 常见的java虚拟机2.类加载子系统2.1 类加载器与类的加载过程2.1.1总体流程2.1.2 类加载子系统的作用2.1.3 类加载器ClassLoader角色2.1.4 类的加载过程 1.JV

Listen·Rain的博客 2019

说说JVM的底层原理(JAVA是如何运行的)?

Java 虚拟机(JVM)是 Java 程序运行的核心环境,其设计融合了内存管理、类加载、垃圾回收和高效执行等复杂机制。以下从底层视角详细解析其核心模块,并结合实际场景说明其工作原理。,不仅能优化应用性能(如减少 Full GC 停顿),还能有效排查内存泄漏、锁竞争等问题,是高级 Java 开发的必备技能。类加载是 JVM 动态性的基石,其触发条件包括首次使用类(如。、反射调用等)或继承父类时。:静态集合持有对象导致无法回收。

千层冷面的博客 1927

深入剖析 JVM 核心底层:从内存结构到垃圾回收的完整逻辑

本文深入解析JVM底层机制,从内存结构、运行机制、类加载到垃圾回收四个维度进行技术拆解。详细分析了栈帧的生命周期与内部结构,通过javap工具解读字节码执行逻辑;阐述双亲委派模型的原理及打破场景;对比不同垃圾回收算法的优缺点及适用场景。文章强调理解JVM底层对优化Java程序性能、解决内存问题的重要性,为开发者提供从"会写代码"到"写好代码"的关键技术支撑。

X13100387636的博客 824

JVM底层实现原理

1.JVM内存模型 先上图,先上图,先上图!!! 想必大家都似曾相识的见过,见过,见过这张图,这是JDK体系结构图。 都是英文,翻译过来也看不懂,我还是介绍一下吧!!! 这里的核心就是JVM,它也是实现JAVA语言跨平台的核心。 这里注意,在我们搭建JAVA开发环境的时候,下载JDK的时候,会提供系统版本,下图 这是因为不同的JDK搭载的环境系统,会将.class文件由JVM挂载到当前机器能...

程序员劝退师的博客 897

JVM_虚拟机目录

<font color="red">在人生的道路上,即使一切都失去了,只要一息尚存,你就没有丝毫理由绝望。因为失去的一切,又可能在新的层次上复得</font> [JVM00_面试官对类加载器子系统、运行时数据区、内存分布、执行引擎 你能坚持到第几问?](https://blog.youkuaiyun.com/TZ845195485/article/details/117573479) [JVM01_概述、跨平台原理、分类、三大商业虚拟机](https://blog.youkuaiyun.com/TZ845195485/articl

所得皆惊喜 4万+

打开jvm的黑盒子,梳理下jvm的垃圾回收以及选用对应的垃圾回收算法的原因

梳理下jvm的大体脉络,后续再更新

wy_05689的博客 707

Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器

Java高级JVM知识点记录,类加载器、运行时数据区、执行引擎、垃圾回收、常见面试题

n_AloneT的博客 1453
上一篇: 基于ssh的后台新闻管理系统
下一篇: MySQL索引本质解析
Senye_ing
博客等级 码龄8年 24粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Senye_ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值