jvm查看full gc频率

线上问题——频繁 Full GC 问题的排查思路 启用 GC 日志分析 GC 日志内容选择合适的垃圾回收器调整垃圾回收器参数实时监控内存使用情况分析监控数据 阅读详情

背景

先说一下基本情况,本次是对线上商品服务的JVM优化。商品服务的访问量非常高,单机QPS在3000左右,线上总共部署了15个商品服务节点。JVM堆内存大小是8G,其中给新生代分配了2G,老年代垃圾回收器采用CMS,新生代垃圾回收器是ParNew。

查看java进程

]#jps
24019 user.jar
25885 Jps
26958 Main

目标进程24019

监控jvm,每5秒打印一次

]# jstat -gc 24019 5000
 S0C    S1C     S0U      S1U      EC       EU        OC         OU       MC     MU     CCSC   CCSU      YGC     YGCT   FGC    FGCT     GCT   
53248.0 55808.0 23075.3  0.0   216064.0 181168.5  288256.0   179280.1  60072.0 58559.5 7080.0 6734.8     32    1.244   6      1.914    3.158
53248.0 55808.0 23075.3  0.0   216064.0 181168.5  288256.0   179280.1  60072.0 58559.5 7080.0 6734.8     32    1.244   6      1.914    3.158
53248.0 55808.0 23075.3  0.0   216064.0 181168.5  288256.0   179280.1  60072.0 58559.5 7080.0 6734.8     32    1.244   6      1.914    3.158
53248.0 55808.0 23075.3  0.0   216064.0 181168.5  288256.0   179280.1  60072.0 58559.5 7080.0 6734.8     32    1.244   6      1.914    3.158
53248.0 55808.0 23075.3  0.0   216064.0 181168.5  288256.0   179280.1  60072.0 58559.5 7080.0 6734.8     32    1.244   6      1.914    3.158

说明

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间 

查看进程运行时间

]# ps -eo pid,tty,user,comm,lstart,etime | grep 24019
24019 ?        admin    java            Thu Dec 13 11:17:14 2018    01:29:43
进程id                   进程名          开始时间                     持续时间  

算频率

持续时间 /FGC

优化前的情况

首先我们使用 jstat 查看了 GC 的情况。又通过查看GC log,分析了GC 的详细状况。
使用 jstat -gcutil ${pid} 1000 每隔一秒打印一次 GC 统计信息。

可以看到,单次 Young GC 平均耗时是 60ms 左右,还是不错的,但是Young GC(YGC )非常频繁,基本上每秒一次,有时还会一秒两次,在一秒两次的时候,Young GC对系统响应的压力就会比较明显。

jstat相关指标说明:

YGCT:Young GC 总时间,单位为秒
YGC:Young GC 次数
FGCT:Full GC 总时间,单位为秒
FGC:Full GC 次数
GCT:GC 总时间,是 YGCT 和 FGCT 之和

接着查看 GC log,打印 GC log 需要在 JVM 启动参数里添加如下参数:

-XX:+PrintGCDateStamps:打印 GC 发生的时间戳。
-XX:+PrintTenuringDistribution:打印 GC 发生时的代龄信息。
-XX:+PrintGCApplicationStoppedTime:打印 GC 停顿时长
-XX:+PrintGCApplicationConcurrentTime:打印 GC 间隔的服务运行时长
-XX:+PrintGCDetails:打印 GC 详情,包括 GC 前/内存等。
-Xloggc:…/gclogs/gc.log.date:指定 GC log 的路径

GC log如下:

从Log中,我们可以看到 gc 前有很多次 18ms 左右的停顿。

进一步分析和优化

直接查看 GC log 不太直观,可以借助一些可视化JVM分析工具来帮助我们分析,推荐一款不错的在线分析工具GCeasy,我们把 GC log 上传到https://gceasy.io 后, GCeasy 会根据GC log生成各个维度的图表,让我们更直观的分析JVM问题。

通过查看 GCeasy 生成的图表,我们可以发现JVM的吞吐量是 93%,即 JVM 运行业务代码的时长占 JVM 总运行时长的93%,这个吞吐量确实比较低,运行 100 分钟就有 7 分钟在执行 GC 操作。幸好这些 GC 中绝大多数都是 Young GC,单次GC时长较短时间可控并且频率均匀,所以商品服务还能正常运行。

解决这个问题,可以从三方面入手:减少对象的创建,增大新生代以及调整幸存区。

减少对象创建,本质上不算是JVM调优,而是代码优化,而且需要花大量的时间去撸代码,再逐步优化代码,周期会相当长。所以就暂时作罢了!

调整新生代比例

增大新生代比例。只需要修改JVM参数即可,说起来简单,但需要多次调整并压测,最终找到一个平衡点,在保证FullGC的频次和耗时都在合理的范围之内,把Young GC的频次降到最低。
有人可能会问:增大新生代比例,会不会导致Young GC的耗时明显增大?虽然降低了GC频次,但是单次GC的耗时却明显增加了,岂不是得不偿失?
首先,我们需要先明确,目前主流的新生代收集器大多采用标记-复制算法,ParNew也一样。研究表明,绝大多数应用场景,新生代中98%的对象生命周期很短,在毫秒级别,基本上被使用一次后就会变成垃圾对象,会在下一次GC时被清理掉。在很多JVM中将堆内存分为一块较大的Eden空间和两块较小的Survivor空间(下图的S0和S1),新生对象存放在Eden区。当发生Young GC时,将Eden和当前Survivor中存活的对象一次性复制到另外一块Survivor中,最后整体清理Eden和当前的Survivor空间。每次Young GC时两块Survivor区互相更换。HotSpot虚拟机默认Eden和两块Survivor的大小比例是8:1:1,也就是说每次新生代中可用内存为整个新生代容量的90%(80%+10%),只有10%的内存会被“浪费”。

现在我们清楚了ParNew回收器采用了标记-复制算法。现在来分析一下ParNew回收器GC耗时和新生代大小的关系。我们知道标记-复制算法分为两个阶段,标记阶段和复制阶段。为了简化问题我们暂且认为标记阶段只扫描新生代的存活对象,其实该阶段还需要扫描部分老年代对象。假设我们要把新生代扩容1.5倍。

  • 扩容前:新生代容量为2G,假设某对象A的存活时间为600ms,Young GC间隔500ms,那么本次GC时间 = 扫描新生代时间 + 复制对象时间(Eden和当前Survivor复制到另一个Survivor)。
  • 扩容后:新生代容量为3G ,对象A的生命周期为600ms,但是由于新生代扩容了1.5倍,所以Young GC间隔理论上增加到了750ms。此时发生Young GC,对象A已经用完了生命周期,成为了垃圾对象,就不需要把对象A复制到另一个Survivor区了。那么本次GC时间 = 1.5 × 扫描新生代时间,没有增加复制时间。

所以,当扩大新生代容量时,实际上每次GC需要复制的存活对象并不会按照扩容比例递增。容量扩大到1.5倍,增加的存活对象会远小于1.5倍。虽然标记阶段消耗的时间提高到了1.5倍,但是复制阶段耗时并没有明显提高。更重要的是,对于虚拟机来说,复制对象的成本要远高于扫描标记的成本,所以,单次Young GC时间更多取决于存活对象的数量,而非Eden区的大小。如果堆内存中存在大量短生命周期的对象(大部分场景是这样的),那么扩容新生代后,Young GC时间不会显著增加。

分代调整

此外,观察了各代龄的对象数量情况后,对代龄设置也做了调整。

前文提到,当发生Young GC时,会将Eden和当前的Survivor中存活的对象一次性复制到另外一块Survivor中,最后整体清理Eden和当前的Survivor空间。每次Young GC时两块Survivor区会互相更换。存活对象在两块Survivor区之间每交换一次,对象年龄就会增长一岁。直到达到MaxTenuringThreshold设置的年龄(默认是15岁)时,相应的对象就会被转移到老年代。所以为了减少复制成本,MaxTenuringThreshold要尽量合理,不能设置太大,否则有些长寿对象在每次GC时都会在两个Survivor区之间来回复制,无疑是增加了复制阶段的耗时。

看上图,在15个分代中,7岁以上的对象80%都会被转移到老年代(769.02除以980.48 ≈ 80% )。于是我们把 MaxTenuringThreshold 的值调整为 7,将年龄超过7岁的对象直接转移到老年代。这样就减少了长寿对象在两个 survivor 区之间来回复制带来的性能开销。

偏向锁停顿

我们看到GC log里有很多18ms左右的停顿,虽然每次停顿时间不算长,但频繁的停顿对性能消耗还是比较明显。
这个问题曾经遇到过几次,基本都是偏向锁导致。JDK1.8 之后 JVM 对锁进行了优化,增加了偏向锁。所谓的偏向,就是偏心,偏向锁会偏向于当前已经占有锁的线程 。适合锁竞争不激烈的场景(某个同步块并发不高,很少会出现多线程同时竞争锁的场景)。大概过程如下,获得锁的线程再次获得锁时,会判断偏向锁是否指向自己,如果指向自己,该线程将不用再次获得锁,就可以直接进入同步块,以此来优化性能。当其他线程请求相同的锁时,偏向模式结束。偏向锁的实现就是将对象头的标记设置为偏向,并将线程ID写入对象头。

在竞争激烈的场景,偏向锁会增加系统负担, 因为每次都要加一次是否偏向的判断。关键是遇到锁竞争时,取消锁的过程需要等待全局安全点(safe point),会导致所有线程暂停,即会发生Stop-The-World。所以在锁竞争激烈的场景下,最好提前关闭掉偏向锁。
在JVM中默认会开启偏向锁,所以我们只需要关闭偏向锁即可:

-XX:-UseBiasedLocking

最后

经过一轮调整和压测,最终新生代调整到了2.9G,整个堆内存保持8G不变,MaxTenuringThreshold调成了7。新生代增大了将近1.5倍,Young GC 的频率减少了大概1/3。GC 的吞量提高了3.8%,达到了96.8%,。Young GC 平均耗时稍有上升,从60ms上升到了71ms,基本符合预期。另外Full GC 的频率和耗时也在可接受的范围。

调优是个复杂、细致的活儿,要因地制宜。不同的机器、不同的应用、不同的业务场景和不同的访问量级,调优的方式都不同,没有一个固定的模式。做JVM调优之前,建议先了解JVM运行原理,内存模型,GC过程,相关GC回收器回收机制,回收算法。先把基础知识打扎实,再加上耐心和决心才能够真正做好JVM优化,成为JVM高手。

参考

https://club.perfma.com/article/1846118

Full GC 排查的方式有哪些? Full GC(Full Garbage Collection) 是 Java 虚拟机(JVM)中的一种垃圾回收机制,它会清理整个堆内存(包括新生代和老年代),通常会导致应用程序暂停(Stop-The-World)。Full GC 的频繁发生会严重影响系统性能,因此需要及时排查和优化。以下是排查 Full GC 的常见方式:使用监控工具可以实时观察 JVM 的内存使用情况和 GC 行为。jstat: 关键指标: :Full GC 次数。 :Full GC 总耗时。 :GC 总耗时。 jmap: 阅读详情

相关推荐

频繁full GC排查

场景:通过prometheus去拉取通过actuator组件暴露的端点中的JVM相关指标。通过告警规则,检测线上服务出现频繁full gc。

小太阳DENGJIE的博客 2635

JVM——查看full gc频率(jstat -gc)

问题: 如何查看系统的full gc频率 思路: 使用JVM工具jstat查看 步骤: 1. 运行jps获取进程号 jps 2.目标进程9 监控JVM, 每5秒打印一次 jstat -gc 9 5000 说明: S0C 幸存区1的大小 S1C 幸存区2的大小 S0U 幸存区1的使用大小 S1U 幸存区2的使用大小 EC Eden区的大小 EU Eden区的使用大小 OC 老年代大小 OU 老年代使用

longziling的博客 5964

java-jvm-full gc频繁的分析及解决

返回博客列表 转 关于施用full gc频繁的分析及解决   DEC_LIU 发布时间: 2013/10/13 20:32 阅读: 3431 收藏: 14 点赞: 1 评论: 1 关于应用full gc频繁的分析及解决  很久前的工作日记了,移到ITeye上来。 现象 系统报警full gc次数过多,每2分钟达到了5~6次,这是不正常的现象

阿里Darker 1万+

JVM调优--经验总结

本文介绍JVM调优的一些常用经验。

IT利刃出鞘的博客 5431

ESP32天线阵列实现Wi-Fi空间成像与无直视定位

Wi-Fi信道状态信息(CSI)是OFDM系统中表征多径传播特性的基础物理层参数,其复数值包含幅度与相位,可反映无线环境的空间特征。基于CSI的射频感知技术,通过提取子载波级信道响应,结合阵列信号处理,实现到达角(AoA)估计与深度映射,本质是将通信链路重构为空间域传感器。该技术无需专用雷达硬件,具备低成本、被动式、隐私友好等工程优势,在室内定位、行为识别、仓储导航等场景具有广泛落地价值。本文聚焦ESP32平台,详解多芯片相位同步、CSI零拷贝采集、嵌入式MUSIC算法及信道图谱轻量化部署等关键实现。

weixin_30632267的博客 236

国内主流AI编程工具使用实例及总结

AI编程辅助工具是利用人工智能技术来帮助程序员进行软件开发的工具。它们可以在代码编写、代码审查、错误检测、代码优化等多个编程环节发挥作用,提高编程效率和代码质量。通义灵码,基于通义大模型的AI研发辅助工具,提供代码智能生成、研发智能问答、任务自主执行等能力,为开发者带来智能化研发体验,引领AI原生研发新范式。包含智能编码助手和AI程序员。

技术博客 1万+

查看jvm的full gc的频率

1.查看gc的次数 jstat -gc java进程ID [看FGC列,下图代表GC了7次] 【附:列说明】 S0C:第一个幸存区的大小 S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 EC:伊甸园区的大小 EU:伊甸园区的使用大小 OC:老年代大小 OU:老年代使用大小 MC:方法区大小 MU:方法区使用大小 CCSC:压缩类空间大小 ...

诚的博客 7898

Python爬虫实战:逆向解析央视频加密参数(附完整代码)

本文详细解析了央视频加密体系的技术实现,通过Python逆向工程实战演示如何解密动态密钥、AES加密和自定义哈希算法等核心组件。文章提供完整代码示例,涵盖GUID生成、参数构造和异步请求处理,帮助开发者掌握现代视频平台的反爬机制破解方法。

weixin_42532473的博客 1129

Linux查看JVM FULL GC频率

Linux查看JVM FULL GC频率

年少青山的博客 5472

DICOM三维重建:基于VTK实现三种面绘制算法

版本:VS2019、VTK9.0.1 #define vtkRenderingCore_AUTOINIT 3(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingOpenGL2) #define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL2) #include "vtkDICOMImageReader.h" #include "vtkRenderWindowInteractor.h" #i

一直在笑的博客 5922

WorkBuddy最新更新特性(2026-07-21)

WorkBuddy最新更新特性

AI人人懂 572

jstat分析JVM的使用情况和查看full gc频率

jstat 命令格式 如下所示为jstat的命令格式 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 使用jps查看java进程 也可以直接使用ps -ef | grep java查看java进程 如下表示分析进程id为25677的gc情况,每隔1000ms打印一次记录,打印10次停止,每3行后打印指标头部 jstat -gc -h3 25677 1..

Crystalqy的博客 2万+

【零基础入门unity游戏开发——unity通用篇12】导入导出unity资源包、设置编程工具、创建脚本(组件)规则、MonoBehaviour基类介绍、脚本模板(基于unity6开发介绍)

导入导出unity资源包、设置编程工具、创建脚本(组件)规则、MonoBehaviour基类介绍、脚本模板(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 760

JVM出现频繁Full GC

https://mp.weixin.qq.com/s/gt9CZNKJMX-2BfSUk682Dw

sunsiny 1734

YOLOv11【第一章:零基础入门篇·第10节】YOLOv11项目实战:从零搭建检测系统!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 5769

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【JVM调优指令详解】

文章目录一、JVM常用指令实例详解1.1、Jmap1.2、Jstack1.3、Jinfo1.4、Jstat二、JVM优化思路2.1、JVM运行情况预估—年轻代对象增长的速率2.2、JVM运行情况预估—Young GC的触发频率和每次的耗时2.3、JVM运行情况预估—每次Young GC后有多少对象存活和进入老年代2.4、JVM运行情况预估—Full GC的触发频率和每次耗时三、JVM优化示例四、小结 一、JVM常用指令实例详解 1.1、Jmap 1.2、Jstack 1.3、Jinfo 1.4、Jstat

weixin_42070243的博客 780

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

从0开始成为JVM实战高手(二)

jvm

我爱吃甘蔗的博客 1154

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

记一次不太成功的频繁 full gc 排查过程

上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下。第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一...

程序IT圈 572

full gc 监控 分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33851604的博客 649

内存很空却频繁gc_记一次不太成功的频繁full gc排查过程

上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下。第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标。虽然最终只是勉强解决了,但还是希望记录下来给下一次积攒经验。选取了上周优化前后的两个典型工作日上午9:00到晚上9:00的GC情况。优化前一天要发生高达上10次的full gc,young gc也非...

weixin_39747075的博客 275

JVM详解(七)调优工具详解

调优工具详解

denggaogui的博客 2037
上一篇: 单链表反转两种方法
下一篇: mysql约束与索引的区别
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值