【ZGC性能优化终极方案】:为什么你必须立即启用Java 13的ZGC?

第一章:ZGC的革命性突破与Java 13的完美融合

ZGC(Z Garbage Collector)作为Java平台中一项颠覆性的垃圾回收技术,首次在Java 11中以实验性功能亮相,并于Java 13正式支持生产环境使用。其核心目标是实现极低暂停时间,即使在TB级堆内存场景下,也能将GC停顿控制在10毫秒以内,彻底打破传统GC对高吞吐服务响应延迟的制约。

低延迟架构的核心机制

ZGC通过着色指针(Colored Pointers)和读屏障(Load Barriers)实现并发整理与应用线程的无缝协作。它采用分代式并发标记与重定位策略,在运行时持续回收内存,避免长时间“Stop-The-World”暂停。
  • 使用着色指针编码对象状态(如标记位)
  • 借助读屏障在对象访问时触发必要处理
  • 支持多阶段并发回收,最小化STW时间

启用ZGC的实践步骤

在Java 13及以上版本中,可通过JVM参数启用ZGC:
# 启动应用并启用ZGC
java -XX:+UseZGC -Xmx16g MyApplication

# 同时启用详细GC日志便于监控
java -XX:+UseZGC -Xmx16g -Xlog:gc*:gc.log MyApplication
上述指令中,-XX:+UseZGC 激活ZGC收集器,-Xmx16g 设置最大堆为16GB,ZGC在此配置下仍能保持毫秒级停顿。

性能对比示意表

GC收集器最大暂停时间适用堆大小
G1GC100-500ms≤ 1TB
ZGC< 10ms≤ 16TB
graph TD A[应用线程运行] --> B{是否访问对象?} B -->|是| C[触发读屏障] C --> D[检查标记状态] D --> E[必要时更新指针] E --> F[继续执行]

第二章:深入理解ZGC的核心机制

2.1 ZGC的设计理念与低延迟原理

ZGC(Z Garbage Collector)是JDK 11中引入的低延迟垃圾收集器,其核心设计理念是实现极短的停顿时间,通常控制在10毫秒以内,适用于对响应时间敏感的大内存应用。
并发标记与读屏障机制
ZGC通过并发标记和读屏障(Load Barrier)实现对象访问时的指针重定向,避免STW(Stop-The-World)操作。关键在于使用了着色指针技术,将标记信息存储在指针中。

// 示例:ZGC利用元数据指针进行状态标记
final class ZHeap {
    static final int MARKED0 = 0x1; // 标记位
    static final int MARKED1 = 0x2;
    static final int REMAPPED = 0x4;
}
上述代码模拟了ZGC中指针标记位的定义逻辑,通过高位存储标记状态,实现并发处理中的无锁同步。
多阶段并发回收流程
ZGC将GC周期拆分为多个小阶段,如初始标记、并发标记、重新映射等,大部分阶段与应用线程并发执行,显著降低暂停时间。

2.2 染色指针与读屏障的技术实现

染色指针(Colored Pointer)是一种在垃圾回收中用于标记对象状态的高效机制,通过将对象引用中的少量位元用于存储标记信息,避免额外的元数据空间开销。
染色指针的内存布局
现代 JVM 利用指针的低几位(通常为2-3位)存储标记状态,因对象地址天然对齐,这些位在寻址时不会被使用。例如:

// 假设指针低2位用于标记
#define MARK_MASK    0x3
#define IS_MARKED(p) ((uintptr_t)(p) & MARK_MASK)
#define GET_POINTER(p) ((void*)((uintptr_t)(p) & ~MARK_MASK))
上述代码通过位运算提取原始指针和标记状态,实现零成本的元数据存储。
读屏障的触发逻辑
读屏障(Read Barrier)在对象字段读取时插入检查逻辑,确保跨代引用的一致性。常见于 G1 或 ZGC 中。
  • 每次从堆中读取引用时触发
  • 检查源对象是否已标记,若未标记则记录到标记队列
  • 防止漏标,保障并发标记正确性

2.3 并发处理模型与STW时间控制

在高并发系统中,Stop-The-World(STW)现象直接影响服务的响应延迟。为降低STW时间,现代运行时普遍采用并发处理模型,将原本集中执行的垃圾回收、元数据扫描等操作拆分为多个可并行执行的小任务。
并发标记与三色抽象
通过三色标记法(Black-Grey-White)实现对象可达性分析的并发化。灰色对象代表待处理,白色为不可达候选,黑色为已标记且存活。

// 三色标记示例逻辑
func markObject(obj *Object) {
    if obj.color == White {
        obj.color = Grey
        enqueue(obj) // 加入标记队列
    }
}
上述代码展示了对象从白色转为灰色的过程,确保在GC工作线程与用户线程并发执行时,通过写屏障(Write Barrier)捕获引用变更,避免漏标。
STW时间优化策略
  • 增量更新(Incremental Update):记录并发阶段中的引用变化
  • 写屏障机制:在赋值操作时插入检查逻辑,维护标记一致性
  • 多阶段回收:将STW拆分为多个短暂暂停,分散性能影响

2.4 内存布局与页面管理策略分析

现代操作系统通过分页机制将虚拟内存映射到物理内存,实现高效的内存隔离与利用。页面管理的核心在于如何组织和调度固定大小的内存页。
典型内存布局结构
用户进程的虚拟地址空间通常划分为代码段、数据段、堆、栈及共享库区域。内核空间位于高地址区,保障系统调用与设备驱动访问。
页面分配策略
  • 首次适应(First-Fit):查找第一个足够大的空闲块
  • 最佳适应(Best-Fit):选择最接近需求大小的空闲块
  • 伙伴系统(Buddy System):减少外部碎片,适用于内核内存分配
页表操作示例

// 简化页表项设置
#define PAGE_PRESENT  (1 << 0)
#define PAGE_WRITE    (1 << 1)
pte_t *pt = &page_table[VPN];
*pt = (phys_addr & ~0xFFF) | PAGE_PRESENT | PAGE_WRITE;
上述代码将虚拟页号(VPN)映射到物理地址,设置“存在”和“可写”标志位,完成基本页表条目配置。

2.5 ZGC在Java 13中的关键改进点

Java 13 对 ZGC(Z Garbage Collector)进行了重要增强,显著提升了其生产环境适用性。
支持动态调整堆大小
ZGC 在 Java 13 中首次支持动态扩展和收缩堆内存,无需停止应用程序。该特性通过以下参数控制:
  • -XX:SoftMaxHeapSize:设置堆的软上限,ZGC 尽量不超过此值;
  • -XX:InitialHeapSize 和 -XX:MaxHeapSize:定义堆初始与最大容量。
异步清理类元数据
ZGC 将类卸载(class unloading)过程完全异步化,避免在 GC 暂停期间处理元数据清理,从而降低延迟峰值。
java -XX:+UseZGC -XX:SoftMaxHeapSize=8g -Xmx16g MyApp
上述启动命令中,堆可在 8GB 软上限下运行,必要时可临时扩展至 16GB,ZGC 在后台异步完成内存回收与整理。 这些改进使 ZGC 更适用于对延迟敏感且负载波动较大的服务场景。

第三章:ZGC启用前的关键评估与准备

3.1 应用场景适配性分析与性能基线测试

典型应用场景评估
在微服务架构中,系统需支持高并发读写与低延迟响应。针对电商秒杀、实时数据同步等场景,需评估框架在极端负载下的稳定性与吞吐能力。
性能基线测试指标
通过 JMeter 模拟 5000 并发用户,记录平均响应时间、QPS 与错误率。关键指标如下:
  • 平均响应时间:≤ 200ms
  • 峰值 QPS:≥ 8000
  • 错误率:< 0.1%
基准测试代码示例

// 启动性能压测任务
func BenchmarkHTTPHandler(b *testing.B) {
    for i := 0; i < b.N; i++ {
        resp, _ := http.Get("http://localhost:8080/api/v1/data")
        io.ReadAll(resp.Body)
        resp.Body.Close()
    }
}
该基准测试函数模拟重复请求调用,b.N 由测试框架自动调整以确定最大稳定吞吐量,用于建立性能基线参考。

3.2 JVM参数调优与系统资源预估

在高并发服务部署中,JVM参数配置直接影响应用的吞吐量与响应延迟。合理的堆内存设置能有效减少GC停顿时间,提升系统稳定性。
关键JVM参数配置示例

# 设置初始与最大堆内存
-Xms4g -Xmx4g
# 使用G1垃圾回收器
-XX:+UseG1GC
# 设置GC暂停时间目标
-XX:MaxGCPauseMillis=200
# 设置年轻代大小
-Xmn2g
上述配置中,-Xms 与 -Xmx 设为相同值避免运行时堆扩展开销;UseG1GC 适用于大堆场景,兼顾吞吐与延迟;MaxGCPauseMillis 设定GC目标,适合响应敏感型服务。
系统资源预估方法
  • 单实例JVM堆内存通常不超过物理内存的70%
  • 每GB堆内存预留约200MB非堆空间(元空间、直接内存等)
  • 线程栈默认1MB,高并发场景可调至512KB以降低开销

3.3 兼容性检查与潜在风险规避

运行时环境检测
在系统启动阶段,需对操作系统版本、依赖库及运行时组件进行兼容性校验。以下为典型检测脚本片段:
# 检查glibc版本是否满足最低要求
ldd --version | head -n1
if [ $(getconf GNU_LIBC_VERSION | awk '{print $NF}' | cut -d'.' -f1) -lt 2 ]; then
  echo "glibc版本过低,存在兼容性风险"
  exit 1
fi
该脚本通过getconf获取当前GNU C库主版本号,低于2将触发警告。此类检查可有效避免因底层库不匹配导致的运行时崩溃。
依赖冲突识别
使用依赖分析工具生成组件兼容矩阵:
组件支持版本范围已知冲突项
openssl1.1.1 – 3.0libcurl < 7.65
protobuf3.12+grpc < 1.30

第四章:ZGC生产环境实战部署指南

4.1 Java 13升级与ZGC启用步骤详解

Java 13 引入了多项性能优化,其中最引人注目的是 ZGC(Z Garbage Collector)的增强支持。升级至 Java 13 是启用低延迟垃圾回收机制的关键前提。
升级步骤
  • 卸载旧版本 JDK 并从 Oracle 或 OpenJDK 官网下载 Java 13;
  • 配置环境变量:JAVA_HOME 指向新安装路径;
  • 验证版本:执行 java -version 确认输出为 13.x。
ZGC 启用配置
在启动参数中添加:
-XX:+UseZGC -Xmx10g
该配置启用 ZGC 并设置最大堆内存为 10GB。ZGC 支持大内存堆(TB 级)且停顿时间通常低于 10ms。
兼容性注意事项
ZGC 在 Linux/x64 上默认可用,Windows 和 macOS 需使用实验性标志 -XX:+AllowUserSignalHandlers。生产环境建议部署于 Linux 系统以获得完整支持。

4.2 关键JVM启动参数配置实践

合理配置JVM启动参数是保障Java应用性能与稳定性的核心环节。通过调整堆内存、垃圾回收策略和运行时行为,可显著提升系统吞吐量并降低延迟。
常用JVM参数配置示例

# 设置初始与最大堆内存
-Xms2g -Xmx2g

# 使用G1垃圾收集器
-XX:+UseG1GC

# 设置GC暂停时间目标
-XX:MaxGCPauseMillis=200

# 打印GC详细信息
-XX:+PrintGC -XX:+PrintGCDetails
上述参数中,-Xms 与 -Xmx 设为相同值避免堆动态扩容带来的性能波动;-XX:+UseG1GC 启用G1收集器以平衡大堆下的停顿时间;MaxGCPauseMillis 设置期望的GC最大暂停时间目标,辅助G1进行区域回收决策。
关键参数对照表
参数作用推荐值
-Xms初始堆大小
与-Xmx一致
-XX:MaxGCPauseMillisGC最大暂停时间目标
200ms

4.3 监控指标集成与GC日志分析方法

在Java应用性能优化中,监控指标集成与GC日志分析是定位内存瓶颈的关键手段。通过将JVM的GC日志与Prometheus等监控系统对接,可实现对堆内存、GC停顿时间等核心指标的可视化追踪。
GC日志启用配置

-XX:+PrintGCApplicationStoppedTime \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Xloggc:/var/log/gc.log
上述参数开启详细GC日志输出,记录垃圾回收的类型、耗时及触发原因,便于后续使用工具如GCViewer或GCEasy进行解析。
关键监控指标
  • Young GC频率与耗时:反映对象分配速率
  • Full GC次数:频繁发生可能暗示内存泄漏
  • 堆内存使用趋势:结合监控图表识别增长异常
通过日志与指标联动分析,可精准识别内存压力来源,指导JVM调优决策。

4.4 常见问题排查与性能验证流程

问题排查基本流程
遵循“日志先行、逐层剥离”的原则,优先查看系统日志和组件监控指标。常见异常可通过以下命令快速定位:
kubectl logs <pod-name> --namespace=<namespace> --tail=100
该命令获取指定命名空间下 Pod 的最近 100 行日志,便于分析启动失败或运行时错误。
性能验证关键指标
通过压测工具模拟真实负载,关注响应延迟、吞吐量与资源占用。建议使用如下指标对照表进行评估:
指标正常范围告警阈值
平均响应时间<200ms>500ms
CPU 使用率<70%>90%

第五章:未来展望——ZGC引领Java垃圾回收新纪元

随着Java应用在大规模分布式系统和低延迟场景中的广泛部署,ZGC(Z Garbage Collector)正逐步成为现代JVM垃圾回收技术的标杆。其核心目标是实现毫秒级甚至亚毫秒级的停顿时间,同时支持TB级堆内存管理,为高吞吐与低延迟并重的系统提供了坚实基础。
响应式系统中的ZGC实战
某金融交易系统在迁移到ZGC后,GC停顿从平均30ms降至0.5ms以内,99.9%的停顿时间控制在1ms内。关键配置如下:

java -XX:+UseZGC \
     -Xmx16g \
     -XX:+UnlockExperimentalVMOptions \
     -XX:ZCollectionInterval=30 \
     -jar trading-service.jar
该配置启用ZGC,设置最大堆为16GB,并每30秒尝试一次垃圾收集,有效平衡了资源占用与响应速度。
与G1的性能对比
在相同负载下,ZGC与G1的性能表现差异显著:
指标ZGCG1
平均停顿时间0.8 ms25 ms
最大停顿时间1.2 ms200 ms
吞吐损失~5%~10%
容器化环境下的调优策略
在Kubernetes中运行ZGC应用时,需注意内存限制与JVM堆的匹配。建议使用以下启动参数自动感知容器内存:
  • -XX:+UseContainerSupport:启用容器内存识别
  • -XX:MaxRAMPercentage=75.0:限制JVM使用容器内存的75%
  • -XX:+ZUncommit:释放未用堆内存,降低容器OOM风险
流程图:ZGC并发标记-转移周期
对象标记 → 并发扫描 → 转移集选择 → 并发转移 → 引用更新 → 内存回收
JDK13 Java13 完整开发工具包安装包 Windows 64位实战 JDK13(Java Development Kit 13)是Oracle于2019年9月发布的Java开发工具包版本,作为非长期支持版本(Non-LTS),它引入了多项语言增强与性能优化,标志着Java语言持续快速演进的趋势。本章将从JDK13的基本概念入手,逐步引导读者完成其在Windows 64位系统下的安装与配置流程,为后续学习奠定坚实基础。 阅读详情

相关推荐

Java 13开发工具包JDK 13.0.1 for MacOSX 64位系统

本文还有配套的精品资源,点击获取 简介:JDK 13.0.1是Oracle提供的Java开发工具集最新版本,包括了Java编译器、JVM、类库和开发工具。本版本引入了开关表达式、文本块、直接缓冲区支持和性能改进等特性,以提高开发效率和语言功能。JDK与OpenJDK兼容,不过Oracle JDK可能包含额外的优化和安全更新。此文件适用于MacOSX 64位系统,但在基于AR...

weixin_35754962的博客 1441

ZGC到底怎么用?3个步骤带你成功启用Java 13超低延迟GC

掌握Java 13 ZGC垃圾收集器启用方法,轻松实现超低延迟GC。适用于高并发、低停顿场景,通过JVM参数配置、应用验证与性能调优三步完成。显著降低GC停顿时间,提升系统响应速度,值得收藏。

VarChat的博客 322

YOLOv8+ByteTrack实战:5分钟搞定多目标跟踪(附鱼群检测调参秘籍)

本文详细介绍了如何利用YOLOv8和ByteTrack快速实现多目标跟踪,特别针对鱼群检测等复杂场景提供参数调优秘籍。通过环境配置、核心机制解析和专项调优技巧,开发者可在5分钟内搭建高效跟踪系统,适用于水产养殖、交通监控等实际应用。文章还包含工程落地方案和性能优化建议,帮助实现精准的鱼群计数与行为分析。

e1f2g的博客 1019

ZGC性能优化的秘密武器(Java 13启动参数深度揭秘)

掌握Java 13 ZGC的启动参数,轻松实现低延迟高吞吐。适用于大内存、低停顿场景,通过-XX:+UseZGC等关键参数优化性能,显著提升应用响应速度。配置简单,效果显著,值得收藏。

CompiTide的博客 585

别再手动配IP了!保姆级教程:用Cisco Packet Tracer搞定DHCP服务器配置(附实验抓包分析)

本文提供了一份详细的Cisco Packet Tracer DHCP服务器配置教程,帮助用户告别手动分配IP的繁琐过程。通过构建多子网实验环境,逐步指导DHCP地址池设置、客户端测试及协议分析,并分享常见问题排查技巧,让网络配置更高效、更智能。

weixin_42535461的博客 339

Orin 调试GMSL camera 96712手册重点

96712基础理解

乐于分享 9195

Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java13 的新特性

你好,我是看山。 本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。 从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。 因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。 概述 本文讲解一下 Ja.

沉潜飞动 2878

QT实现OPCUA服务端客户端(附完整源码)

QT实现OPCUA服务端客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1821

Java基础之JDK13新特性理解与使用

JDK13新特性理解与使用 350: Dynamic CDS Archives 351: ZGC: Uncommit Unused Memory 353: Reimplement the Legacy Socket API 354: Switch Expressions (Preview) 355: Text Blocks (Preview) 官方网站: http://openjdk.java...

瘦子没有夏天 1249

RK3588 MPP,RGA,DRM,QT之RGA

RK3588多路视频采用RGA来进行混合成一帧

dreamliweiming的博客 4265

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 3788

终极Minecraft性能优化:Java标志与基准测试实践

Minecraft-Performance-Flags-Benchmarks项目提供了经过基准测试的Java标志和优化调整,帮助玩家减少游戏卡顿、提升流畅度。本文将详细介绍如何通过Java参数优化、垃圾回收配置、性能工具使用等方法,为Minecraft打造更流畅的游戏体验。 ## 为什么需要Java优化? Minecraft作为一款Java编写的沙盒游戏,其性能表现很大程度上依赖Java虚拟机

gitblog_00987的博客 619

SAP 实例解析分期付款配置及应用

SAP系统的付款条件支持分期付款功能,其奥妙之处就在于需要定义一个母条款和一个子条款,其中,母条款需要标识“分期付款”。 首先,定义分期付款的母条款OBB8:             然后,定义子条款(即分期付款的具体方式)OBB9:   由上图可以看出,分期付款的配置还是很强大的,针对每次付款,都可以进行第二层次付款条件的设置。   然后,我们做一笔发票,

heng0757的专栏 1万+

java13 新特性

JDK13今日发布,带来5大新特性 JDK JDK作为JAVA的核心,发展至今,已经更新到13版本了。 早在2017年8月,JCP执行委员会就已经提出将JAVA的发布频率修改调整为每六个月一次,新的发布周期将严格遵循这个时间点,每年的3月份和9月份将会发布新的JDK。 今日,JDK13正式发布,在官网上,我们可以看到JDK13的进展情况。 JDK13 可以看到,今日JDK13已...

oldshaui的博客 763

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

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

efm32 入门.pdf

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

Java 13 新特性及具体应用

Java 13主要特性摘要:1.文本块简化多行字符串处理,支持JSON/HTML等结构化文本;2.Switch表达式优化多分支逻辑,支持箭头语法和yield返回值;3.动态CDS归档加速JVM启动;4.ZGC改进自动释放闲置内存;5.Socket API底层重构。这些更新提升了代码可读性和系统性能,其中文本块和Switch表达式需启用预览功能。

weixin_56693899的博客 667

深度学习工具包 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的同学看过来,JDK13即将发布,新特性会是什么?

由于Java现在采取“半年发布一次新版本”的模式,所以Java 12的下一个版本Java 13/JDK 13预计将于9月发布。 为了更快地迭代,以及跟进社区反馈,Java的版本发布周期变更为每六个月一次 —— 每半年发布一个大版本,每个季度发布一个中间特性版本,并且承诺不会跳票。通过这样的方式,开发团队可以把一些关键特性尽早合并到JDK之中,以快速得到开发者反馈。 使用Java 12的童鞋可以升...

xiaoxijing的博客 324

JDK13五大特性

JDK13特性 JDK13于9月17日正式发布。目前该版本包含的特性已经全部固定,主要包含以下五个: 下面来逐一介绍下这五个重要的特性。 Dynamic CDS Archives 这一特性是在JEP310:Application Class-Data Sharing基础上扩展而来的,Dynamic CDS Archives中的CDS指的就是Class-Data Sharing。 那么,这个JEP...

Goldthreefat的博客 4845

Java 13 新特性—概述

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!Java 13 于 9 月 17 日正式发布。

smart_an的专栏 900

从卡顿到丝滑:ZGC在实时交易系统中的实战调优指南

本文深入探讨了ZGC垃圾收集器在实时交易系统中的实战调优策略,通过指针着色、NUMA-aware内存分配等核心技术实现毫秒级停顿。文章详细解析了参数配置、线程模型优化及生产环境诊断方法,帮助开发者提升系统性能,适用于金融证券等高延迟敏感场景。

cc789的博客 733

未使用的分配java,JDK/Java 13:ZGC未使用堆内存归还操作系统

翻译自:JEP 351地址:https://openjdk.java.net/jeps/351一、摘要增强ZGC,将未使用的堆内存返回给操作系统。二、动机目前ZGC不会将未使用的内存归还给操作系统,即使该内存已经很长时间没有使用了。这种行为并不适合所有类型的应用程序和环境,特别是那些需要考虑内存占用的应用程序和环境。例如:按资源使用付费的容器环境。应用程序可能长时间处于空闲状态并与许多其他应用程序...

weixin_35035699的博客 295

java 新特性_Java 13 新特性概述

Java 13 新特性概述Java 13 已如期于 2019年9 月 17 日正式发布,此次更新是继半年前 Java 12 这大版本发布之后的一次常规版本更新,在这一版中,主要带来了 ZGC 增强、更新 Socket 实现、Switch表达式更新等方面的改动、增强。本文主要针对 Java 13 中主要的新特性展开介绍,带你快速了解 Java 13 带来的不同体验。动态应用程序类-数据共享在 Ja...

weixin_32487565的博客 308

jdk 14 基础架构部的zgc垃圾收集实测

“基础架构部的zgc垃圾收集实测”,jdk 11开始的zgc有多强,文章说太多了。同事用ES7.7 + jdk 14测试了下实际效果。 结果是,关注和调优的重心,都聚焦在万一垃圾回收的速度跟不上分配的速度,发生的allocation stall停顿上,有点像以前操心cms,full gc的stw。 allocation stall不能说是stop the world,它可能是按region 按线程去停的,实际每条线程停顿的时间不一,有的停几毫秒,有的停几百毫秒。 jmx暴露的监控指标只有zgc count和

ice-wee的专栏 1338

Java 13最新最全新特性解读

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第229篇原创分享作者 l Hollis来源 l Hollis(ID:hollischuang)...

weixin_44742132的博客 126

Java 13 明天发布,最新最全新特性解读

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第229篇原创分享作者 l Hollis来源 l Hollis(ID:hollischuang)...

weixin_43167418的博客 176

Java1.0-13各版本特性

不知道你有没有想过这些问题: 为什么 JDK1.4 与 JDK 5.0 的命名规则不一样?JDK 8 增加了哪些新特性?现在最新的 Java 版本是多少? 一直都是写业务代码,都没研究过 Java 的曾经与现在。为了提高下自己的职业素养,查了资料: JDK 1995 年 发布了 Beta 版,1996 年 1 月 发布了 1.0 版本,直到 2019 年 9 月发布了 JDK 13,J...

ConstXiong 690
上一篇: 代码简洁50%的秘密,Java 10 var类型推断你不可不知的5大技巧
下一篇: 【高阶JPA实战指南】:在@OneToMany关系中安全实现级联删除的6个步骤
QuickProceed
博客等级 码龄1年 149粉丝 2008原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值