【JVM】垃圾回收

JVM-垃圾回收 垃圾回收及其算法 阅读详情

6、垃圾回收机制

6.1、对象成为垃圾的判断依据

在堆空间和元空间中,GC这条守护线程会对这些空间开展垃圾回收⼯作,那么GC如何判断这些空间的对象是否是垃圾,有两种算法:

  • 引用计数法:

对象被引用,则计数器+1,如果计数器是0,那么对象将被判定为是垃圾,于是被回收。但是这种算法没有办法解决循环依赖的对象。因此JVM目前的主流⼚商Hotspot没有使⽤这种算法。

  • 可达性分析算法:GC Roots根
    • gc roots根节点: 在对象的引用中,会有这么⼏种对象的变量:来⾃于线程栈中的局部变量表中的变量、静态变量、本地⽅法栈中的变量,这些变量都被称为gc roots根节点
    • 判断依据:gc在扫描堆空间中的某个节点时,向上遍历,看看能不能遍历到gc roots根节点,如果不能,那么意味着这个对象是垃圾。

在这里插入图片描述

6.2、对象中的finalize方法

Object类中有⼀个finalize方法,也就是说任何⼀个对象都有finalize方法。这个方法是对象被回收之前的最后⼀根救命稻草

  • GC在垃圾对象回收之前,先标记垃圾对象,被标记的对象的finalize⽅法将被调用
  • 调用finalize方法如果对象被引用,那么第⼆次标记该对象,被标记的对象将移除出即将被回收的集合,继续存活
  • 调⽤finalize方法如果对象没有被引用,那么将会被回收
  • 注意,finalize方法只会被调用⼀次。

重写Object的finalize()方法即可

@Override
protected void finalize() throws Throwable {
    if(id%10==0){
        list.add(this);
        System.out.println("对象"+id+"没有被回收");
    }else{
        System.out.println("对象"+id+"被回收");
    }
}

6.3、对象的逃逸分析

在jdk1.7之前,对象的创建都是在堆空间中创建,但是会有个问题,方法中的未被外部访问的对象

public void test1() {
	User user = new User();
    user.setId(1);
	user.setName("xiaoming");
}

public User test2() {
    User user = new User();
    user.setId(1);
    user.setName("xiaoming");
    return user;
}

这种类似于test1()中的user的对象没有被外部访问,且在堆空间上频繁创建,当方法结束,需要被gc,浪费了性能。

所以在1.7之后,就会进行⼀次逃逸分析(默认开启),于是这样的对象就直接在栈上创建,随着⽅法的出栈而被销毁,不需要进行gc。

在栈上分配内存的时候:会把聚合量替换成标量,来减少栈空间的开销,也为了防止步栈上没有⾜够连续的空间直接存放对象。

  • 标量:java中的基本数据类型(不可再分)

  • 聚合量:引用数据类型。

7、垃圾回收算法

7.1、标记清除算法、复制算法、标记整理算法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.2、分代回收算法

在这里插入图片描述

  • 堆空间被分成了新生代(1/3)和老年代(2/3),新生代中被分成了eden(8/10)、survivor1(1/10)、survivor2(1/10)

  • 对象的创建在eden,如果放不下则触发minor gc

  • 对象经过⼀次minorgc 后存活的对象会被放⼊到survivor区,并且年龄+1

  • survivor区执行的复制算法,当对象年龄到达15.进⼊到老年代。

  • 如果老年代放满。就会触发Full GC

7.3、对象进入到老年代的条件

  • 大对象直接进⼊到⽼年代:大对象可以通过参数设置大小,多大的对象被认为是大对象。

-XX:PretenureSizeThreshold

  • 当对象的年龄到达15岁时将进⼊到⽼年代,这个年龄可以通过这个参数设置:

-XX:MaxTenuringThreshold

  • 根据对象动态年龄判断,如果s区中的对象总和超过了s区中的50%,那么下⼀次做复制的时候,把年龄大于等于这次最大年龄的对象都⼀次性全部放⼊到老年代。

  • 老年代空间分配担保机制 :在minor gc时,检查老年代剩余可用空间是否大于年轻代里现有的所有对象(包含垃圾)。如果大于等于,则做minor gc。如果小于,看下是否配置了担保参数的配置:-XX: -HandlePromotionFailure ,如果配置了,那么判断老年代剩余的空间是否小于历史每次minor gc 后进入老年代的对象的平均大小。如果是,则直接full gc,减少⼀次minor gc。如果不是,执行minor gc。如果没有担保机制,直接full gc。

在这里插入图片描述

8、垃圾回收器

垃圾回收机制,我们已经知道什么样的对象会成为垃圾。对象回收经历了什么——垃圾回收算法。那么谁来负责回收垃圾呢?

接下来就来讨论垃圾回收器。

8.1、Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)

单线程执行垃圾收集,收集过程中会有较长的STW(stop the world),在GC时工作线程不能工作。虽然STW较长,但简单、直接。

新生代采用复制算法,老年代采用标记-整理算法。

在这里插入图片描述

8.2、Parallel收集器(-XX:+UseParallelGC -XX:+UseParallelOldGC)

使用多线程进行GC,会充分利用cpu,但是依然会有stw,这是jdk8默认使用的新⽣代和⽼年代的垃圾收集器。充分利用CPU资源,吞吐量高。

新生代采用复制算法,老年代采⽤标记-整理算法。
在这里插入图片描述

8.3、ParNew收集器(-XX:+UseParNewGC)

工作原理和Parallel收集器⼀样,都是使用多线程进行GC,但是区别在于ParNew收集器可以和CMS收集器配合工作。主流的方案:

ParNew收集器负责收集新生代。CMS负责收集老年代。

在这里插入图片描述

8.4、CMS收集器(-XX:+UseConcMarkSweepGC)

目标:尽量减少stw的时间,提升用户的体验。真正做到gc线程和用户线程几乎同时工作。CMS采用标记-清除算法。

  • 初始标记: 暂停所有的其他线程(STW),并记录gc roots直接能引用的对象。

  • 并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程, 这个过程耗时较长但是不需要STW,可以与垃圾收集线程⼀起并发运行。这个过程中,用户线程和GC线程并发,可能会导致已经标记过的对象状态发生改变。

  • 重新标记:为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那⼀部分对象的标记记录,这个阶段的停顿时间⼀般会⽐初始标记阶段的时间稍长,远远比并发标记阶段时间短。主要用到三色标记里的算法做重新标记。

  • 并发清理:开启用户线程,同时GC线程开始对未标记的区域做清扫。这个阶段如果有新增对象会被标记为黑色不做任何处理。

  • 并发重置:重置本次GC过程中的标记数据。

在这里插入图片描述

8.5、三色标记算法

在并发标记阶段,对象的状态可能发⽣改变,GC在进行可达性分析算法分析对象时,用三色来标识对象的状态

  • 黑色:这个对象及其所有引用都已被GC Roots遍历,黑色的对象不会被回收

  • 灰色:这个对象被GC Roots遍历过但其部分的引用没有被GC Roots遍历。在重新标记时重新遍历灰⾊对象。

  • 白色:这个对象没有被GC Roots遍历过。在重新标记时该对象如果是⽩⾊的话,那么将会被回收。

8.6、垃圾收集器组合⽅案

不同的垃圾收集器可以组合使用,在使用时选择适合当前业务场景的组合。

年轻代老年代备注
SerialSerial Old简单、直接
SerialCMS
ParNewCMS推荐使用
ParNewSerial Old
ParallelParallel Old吞吐量⾼、jdk8默认使用的组合
ParallelSerial Old

本文章参考B站 千锋教育JVM全套教程(含jvm调优、jvm虚拟机、jvm面试题、jvm源码详解)系统玩转java虚拟机全程干货无废话,仅供个人学习使用,部分内容为本人自己见解,与千锋教育无关。

【JVM】总结篇之垃圾回收★ 内存溢出OOM内存泄漏(Memory Leak)严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”。内存泄露的情况:1.静态集合2.单例模式3.非静态内部类持有外部类4.各种连接,如数据库连接、网络连接和IO连接等5.变量不合理的作用域一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。 阅读详情

相关推荐

Ubuntu下NVIDIA驱动安装全攻略:从报错到完美运行nvidia-smi的完整流程

本文提供了在Ubuntu系统中安装NVIDIA驱动的完整解决方案,重点解决因驱动版本冲突、内核模块未加载或Secure Boot安全启动导致的`nvidia-smi`报错问题。通过彻底清理旧驱动、处理Secure Boot、选择兼容版本并正确安装,最终确保驱动完美运行。

weixin_29196891的博客 364

JVM中垃圾回收

JVM中的垃圾回收是通过对堆内存进行管理、清理无用对象,从而确保应用的高效运行。整个垃圾回收过程包括对象的分代存储、不同的垃圾回收算法(标记-清除、复制、标记-整理等),以及多种垃圾回收器(Serial GC、Parallel GC、CMS GC、G1 GC等)来适应不同的应用场景。优化垃圾回收是一个综合的过程,需要根据应用的特性选择合适的垃圾回收器,并通过合理的内存分配、减少对象创建与销毁、调优对象晋升策略等方法减少GC对应用性能的影响。

yymagicer的博客 2260

团队管理中最棘手的6个问题

研发团队的管理棘手问题,大多集中在。

xiaolyuh的专栏 741

JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】

????‍????博主主页:爪哇贡尘拾Miraitow ????传作时间:????2022年1月9日 晚21:44???????? ????内容介绍:最近在学习JVM所以会时不时更新有关内容 ????参考资料:黑马JVM 度娘 ????参考链接:????JVM垃圾回收机制 ⏳简言以励:列位看官,且将新火试新茶,诗酒趁年华 ????内容较多有问题希望能够不吝赐教???? ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? ????JVM垃圾回收 ♻1.1 如何判断对象可以回收♻1、 引用计数器法2、可达

qq_46489085的博客 4062

RK3588 平台imx334 驱动调试记录

rk3588调试imx334

xiaoning132的专栏 1787

如何使用Docker部署OpenClaw小龙虾(docker compose快速部署)

本文以飞牛NAS为例💻,带大家一步步完成Docker部署OpenClaw小龙虾🦞。不管你是用NAS、云服务器还是本地电脑,只要支持Docker,都可以参考这个步骤来安装部署⚡

XiaoqiangClub的博客 722

JVM垃圾回收

一、设计目标和适用场景设计目标:同时注重低停顿时间和高吞吐量,可以在不牺牲大量吞吐量的情况下实现较短的停顿时间,适用于大内存应用和对响应时间有较高要求的场景。适用场景:例如需要快速响应的交互式应用、大规模数据处理等,尤其是在堆内存较大(几个 GB 甚至更大)时表现出色。设计目标:主要是为了降低垃圾收集的停顿时间,以满足对响应时间要求较高的应用。适用场景:适合于对停顿时间比较敏感的应用,如互联网应用、Web 服务器等。

qq_62097431的博客 2135

从零玩转Vitis裸机开发:手把手教你创建、移植与实战优化

✅ Vitis裸机开发全流程✅ 中断系统配置技巧✅ 跨平台移植方法论✅ 性能优化实战经验研究FreeRTOS移植探索AMP(非对称多处理)架构学习使用Vitis Analyzer进行性能分析技术雷达:关注Xilinx最新推出的Vitis Unified IDE,其集成了更强大的调试和分析工具。立即动手实践吧!

QQ_778132974的博客 583

JVM——垃圾回收

本文详细介绍了Java垃圾回收机制的核心概念和实现方法。首先,文章解释了如何判断对象可以回收,包括引用计数法和可达性分析算法,并介绍了四种引用类型:强引用、软引用、弱引用和虚引用。接着,文章探讨了三种垃圾回收算法:标记清除、标记整理和标记复制,并分析了它们的优缺点。随后,文章介绍了分代垃圾回收机制,将堆内存划分为新生代和老年代,并详细描述了MinorGC的流程。此外,文章还介绍了六种常见的垃圾回收器,包括串行、并行和并发的垃圾回收器,并重点分析了CMS和G1垃圾回收器的工作原理和优缺点。最后,文章提供了垃圾

2301_81283571的博客 1667

数据结构之博弈树搜索(深度优先搜索)

数据结构之博弈树搜索(深度优先搜索)

LucianaiB的博客 1522

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点

将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点

qq_66386046的博客 2677

【JVM系列详解】jvm垃圾回收机制(中)——垃圾回收算法

垃圾回收是JVM中十分重要的内容,也是面试常考察的点。 本文为垃圾回收系列的中篇,将详细介绍垃圾回收算法。其中重点在于分代垃圾回收算法。

m0_51214238的博客 2228

PaddleOCR全版本完整指南:从入门到精通,全面解析安装部署与高级应用

摘要 本文详细介绍了PaddleOCR的完整安装与使用指南。首先讲解了环境准备步骤,包括Python 3.11虚拟环境创建和PaddlePaddle框架的CPU/GPU版本安装。接着介绍了PaddleOCR库的安装方式,可选功能模块(文档解析、信息抽取、翻译等)及其依赖组。通过示例代码演示了PPStructureV3文档解析功能的基本用法,并提供了安装验证方法。最后针对常见问题(Windows中文用户名报错、模型下载问题)给出解决方案。文章为从入门到精通的PaddleOCR用户提供了全面的技术指导。

算法工程师 1364

jvm垃圾回收

垃圾回收是指JVM自动释放不再被程序使用的内存对象,避免内存泄漏和溢出问题。自动管理内存分配和释放。保证程序稳定运行。提高内存使用效率。JVM垃圾回收机制通过自动化内存管理,极大地简化了开发人员的工作,同时提高了应用程序的性能和稳定性。理解垃圾回收的原理和算法,可以帮助我们优化程序内存使用并解决运行时内存问题。JVM通过引用计数法和可达性分析法判定垃圾对象。垃圾回收算法包括标记-清除、复制、标记-整理和分代收集。不同垃圾回收器适用于不同的场景,应根据应用需求选择合适的GC策略。

Flying_Fish_roe的博客 1233

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

一文看懂:JVM垃圾回收算法、CMS垃圾回收器、G1垃圾回收器

Hello,大家好,我是此林。今天我们来聊一聊 JVM 垃圾回收机制。在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。手动回收的方式相对来说回收比较及时,删除代码执行之后对象就被回收了,可以快速释放内存。缺点是对程序员要求比较高,很容易出现创建完对象之后,程序员忘记释放对象。

2401_82540083的博客 2511

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

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

JVM垃圾回收器

例如,在处理大量并发请求时,我们可以采用多线程或多进程的方式,将请求分发到不同的处理单元上,以提高系统的吞吐量和响应速度。例如,在G1回收器中,JVM会根据应用的实际运行情况,动态地调整各代的比例和垃圾回收的时机,以达到全局最优的效果。:Parallel回收器是Serial回收器的多线程版本,它利用多核CPU的优势,提高了垃圾回收的效率。JVM的垃圾回收器从最初的Serial回收器,发展到Parallel回收器、CMS回收器和G1回收器,经历了从单线程到并发与并行的转变。此外,我们还可以通过设置如。

guangzhi0633的专栏 1443

深度学习工具包 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学习《垃圾回收算法和垃圾回收器》

因此就出现了一种标记-整理算法(Mark-Compact)算法,与标记-整理算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一端,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录(主要 是处理漏标问题),这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。

GQ_666的博客 1629

JVM:垃圾回收

JVM:垃圾回收

weixin_74019079的博客 1306

jvm之垃圾回收

jvm中的垃圾回收,介绍了相关的概念,说明了几种基本的垃圾回收器的特点和机制,对G1做了简单的介绍

xing_S的博客 1843

JVM 垃圾回收算法

JVM的4种垃圾回收算法、垃圾回收机制与总结 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。 image 适用场合: 存活对象较多的情况下比较高效 适用于年老代(即旧生代) 缺点: 容易产生内存碎片,...

AI天才研究院 1万+

JVM垃圾回收详解

是指自动管理内存,对程序中不再使用的对象进行回收,以释放内存空间并防止内存泄漏。Java采用自动垃圾回收机制(Automatic Garbage Collection),由。,以便在性能和内存使用之间取得平衡。自动完成,无需程序员手动释放内存。JVM垃圾回收机制的核心在于。在进行垃圾回收之前,理解。

m0_69529796的博客 1537
上一篇: 【JVM】运行时数据区与对象的创建流程
下一篇: 【JVM】调优实战
BugMaker.Chovy
博客等级 码龄6年 118粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值