JVM GC 垃圾收集简介

JVM内存结构,JAVA类的加载机制,GC算法,垃圾收集器 一、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的 Class对象, Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。 类加载器并不需要等到某个类被“首次... 阅读详情

什么是垃圾?

对于程序汇总分配的内存,当使用完成后,这部分内存就会成为垃圾,需要对其进行释放,否则,这部分内存将无法被重复利用,最终造成内存泄漏。

什么是GC?

GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。

对于java而言,是自动进行垃圾回收的。

如何发现垃圾?

既然要实现垃圾的自动回收,那么第一件事就是找到垃圾,那么如何发现垃圾呢?其实就是判断这个对象是否存活。

常见的两种方式判断:

  • 1)引用计数法(reference count)
  • 2)根可达性算法(root searching)
名称实现思想优点缺点
引用计数法给每个对象添加一个引用计数器,当存在一个引用时,就加1,当一个引用失效时,就减1。判定效率高1、无法解决相互引用、循环引用的问题。 2、存储空间开销:需要空间存储计数器。 3、时间开销:需要处理计数器的增加和减少。
根可达性算法通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。解决了循环引用的问题实现较复杂,增加了计算成本。

引用计数法(reference count)的循环引用、相互引用: 没有外部引用,但是本身的计数器又不为0。

根可达性算法 由于引用计数法存在的问题,所有主流的jvm都不使用引用计数法,而是采用根可达性算法。

如上图,带有GCRoots的对象表示正在被引用,而其他的对象虽然相互间有引用,但是没有根节点,仍然会被删除。

GCRoots对象: 哪些对象可以成为GCRoots呢?jvm中主要针对堆内的内存进行垃圾回收,而在虚拟机栈、本地方法栈和方法区内的对象则不会被回收,通常选择这三个区域的对象作为GCRoots。

在jvm中主要有以下四种,在方法区存在两种:

  • 1)虚拟机栈中引用的对象:虚拟机栈帧中的局部变量表所引用的对象。
  • 2)本地方法栈中引用的对象:JNI (Native方法)引用的对象。
  • 3)方法区中类静态和常量对象:静态变量和常量引用的对象。

以下图来展示在JVM内存模型(JMM)的GCRoots:

在根可达性算法中,所有的引用都是强引用,下面具体分析下jvm中的四种引用。

**四种引用:

名称定义特点回收
强引用强引用就是引用了通过new 的方式创建的对象。是指创建一个对象并把这个对象赋给一个引用变量;在root搜索算法的里面,说的引用都指的是强引用关系。GC时,永远不会被回收,导致OOM的主要原因1、引用消失(比如方法执行完) 2、将引用变量设置为null
软引用如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。Java中,用SoftRefrence表示弱引用。内存不足时(自动触发GC),会被回收内存不足时,触发自动回收
弱引用引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示无论内存是否充足,只要进行GC,都会被回收只要进行GC,都会被回收
虚引用虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。 要注意的是,虚引用必须和引用队列关联使用,设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。如同虚设,和没有引用没什么区别任何时候都可能被回收

垃圾如何处理?

我们通过上面学到的根可达性算法可以发现垃圾的所在,那么jvm是如何进行垃圾回收的呢?通过jvm提供的垃圾收集器(GC) 。

目前有以下种类的垃圾收集器,其中虚线表示垃圾收集器可以进行组合使用:

常见的垃圾收集算法

标记清除(mark sweep) :位置不连续 产生碎片 效率偏低(两遍扫描) 拷贝算法 (copying) :没有碎片,浪费空间 标记压缩(mark compact) :没有碎片,效率偏低(两遍扫描,指针需要调整)

标记清除(mark sweep)

顾名思义,标记清除算法分为两个阶段标记(mark) 和清除(sweep) 。

标记: Collector从引用根结点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象。

清除: Collector对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收。

对所有能找到根节点引用的内存空间进行标记,清除没有找到根节点的内存空间,其大概实现过程如下:

缺点 :

  • 1)STW(stop the word),回收时,应用挂起。
  • 2)内存越大,效率越多,需要扫描的时间越长。
  • 3)内存碎片化,会导致无法装下新申请的对象,整体内存是足够的,但并非连续的。

拷贝算法 (copying)

拷贝算法将内存空间划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的。

当活动区间的内存占满时,接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。

其大概过程如下图所示:

缺点 浪费内存,并且存活对象越多的情况下,效率越低。

标记压缩/标记整理(mark compact)

标记过程仍然和标记-清除一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理端边界以外的内存。

实现过程大概如下:

缺点 效率不高,除了要标记存活对象,还要整理存活对象的引用地址,效率低于复制算法。

总结 以上三种算法都是根据根可达性算法实现的。当开始GC时,三种算法都会造成STW(stop the world)。

JVM的内存模型如何实现垃圾回收?分代模型

文章前面介绍了简单很多种垃圾收集器,不同的垃圾收集器有不同的分代模型:

  • 1)除Epsilon、ZGC、Shenandoah之外的GC都是使用逻辑分代模型
  • 2)G1是逻辑分代,物理不分代
  • 3)除1)2)之外不仅逻辑分代,而且物理分代

分代模型

上图中的分代模型有些需要特别关注的点:

1)整个分代模型的组成:新生代 + 老年代 + 永久代(jdk1.7)/元空间(jdk1.8) 永久代、元空间:Class 永久代:必须指定大小限制 元空间:可以设置大小,也可以不设置,无上限(受限于物理内存) 字符串常量池: jdk1.7 - 永久代,jdk1.8 - 堆 MethodArea(方法区)逻辑概念:永久代、元数据

2)新生代: Eden + 2个suvivor区 YGC回收之后,大多数的对象会被回收,活着的进入s0 再次YGC,活着的对象eden + s0 -> s1 再次YGC,活着的对象eden + s1 -> s0 年龄足够 -> 老年代 (通常15,对象头Mark Word 的age只有4bit,最大是15 、CMS 6) suvivor区装不下 -> 老年代

3)老年代 老年代满了FGC Full GC(STW)

GC Tuning 尽量减少FGC MinorGC = YGC MajorGC = FGC

JVM垃圾收集器详解 GC是Garbage Collection,即垃圾回收。新生成的对象首先存放在生成区,当生成区满了,触发Minor GC,存活下来的对象转移到Survivor0,即FromSpace,Survivor0区满后触发执行Minor GC,存活对象移动到Suvivor1区,即ToSpace,经过多次Minor GC仍然存活的对象转移到老年代。所以老年代存储的是长期活动的对象,当老年代满了会触发Major GC。 阅读详情

相关推荐

JVM垃圾收集(GC)机制解析

ava虚拟机(JVM)是一种能够执行Java字节码的虚拟机,它扮演着将Java程序转换为可执行代码的关键角色。JVM的作用不仅限于执行程序,还负责管理程序在运行时所需的内存和其他资源。其中,垃圾收集(Garbage Collection,GC)机制是JVM内存管理的核心组成部分。

fudaihb的博客 1387

根可达性算法:是什么、怎么做、为什么

1、是什么 根可达性算法是JVM中一种判断对象是否回收的算法,基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 2、怎么做 基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象

qq_39691723的博客 1976

Vivado新手避坑指南:搞懂Generate Output Products和Create HDL Wrapper到底在干啥

本文深入解析Vivado设计流程中的Generate Output Products和Create HDL Wrapper两大关键步骤,帮助新手理解其核心功能与操作要点。通过详细讲解文件生成类型、关键选项设置及常见问题解决方案,指导开发者正确使用这两个功能,避免设计流程中的常见错误,提高FPGA开发效率。

weixin_29207149的博客 308

JVM垃圾回收对象判定标准之可达性分析算法(根搜索法)

前文讲过引用计数法的最大缺点就是循环引用的问题,而为了解决这个问题,Java推出了可达性分析算法。可达性分析算法也称之为根搜索法,其原理是: 从GC Roots节点(起始点)出发向下搜索,如果没有任何引用链相连(即GC Roots到对象不可达),则证明此对象不可用。 什么是引用链? 从起始点向下搜索所走过的路径被称为引用链(Reference Chain)。 对象Object5、Objec...

weixin_39309402的博客 2263

STM32G4实战:用CubeMX+Keil五分钟搞定FreeRTOS多任务LED控制(避坑指南)

本文详细介绍了如何在STM32G4系列芯片上使用CubeMX和Keil快速配置FreeRTOS实现多任务LED控制,包括环境准备、时钟配置、任务创建及常见问题解决方案。重点解决了时钟源冲突等高频问题,并提供了优化建议和进阶应用示例,帮助开发者高效完成嵌入式开发任务。

joy55的博客 221

远程桌面报‘数据加密错误‘?可能是网卡设置惹的祸(附TCP校验关闭教程)

本文深入分析远程桌面连接中出现的'数据加密错误'问题,指出网卡设置可能是根本原因,并提供详细的TCP校验关闭教程。通过禁用网卡高级属性中的'TCP校验和IPv4'与'IPv4承载卸载'功能,可有效解决RDP协议与硬件加速的兼容性问题,适用于Windows和Linux系统。

view3的博客 276

可达性分析算法(根搜索算法GCRoots)

转自:https://www.jianshu.com/p/b79fe594eed3 根搜索算法 概念 根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 这个算法的基本思想是通过一系列称为“GC Roots...

u012501054的博客 5130

MATLAB MinGW-w64 C/C++ 编译器 手动安装配置

根据Matlab版本与MinGW版本对应关系,手动安装、配置并测试MinGW

zjh2883的博客 7340

GC学习笔记

GC基础知识什么是垃圾怎么找到垃圾垃圾回收方法 什么是垃圾 没有任何引用指向的一个或多个对象(循环引用的) 怎么找到垃圾 引用计数(refrence count )有个标志计数被引用的次数但是这种方式不能解决循环引用的情况 根可达算法(root searching) 垃圾回收方法 算法名称 概念 优点 缺点 标记-清除(Mark-sweep) 线性遍历堆内存,将标记为垃圾对象的空间直接清除 快,简单 因为位置不连续,会产生大量空间碎片,之后存放对象困难 复制(C

云鹰小憩 275

Arduino ESP32 Web服务器从microSD卡读取

Arduino ESP32 Web服务器从microSD卡读取 将网页内容放到SD卡中,当有客户端数据请求时,从SD卡读取信息进行发送,比起SPIFFS文件系统,更节约板上的硬件资源。 SD卡接线说明 ESP32----- SD D5(GPIO 5)-----CS D18(GPIO 18)-----SCK D19(GPIO 19)-----MISO D23()GPIO 23-----MOSI 文件放置 需要把文件放置到SD卡的根目录下。注意SD卡的格式FAT32格式。 实例代码 /*

perseverance51博客 1433

零基础入门生信转录组数据分析——导读

转录组数据分析(上游,下游,数据可视化)专栏的目录,可以直接通过点击各个分析点直接跳转到相关帖子,方便查找和观看

呆猪儿的博客 1万+

谈谈JVM中的6种垃圾收集算法

今天我们来细致的了解一下这个垃圾收集算法,话不多说,现在就开始吧! 1.标记清除算法(Mark-Sweep) 最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清 除阶段回收被标记的对象所占用的空间。如图 从图中我们就可以发现,该算法最大的问题是内存碎片化严重,后续可能发生大对象不能找到可 利用空间的问题。 2. 复制算法(copying) 为了解决 Mark-Sweep 算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小 的两块。每次只使用其中一块,当这一

程序员麦冬的博客(公众号同名) 431

K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

🔴 K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2万+

JVM垃圾收集 GC 简介

垃圾收集 GC (Gardage Collection)程序计数器 虚拟机栈 本地方法栈 随进程而生 随进程而灭GC在对堆进行回收钱第一件事是要确定这些对象哪些还在“存活”状态而哪些已经“死去”(不能在被引用的对象)引用计数法很多判断对象是否存活的算法是这样的 在对象中添加一个引用计数器 没当有一个地方引用时 计数器 +1 当失效时 -1 任何时刻计数器都为0 的对象是不可能在被使用的GC不是通过...

菜鸡程序员 173

Unity Hololens2开发|(三)工程发布及真机部署(3种方法)

选择项目->属性,进入项目属性页,选择调试,将HoloLens2的IP地址填写至页面,如下图。确保HoloLens2与计算机在同一网络下,并保持开启状态,点击运行,即开始生成部署.注意:该方式不支持覆盖安装,如果重复安装同一个App,需要先卸载再安装!选择Release下的ARM64,选择远程计算机,如下图。

游戏开发小Y的博客 14万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM GC日志简介和垃圾收集算法

JVM GC日志简介和垃圾收集算法

Charge8的博客 554

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JVM中的垃圾收集(GC)

​ GC,即,众所周知,Java在运行时会产生相当多的数据:譬如各种新引用,对象,类等等,而这些东西都存储在堆以及元空间之中(1.8之后),而当这些东西堆积起来,就很可能超过内存上限,然后OOM报错​ 那当然不能这样,因为Java本来的目标就是构建一个能长时运行且稳定的系统。,垃圾回收​ 垃圾回收可以说是Java中最重要的一环,没有之一:它直接决定了整个JVM的稳定性以及性能,各种对于GC收集器的研究也一直在进行,每一次GC技术的突破都是Java性能的突破​ 下面就让我们来逐渐学习GC。

qq_30004513的博客 1242

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【JVM】垃圾收集器与GC日志(一)

串行:一个GC线程运行并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

Cover_sky的博客 2281

JVM垃圾收集——垃圾收集器

垃圾收集器的发展和分类、Serial收集器、ParNew收集器、Parallel Scaveng收集器、CMS收集器、G1收集器、ZGC收集器

码说芯语的博客 2901

JVM垃圾收集之——垃圾收集算法

链接: JVM垃圾收集之——怎样判定一个对象是不是垃圾 接上篇,介绍完怎样判定一个对象是不是垃圾之后,就该瞅一瞅垃圾是怎样回收的了 首先我们要知晓,垃圾收集是建立在两个分代假说之上的:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄分配到不同的区域中存活。给出收集的几个名词,以便于大家看文章:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,也可以反过来标记存活的对象,然后回收违背标记的对象。第一步、找到内存中需要被回收的对象,并且把它们标记出来。第二步、清除掉被标记需要

想着百万年薪努力的小赵 5万+

JVM中常见的GC垃圾收集器

在 JVM 中,垃圾收集器(GC)的设计目标差异显著,主要体现在吞吐量、延迟、内存支持规模、线程模型等核心特性上。小型应用 / 嵌入式:优先 Serial GC;吞吐量优先(批处理):Parallel GC;中大型应用(平衡吞吐与延迟):G1(默认选择);超低延迟 + 大内存:ZGC 或 Shenandoah(根据 JDK 版本和生态选择)。实际使用中需结合堆大小、CPU 核心数、延迟要求进行压测调优,而非盲目选择 “高端” 收集器。

2401_85973273的博客 1304

JVM——GC策略及经典垃圾收集器

G1把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间,收集器能够对扮演不同角色的 Region采用不同的策略去处理。当对象拥有了一份新的副本时,只需要修改一处指针的值,即旧对象上转发指针的引用位置,使其指向新对象,便可将所有对该对象的访问转发到新的副本上。强引用:传统引用的定义(reference类型的数据中存储的数值代表的是另外一块内存的起始地址), GC永远不会回收被强引用的对象。

weixin_45021712的博客 2146

JVM中的GC垃圾回收

文章目录JVM中的GC垃圾回收什么是GC,为什么需要GC早期的垃圾回收行为Java自动内存管理介绍垃圾回收的相关算法标记阶段:引用计数算法引用计数算法的原理引用计数算法的优缺点标记阶段:可达性分析算法GC Roots清除阶段:标记-清除算法清除阶段:复制算法清除阶段:标记-压缩(或标记-整理,Mark-Compact)算法 JVM中的GC垃圾回收 什么是GC,为什么需要GC 什么是垃圾? 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 为什么需要GC? 如果不及时的对垃圾进行清理

xzy的博客 1713

JVM - 再聊GC垃圾收集算法及垃圾收集器

文章目录Pre分代收集理论常见的垃圾收集算法标记 Pre JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】 JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】 JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法 , 意思就是根据对象存活周期的不同将 java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。 举个例子,新生代中,大部分对象都是

小工匠 2万+

JVM 的 GC(Garbage Collection,垃圾收集)

在 JVM 中,“垃圾”指的是已经不再被任何引用链访问到的对象,也就是程序中无法再访问到的“无用对象”。判断垃圾:通过可达性分析,找出不可达对象标记存活对象:从 GC Roots 开始遍历清理内存:根据算法(复制、标记-清除、标记-整理)回收垃圾分代收集:新生代用复制算法,老年代用标记-整理选择收集器:根据应用需求选择合适的 GC(如 G1 适合大堆低延迟)监控调优:通过日志和工具分析 GC 行为,优化参数💡一句话总结。

qq_61723836的博客 954

JVM垃圾收集算法及垃圾收集器

今天来总结一下最近学习到的JVM垃圾收集算法和垃圾收集器。原来以为这部分知识,对于一个Java程序员的用处不大,可是如果你的运营Web项目,出现了性能问题,那么这部分知识可以帮助你从运维的角度来优化你的项目。       首先,先讲一下JVM的垃圾收集算法,因为这是学习垃圾收集器的前堤。各种垃圾收集器也都是基于这些算法来实现的。 JVM垃圾收集算法       JVM垃圾收集算法有四种:

hello 5527
上一篇: 面试被问:如何开发一个简单的工作流引擎
下一篇: 学习java你必须要明白的垃圾收集器
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值