【JAVA虚拟机】java虚拟机

泛微ecology9 利用字段值动态控制明细表显示与隐藏 本文详细介绍了在泛微ecology9中,如何利用WfForm.bindFieldChangeEvent监听字段变化,结合jQuery动态控制明细表显示与隐藏的实战方法。通过五步操作,可实现根据字段值(如报销类型)智能切换明细表,提升表单交互体验与开发效率,并确保PC与移动端完美兼容。 阅读详情


前言

记录java虚拟机常见的问题场景。


提示:以下是本篇文章正文内容,下面案例可供参考

一、JAVA内存结构体系

1.整体结构
在这里插入图片描述
2.堆结构
在这里插入图片描述
这块区域是JVM中最大的,用于存储应用的对象和数组,也是GC主要的回收区,一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。
堆内存分为三部分:新生代、老年代。

引申:新生代s0,s1区域作用?
背景:如果没有s区,我们的对象直接到达
目的:降低老年代的内存分配压力,通过设置两个s区来对年轻对象进行拦截,降低fullGc的次数

引申:为什么是8:1:1
新生代98%的对象都是朝生夕灭的,所以我们只需要预留10%的空间放存活的对象。

引申:为什么分代?
不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。

3、栈结构
在这里插入图片描述
栈帧空间在什么销毁:
a.当我们方法执行结束之后,栈帧空间也会销毁
b.方法抛出异常。

4.程序计数器
程序计数器记录我们当前线程执行的行号。(只有在多线程中才有
作用,线程切换的时候通过程序计数器知道在哪行继续执行。)
程序计数器内存区域是虚拟机中唯一没有规定OutOfMemoryError情况的区域。

5.本地方法栈
本地方法栈和JVM栈的差异
他们都是线程私有的,区别是JVM栈为JVM执行Java方法(也就是字节码)服务,而本地方法栈为JVM使用到的Native方法服务

二、双亲委派机制

https://www.jianshu.com/p/538c49e4c132

三、JAVA虚拟机调优场景

1.CPU占用过高

场景:死循环

问题分析:
1)业务量瞬间飙升->正常现象,可考虑扩容

2)程序出现死循环->以下步骤进一步分析问题
技术手段定位:
1)top命令查看cpu占用情况
在这里插入图片描述
这样就可以定位出cpu过高的进程。在linux下,top命令获得的进程号和jps工具获得的vmid是相同的:
在这里插入图片描述

2)用top -Hp命令查看线程的情况
在这里插入图片描述
可以看出7287一直在占用线程cpu

3)把线程号转换为16进制
[root@localhost ~]# printf “%x” 7287
1c77

4)用jstack工具查看线程栈情况
在这里插入图片描述
通过jstack工具输出现在的线程栈,再通过grep命令结合上一步拿到的线程16进制的id定位到这个线程的运行情况,其中jstack后面的7268是第(1)步定位到的进程号,grep后面的是(2)、(3)步定位到的线程号。

从输出结果可以看到这个线程处于运行状态,在执行com.spareyaya.jvm.service.EndlessLoopService.service这个方法,代码行号是19行,这样就可以去到代码的19行,找到其所在的代码块,看看是不是处于循环中,这样就定位到了问题。

2.死锁

死锁并没有第一种场景那么明显,web应用肯定是多线程的程序,它服务于多个请求,程序发生死锁后,死锁的线程处于等待状态(WAITING或TIMED_WAITING),等待状态的线程不占用cpu,消耗的内存也很有限,而表现上可能是请求没法进行,最后超时了。在死锁情况不多的时候,这种情况不容易被发现。

可以使用jstack工具来查看

(1)jps查看java进程
[root@localhost ~]# jps -l
8737 sun.tools.jps.Jps
8682 jvm-0.0.1-SNAPSHOT.jar

(2)jstack查看死锁问题

由于web应用往往会有很多工作线程,特别是在高并发的情况下线程数更多,于是这个命令的输出内容会十分多。jstack最大的好处就是会把产生死锁的信息(包含是什么线程产生的)输出到最后,所以我们只需要看最后的内容就行了
在这里插入图片描述

3.内存泄漏

出现泄漏的场景:
使用静态集合类,或者监听器没关,创建的连接等导致的对象没有被回收;

程序发生内存泄漏后,进程的可用内存会慢慢变少,最后的结果就是抛出OOM错误。发生OOM错误后可能会想到是内存不够大,于是把-Xmx参数调大,然后重启应用。这么做的结果就是,过了一段时间后,OOM依然会出现。最后无法再调大最大堆内存了,结果就是只能每隔一段时间重启一下应用。

内存泄漏的另一个可能的表现是请求的响应时间变长了。这是因为频繁发生的GC会暂停其它所有线程(Stop The World)造成的。

为了模拟这个场景,使用了以下的程序

代码如下(示例):

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        while (true) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            main.run();
        }
    }

    private void run() {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            executorService.execute(() -> {
                // do something...
            });
        }
    }
}

运行参数是-Xms20m -Xmx20m -XX:+PrintGC,把可用内存调小一点,并且在发生gc时输出信息,运行结果如下

在这里插入图片描述
可以看到虽然一直在gc,占用的内存却越来越多,说明程序有的对象无法被回收。但是上面的程序对象都是定义在方法内的,属于局部变量,局部变量在方法运行结果后,所引用的对象在gc时应该被回收啊,但是这里明显没有。

为了找出到底是哪些对象没能被回收,我们加上运行参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.bin,意思是发生OOM时把堆内存信息dump出来。运行程序直至异常,于是得到heap.dump文件【这种方法dump出来的快照会比较大】

可以看到居然有21260个Thread对象,3386个ThreadPoolExecutor对象,如果你去看一下java.util.concurrent.ThreadPoolExecutor的源码,可以发现线程池为了复用线程,会不断地等待新的任务,线程也不会回收,需要调用其shutdown()方法才能让线程池执行完任务后停止。

其实线程池定义成局部变量,好的做法是设置成单例

拓展,另一种方式获取dump文件
在线上的应用,内存往往会设置得很大,这样发生OOM再把内存快照dump出来的文件就会很大,可能大到在本地的电脑中已经无法分析了(因为内存不足够打开这个dump文件)。这里介绍另一种处理办法:

(1)用jps定位到进程号
在这里插入图片描述
因为已经知道了是哪个应用发生了OOM,这样可以直接用jps找到进程号135988

(2)用jstat分析gc活动情况
jstat是一个统计java进程内存使用情况和gc活动的工具,参数可以有很多,可以通过jstat -help查看所有参数以及含义
在这里插入图片描述
上面是命令意思是输出gc的情况,输出时间,每8行输出一个行头信息,统计的进程号是24836,每1000毫秒输出一次信息。

输出信息是Timestamp是距离jvm启动的时间,S0、S1、E是新生代的两个Survivor和Eden,O是老年代区,M是Metaspace,CCS使用压缩比例,YGC和YGCT分别是新生代gc的次数和时间,FGC和FGCT分别是老年代gc的次数和时间,GCT是gc的总时间。虽然发生了gc,但是老年代内存占用率根本没下降,说明有的对象没法被回收(当然也不排除这些对象真的是有用)。

(3)用jmap工具dump出内存快照

jmap可以把指定java进程的内存快照dump出来,效果和第一种处理办法一样,不同的是它不用等OOM就可以做到,而且dump出来的快照也会小很多。

jmap -dump:live,format=b,file=heap.bin 24836

这时会得到heap.bin的内存快照文件,然后就可以用eclipse来分析了。

另外一个例子:https://www.jianshu.com/p/15637724ef16

参考内存溢出和内存泄漏的例子:https://blog.youkuaiyun.com/crazymakercircle/article/details/114421142

4.元数据空间溢出

元数据区:元数据区的概念出现在Java8以后,在Java8以前成为方法区,元数据区也是一块线程共享的内存区域,主要用来保存被虚拟机加载的类信息、常量、静态变量以及即时编译器编译后的代码等数据。

参考:
https://segmentfault.com/a/1190000023289961

大量的反射会

总结:
以上三种严格地说还算不上jvm的调优,只是用了jvm工具把代码中存在的问题找了出来。我们进行jvm的主要目的是尽量减少停顿时间,提高系统的吞吐量。

但是如果我们没有对系统进行分析就盲目去设置其中的参数,可能会得到更坏的结果,jvm发展到今天,各种默认的参数可能是实验室的人经过多次的测试来做平衡的,适用大多数的应用场景。

如果你认为你的jvm确实有调优的必要,也务必要取样分析,最后还得慢慢多次调节,才有可能得到更优的效果。

性能调优归纳

1. jps
jps 是 JDK 提供的Java进程查看⼯具,ps 是 Process Status 的缩写, 这个⽤法也很简单。
直接输⼊ jps 命令,就能列出当前系统下,所有正在运⾏的 Java 进程以及进程对应的 PID 。

$ jps
17680 Jps
109 Main

2、jstat
jstat 的全称是 statistics monitoring tool ,顾名思义,统计数据监控⼯具,就是⽤来对 Java程序的资源
和性能进⾏实时监控的。

它提供的功能还挺多的,但是我们最常⽤的,还是它的 GC 实时监控功能,可以说,这个⼯具是线上监
控 GC 情况最好的⼯具之⼀。

它的使⽤⽅式也很简单:
jstat -gcutil [-t] 3s 1000

-gcutil :GC 相关区域的使⽤率(utilization)统计
-t :可选,⽤于打印时间戳,即 JVM 启动到现在的秒数
3s :采样频率,默认单位为ms,可以使⽤ s 或 ms 结尾,如果使⽤ s,则频率就是秒。
1000:采样总次数

在这里插入图片描述
让我简单给⼤家解释⼀下,每⼀列的意思
在这里插入图片描述
3、jmap
如果 JVM 参数设置没问题,但却出现频繁 GC 且内存未被回收的情况的话,那就要考虑⼀下是否存在内
存泄漏的情况了。这时候就需要祭出我们的 B超,jmap。

它常⽤的功能有3个:

-heap pid :打印 堆内存/内存池 的配置和使⽤信息。
-histo :看哪些类占⽤的空间最多。
live :也可以只显⽰存活对象,会触发⼀次 Full GC。
-dump:live,format=b,file=xxx.hprof pid :dump 当前的堆内存。
live :只 dump 存活对象,如果不指定这个参数,则默认会 dump 堆中的所有对象。
live参数实际上是产⽣⼀次Full GC来保证只看还存活的对象。
format=b :⼆进制的格式
file=xxxx :将 dump 的内容转储到什么⽂件中。

4、调优思路总结
1)JVM性能调优的评估指标及调优示例
参考:https://www.jianshu.com/p/32358bea9c9e
2)线上问题排查思路
观察问题现象
借助jvm命令工具:jps,jstat,jstack,jmap–>打印堆文件
使用笛第三方工具进行分析:

三、垃圾回收器

1、垃圾回收算法

1)标记-清除
标记要回收的对象,然后进行清除
缺点:
效率问题
空间碎片
2) 标记-复制算法
它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。
缺点:只有一半内存可以用
3)标记-整理算法
把存活的对象移向一端,然后进行清理;
4)分代收集算法(这也是为什么要分少年区和老年区的问题)
新生区:使用标记-复制,付出复制成本就可以完成垃圾收集
老年代:标记-清除或标记-整理

2、垃圾收集器

1)serial收集器

它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( “Stop The World” ),直到它收集结束。【新生代采用标记-复制算法,老年代采用标记-整理算法。】

2)ParNew 收集器
ParNew 收集器其实就是 Serial 收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等等)和 Serial 收集器完全一样。【新生代采用标记-复制算法,老年代采用标记-整理算法。】

拓展:除了 Serial 收集器外,只有它能与 CMS 收集器(真正意义上的并发收集器,后面会介绍到)配合工作。

3)Parallel Scavenge 收集器
Parallel Scavenge 收集器关注点是吞吐量(高效率的利用 CPU),并行的。使用 Parallel Scavenge 收集器配合自适应调节策略,把内存管理优化交给虚拟机去完成也是一个不错的选择。
【新生代采用标记-复制算法,老年代采用标记-整理算法】

这是 JDK1.8 默认收集器

4)CMS
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用。

初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;
并发标记: 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短
并发清除: 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。

CMS优点:并发收集、低停顿。
CMS缺点:
1、对CPU资源敏感,用户线程和垃圾收集线程会争抢资源,会对垃圾收集的吞吐量造成影响。
2、无法处理浮动垃圾,在并发清理的过程中从非垃圾对象编程垃圾对象的对象就是浮动垃圾,这种浮动垃圾会在下一次gc的时候被清理掉。
3、因为使用的是标记–清除算法,所以会产生大量的内存碎片,但是我们可以通过设置-XX:+UseCMSCompactAtFullCollection参数来让每次做完CMS之后做一次标记–整理来消除内存碎片。
4、concurrentmode failure(并发失败),在CMS执行并发的过程中,由于用户线程还在执行,万一丢进来的大对象老年代放不下,这个时候并发过程进行不下去了,这个时候就产生了并发失败,接下来不会OOM,而是会STW,用serial old垃圾收集器来回收(因为只有Serial和ParNew可以和CMS配合使用),然后就相当慢,给用户的感觉就是网页卡住了,解决方案是配置-XX:CMSInitiatingOccupancyFraction参数,详情请看下面辅助知识的CMS核心参数。

5)G1 收集器
G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征。

四、八股文面试题
1、新生代会stw吗
copy算法会STW,但是因为对象比较少,所以也没有多大的影响。

2、类加载过程
加载:硬盘上查找通过io读入字节码文件,使用类时进行加载。例如调用main方法,new对象等等
验证:校验字节码文件的正确性
准备:给类的静态变量分配内存,并赋予默认值
解析:将符号引用替换为直接引用
初始化:对类的静态变量初始化为代码中指定的值,执行静态代码块

3、为什么pc寄存器被设定为私有?
背景:多线程在一个时间段才会执行一个线程的方法,cpu不停的切换任务,导致经常中断和恢复。那我们怎么才能避免恢复后线程继续执行代码的位置?
解决:给每一个线程分配一个寄存器,保证每一个线程之间不受影响

4、对象创建五个步骤?

5、对象分配过程
在这里插入图片描述

31、车载通信中的可见光通信(VLC)技术解析 本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。 阅读详情

相关推荐

【博客汇总】UV打印机博客汇总

UV平板机博客汇总

Print World的专栏 1739

Java虚拟机

实现通过类的权限限定名获取该类的二进制字节流的代码块叫做类加载器。启动类加载器(BootstrapClassLoader),使用C++语言编写,用来加载Java核心类库,它无法被应用程序直接使用。扩展类加载器(ExtensionClassLoader),使用Java编写,且父类加载器是Bootstrap,用来加载扩展库里面的类。系统类加载器(ApplicationClassLoader),根据Java的类路径(CLASSPATH)来加载Java类,参考JVMhttphttps。...

zhangzhang_one的博客 2454

MTK Linux Charger驱动分析(二) - power_supply_core.c

的核心作用可以概括为:提供统一的电源管理框架;管理电源设备注册、属性访问、事件通知;封装sysfs 接口和 uevent 通知,屏蔽硬件细节;驱动开发者只需要实现,不关心底层通知和接口细节。简单来说,它是电源子系统的“大脑和中枢”,具体的电池/充电器只是“信息源”。

iTom1900 1488

《深入理解java虚拟机》读书笔记

1. 运行时数据区域 1.1 程序技术器 可以看作是当前线程所执行的字节码的行号指示器,通过它来取下一条需要执行的指令。 线程私有内存。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。 因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线

啊哈的博客 1504

Android/AutoMotive 多用户文件操作与权限管理

本文深入探讨了Android/Automotive多用户系统的文件操作与权限管理机制。文章阐述了多用户隔离与共享的核心原理,重点介绍了如何使用adb指令精准管理不同用户的应用与数据,并提供了在Android Automotive车载场景下实现安全跨用户数据共享与权限控制的最佳实践。

weixin_29214691的博客 162

从实验室到生产线:Qwen3-Omni后训练技术在实际业务中的落地挑战

本文探讨了Qwen3-Omni后训练技术在实际业务中的落地挑战,重点分析了多模态AI在工业应用中的关键问题与解决方案。通过金融风控、跨境电商等场景案例,揭示了通用模型与垂直需求的矛盾,并提供了知识蒸馏、语音合成优化等实战经验,助力企业实现技术到业务的转化。

weixin_29035147的博客 266

009_Java 虚拟机

在不同操作系统上安装与之对应的JDK后所虚拟出的一台计算机,该计算机上可以运行任意Java字节码文件,这也是Java实现跨平台的原因

李大能 2517

【头歌】链栈的基本操作及应用

另外,在算法的开始和结束时,栈都应该是空的,所以匹配到最后还要判断栈是否为空,若空,则说明匹配成功,返回1。其中表达式只包含三种括号,花括号{}、中括号[]、圆括号(),即它仅由 (、)、[、]、{、}六个字符组成。预期输出: 栈中元素依次为:12 47 5 8 6 92 45 63 75 38 4 29 弹出的栈顶元素 e=29 栈空否:0(1:空 0:否) 栈顶元素 e=4 栈的长度为11 清空栈后,栈空否:1(1:空 0:否)// 若栈不空,则用e返回S的栈顶元素,并返回OK;

qq_39977056的博客 4383

查看java虚拟机参数_Java虚拟机学习(8):查看JVM参数及值的命令行工具

原标题:Java虚拟机学习(8):查看JVM参数及值的命令行工具(点击上方公众号,可快速关注)来源:java2000_wl链接:blog.youkuaiyun.com/jackfrued/article/details/44499227查看JVM各个参数值方式1. HotSpot vm中的各个globals.hpp文件 查看jvm初始的默认值及参数globals.hppglobals_extension.hp...

weixin_30336529的博客 410

QGIS之七建筑面由DSM和DEM获取高度并可视化

QGIS建筑面由DSM和DEM获取高度并可视化

yilvyangguang520的博客 3511

实战!C#整合YOLO+Halcon做玻璃瓶口缺陷检测:裂纹识别+尺寸测量一步到位(附DLL交互代码)

AI擅长语义识别(裂纹、缺陷),传统机器视觉擅长精密测量(尺寸、位置),C#做整合层,才能满足工业生产的“精度+效率+稳定性”要求。这套方案不只是玻璃瓶检测能用,改改模型和测量逻辑,还能用到瓶盖缺陷检测、饮料瓶液位检测等场景。如果你们厂也有类似的质检痛点,评论区留个言,我帮你看看怎么调整算法参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 869

Dalvik虚拟机、Java虚拟机与ART虚拟机

一、Java虚拟机 1. Java的是Java字节码。 传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序。 2. Java虚拟机基于栈架构。 程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间。 二、Dalvik虚拟机(Android 4....

YSoul的博客 7338

使用mindie:2.0.RC2-800I-A2-py311-openeuler24.03-lts制作一个通用的模型推理性能测试的镜像

本文详细介绍了在NPU环境下进行模型推理性能测试的完整流程。首先配置了测试所需的环境和设备信息,包括Python 3.10.9和3.11.6版本、测试脚本和镜像文件。然后分步骤说明了镜像制作过程:创建特权容器、安装Python 3.10.9、配置VLLM环境,并详细描述了测试容器的启动方法。最后提供了镜像打包和使用指南,包括如何加载镜像、启动容器、运行测试脚本(以DeepSeek-32B模型为例)以及更换测试模型的步骤。整个过程涉及环境变量配置、权限设置和服务启动等关键操作。

m0_50105717的博客 1015

浅谈Java虚拟机(一)—什么是Java虚拟机

首先,来看下面这张图,Java技术体系所包含的内容:Oracle Java SE 8 产品组件上图来自于Oracle官网 java SE(java 平台标准版) 8 产品文档(),先别被这么多东西唬住,总体来说,Java SE包括了JDK(开发工具包)与JRE(运行环境)。开发人员要使用java开发,就需要依赖JDK,JDK中主要包含了编译与调试工具。

rita_0567的博客 900

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深度学习工具包 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虚拟机的世界 —— 为什么要弄懂虚拟机

从本周开始,专栏Effective Java将开启一个全新的专题——Java虚拟机,在这个专题的课程里,您将学到如何定位OutOfMemory异常、如何进行JVM调优之类的知识,本文作为专题的开篇,带读者走进Java虚拟机的世界。

SexyCode 6719

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

初识Java虚拟机

主要介绍了Java语言和Java虚拟机的发展历史,并介绍了Java生态环境中两份非常重要的规范—Java语言规范和Java虚拟机规范。其中Java虚拟机规范将成为本书后续讨论的重点内容。同时,作为了解Java虚拟机的第一步,简要介绍了整数和浮点数在Java虚拟机中的 表示方式。

guye 1821

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java虚拟机在所有平台上都是一样的_Java代码如何运行在Java虚拟机中

我们都知道要运行 Java 代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要把代码编译成CPU能识别的指令即可,也就是机器码.那为什么Java不直接像C++那样而需要在虚拟机中运行呢?他在虚拟机中又是如何运行的?接着往下看.Java为什么要在虚拟机中运行刚才我们谈到C++...

weixin_39604516的博客 792

dalvik虚拟机和java虚拟机的关系_Android系统Dalvik虚拟机与Java虚拟机的区别

Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点:体积小,占用内存空间小;专有的DEX可执行文件格式,体积更小,执行速度更快;常量池采用32位索引值,寻址类方法名、字段名、常量更快;基于寄存器架构,并拥有一套完整的指令系统;提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能;所有的Android程序都运行在Android系统进程里,每个进程对应着一...

weixin_35625676的博客 444

java虚拟机是什么?

一、java虚拟机定义: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 所谓的java虚拟机,就是一台虚拟的机器。它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机。visual Box、VMare就属于

qq_46416934的博客 2125

Java虚拟机的基本结构

本章主要介绍了Java虚拟机的基本结构,其中,对Java堆、Java栈和方法区做了较为完整的说明。同时,也对如何设置Jva虚拟机参数做了简要说明。

guye 2275

java虚拟机_Java虚拟机详解——简介

作者: YSOcean 原文链接:https://www.cnblogs.com/ysocean/p/7921930.html目录1、Oracle Java SE 8 产品组件2、虚拟机3、Java虚拟机4、Java虚拟机种类1、Oracle Java SE 8 产品组件通过上面给定的地址,我们可以看到如下这张图:通常来说 Java平台标准版(Java SE)包括 Java SE开发工具包(JDK...

weixin_39802519的博客 409

java虚拟机有什么作用_java虚拟机有什么用

Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之...

weixin_29247219的博客 1401

java虚拟机进程,Java虚拟机 和 java虚拟机下的进程

一、什么是Java虚拟机当你谈到Java虚拟机时,你可能是指:1、抽象的Java虚拟机规范2、一个具体的Java虚拟机实现3、一个运行的Java虚拟机实例二、Java虚拟机的生命周期一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。Java虚拟机总是开始于一个main()方法,...

weixin_32211137的博客 653

虚拟机与java虚拟机

1、虚拟机 所谓虚拟机(Virtual Machine), 就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Visual Box, VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。 无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚

weixin_43319635的博客 563

Java 虚拟机(六):Java 虚拟机总述

这是我们 Java 虚拟机系列文章的第六篇,Java 虚拟机总述。

qq_24428851的博客 1109

java虚拟机HotSpot

(3)HotSpot VM: 是Sun/OracleJDK和OpenJDK的默认虚拟机,也是目前使用最广泛的Java虚拟机,HotSpot VM一开始并不是由Sun公司开发的,而是一家名为"Longview Technologies"的小公司设计得,甚至这个虚拟机最初并不是为Java语言所设计得,他来源于Strongtalk虚拟机,Strongtalk的很多技术其实是来源于一款为了支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计得Self虚拟机;二、java语言规范:详见java语法。

w_t_y_y的博客 235
上一篇: 分布式锁专题
下一篇: 【kafka机制】kafka常见题目
StrongHelper
博客等级 码龄8年 54粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值