Java垃圾回收机制(GC原理)解析

Java 高级篇:JVM 垃圾回收机制 然而,在清除阶段,标记-整理算法会将存活的对象压缩到内存的一端,从而避免内存碎片化。作为开发者,我们应该充分了解垃圾回收的原理和限制,避免产生内存泄漏等问题,并在需要时进行适当的优化。在标记阶段,垃圾收集器遍历堆中的对象,将不再使用的对象进行标记。通过深入了解 JVM 的垃圾回收机制,我们可以更好地优化 Java 程序的性能,降低内存占用,提高系统稳定性。分代收集算法充分利用了对象生命周期的特点,提高了垃圾回收的效率。选择合适的垃圾收集器:根据应用场景选择合适的垃圾收集器,以达到最佳的垃圾回收性能。 阅读详情


前言

Java相比于c/c++一个最显著的特征就是引入了垃圾回收机制,使我们不用像c/c++编写时还要注意内存管理,java中JVM替我们完成了这部分工作


一、为什么要GC

对于系统而言,内存迟早都会被消耗完,因为不断的分配内存空间而不进行回溯,就好像不停的产生生活垃圾
但是除了释放垃圾对象,也需要对于内存空间进行碎片管理,没有GC就不能保证应用程序的正常化进行

二、什么时候GC

堆区分为老年代和新生代,新生代又分为Eden区、s0区和s1区(99%的对象能new到Eden区,1%大对象new到老年代),当对象去堆区申请空间时
(1)先去Eden区看有无足够空间,有分配,无mirror GC
(2)有分配,无去s区,有Eden区对象移到s区,无去old区
(3)有s移到old,Eden移到s,无full GC
(4)old区有同上,无OOM

三、判断对象是否存活的方法

1.引用计数法

  • 原理:对每一个对象保存一个整形的引用计数器属性,用于记录对象被引用的情况。

例:一个对象A只要有任何一个对象引用了A则A的引用计数器就+1,当引用失效时,引用计数器就-1.只要对象A的引用计数器的值为0,即标识对象A不可能再被使用,可进行回收

  • 优点:实现简单,垃圾对象便于识别,判断效率高

  • 缺点:
    他需要单独的字段存储计数器,这样的做法增加的存储空间的开销
    每次赋值需要额外的加减法计算,增加了时间开销
    引用计数算法最大的问题是无法处理循环引用的情况,这是一个比较致命的缺陷
    循环引用问题

2.可达性分析法

相对于引用计数算法,他有效的解决了在引用计数算法中的循环引用问题,防止内存泄漏发生

这种类型的垃圾收集也叫作追踪性垃圾收集

概念:
(1)可达性分析算法以跟对象集合为起点,按照从上至下的方式搜索被跟对象集合所链接的对象目标是否可达
(2)使用可达性分析算法后,内存中的存货对象会被跟对象集合直接或者间接连接着,搜索所走过的路径称之为引用链
(3)如果目标对象没有任何阴影链项链,则是不可达的,意味着该对象已经死亡,可以标记为垃圾对象。
在可达性分析算法中只有能够被根对象集合直接或间接连接的对象才是存活对象。

可达性分析算法

3.可作为GCRoots的对象

  • 虚拟机栈汇总的引用对象
    例:各个线程被调用的方法中使用的参数、局部变量等
  • 本地方法栈内JNI引用的对象
  • 方法区中类静态属性引用对象
    例:JAVA类的引用类型静态变量
  • 方法区中常量引用的对象
    例:字符串常量池里面的引用
  • 所有被同步所synchronize持有的对象
  • java虚拟机内部引用的对象
    例:基本数据类型对应的Class对象,一些常驻的异常对象(NullPointerException等)
  • 系统类加载器

总结:一个指针,他保存了堆里面的对象,但自己又不在堆当中,那么他就是一个Root

四、垃圾回收算法

1.标记清除法

  • 背景:
    标记清除算法是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960年提出并应用于Lisp语言

  • 执行过程:
    (1)当堆空间中有效内存空间被耗尽时,就会停止这个程序(Stop the world),然后进行两项工作,标记,清除这两部分
    (2)标记:从引用根节点上开始遍历(可达性分析算法)标记所有被引用的对象。一般是在对象Header中记录为可达对象。
    (3)清除:对堆内存从头到尾进行线性遍历,如果发现某个对象在其Header中没有标记为可达对象,则将其回收

  • 缺点:效率不高;在进行GC的时候需要停止整个应用程序,导致用户体验差;且会产生的大量的内存碎片

  • 注意:
    在这里的清除不是去干掉具体内存中的数据,而是本身分配的是一组连续的内存编码给我们使用,清除就是在回收这些空闲地址,将他们保存在空闲地址表当中,下次有心得对象需要空间时去判断是否够用

2.复制算法

  • 背景:
    为了解决标记-清除算法在垃圾收集效率方面的缺陷,M.LMinsky与1963年发表了著名论文,”使用双存储区的Lisp语言垃圾收集器“,该论文中被描述的算法被人们称之为复制算法。

  • 执行过程:
    将内存空间分为两块,每次只使用其中一块,在垃圾回收的时候,将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块,交换两个内存角色。

  • 缺点:
    1.需要两倍空间
    2.GC需要维护对象的引用关系,时间开销加大
    此种方案使用与垃圾对象较少,量级不大的情况

3.标记整理法

  • 背景:
    复制算法的高效是简历在存货对象少、垃圾对象多的前提下。这种情况在新生代中经常法神,但是在老年代,更常见的情况是大部分对象都是存货的。如果依然使用复制算法,由于存货对象多,复制成本也会非常高。因此基于老年代使用复制算法并不适用。

  • 执行过程:
    第一阶段与标记清除算法一致。
    第二阶段将所有的存货对象压缩到内存的一段,按照顺讯排放,之后清理边界外所有空间

垃圾回收算法

4.分代回收算法

  • 背景:为了满足垃圾回收的效率最优性,所以分代手机算法应运而生。
    分代手机算法基于一个事实:不同的对象生命周期是不一样的,因此,不同生命周期的对象可以采取不同的手机方式,以便于提高回收效率。一般是把JAVA堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同回收算法,相对提高效率
    在系统运行过程汇总,会产生大量对象,其中有些对象是业务信息相关,如HTTP请求的Session、线程、Socket连接等对象,这类对象跟业务挂钩,因此生命周期长,还有一部分是运行过程汇总生成的临时变量,这些对象生命周期短,比如:String,这些对象甚至只使用一次即可回收

  • 目前所有GC都采用分代收集算法进行执行
    对象的状态经过大量的调研研究划分为年青代与老年代两个类别
    (1)年轻代:区域相对小,对象生命周期短、存活率低,且产生应用频繁
    复制算法回收整理速度是最快的。复制算法效率只与当前存活对象大小有关,因此很实用与年青代的回收,而空间问题,因为存活率问题,所以单独开辟S0,S1两块空间处理清除后结果
    (2)老年代:区域较大,生命周期长、存活率高,回收不及年青代频繁
    这种情况存在大量存过对象下,复制不适用,所以一般是用清除与整理算法混合实现
    Mark阶段的开销与存活对象的数量成正比
    Sweep阶段的开销与所管理的大小成正比
    Compact阶段的开销与存活对象的数据成正比
    在这里插入图片描述

五、垃圾回收算器

垃圾回收器

  • serial:针对新生代,jdk1.3之前,单线程,复制算法,垃圾回收会stop the world(停止用户代码执行)

  • serial old:针对老年代,jdk1.3之前,标记整理

  • parNew,parallel Scavenge:新生代,多线程

  • parallel:老年代
    Serial和Parallel

  • G1:jdk1.7之后,新生代/老年代,可预测停顿(提供最优的停顿时间),空间整理(提供最大的吞吐量)
    G1

  • CMS:jdk1.7之后,老年代 使用空闲列表回收,不对老年代进行整理
    CMS

  • 垃圾回收算器底层算法:
    垃圾收集器底层算法

  • 常用GC垃圾回收器性能对比
    在这里插入图片描述


Java知识笔记(面试用)Java垃圾回收机制以及异常类型处理 安卓面试说明什么是java内存回收机制异常捕获的种类什么是异常 说明 安卓的一些基础知识、 java的一些概念。 什么是java内存回收机制 许多程序设计语言允许在运行时动态的分配内存(使用到内存块开始地址的指针等),当所分配的内存不再被需要(即:指向内存的指针超出使用范围)时,程序或运行环境最好将这些没有被使用到却申请了的内存释放,如果不释放,这些内存积累的越来越多将会造成内存泄露和溢出: 在C和C++(或其他语言)中 ,程序人员负责内存的释放,需要判断该内存应该在何时进行释放; 在java中,提供后台 阅读详情

相关推荐

Java的垃圾回收机制详解——从入门到出土,学不会接着来砍我!

每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。但是,在Java领域,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存,主要原因是,这个看似简单的算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确地工作,譬如单纯的引用计数就很难解决对象之间相互循环引用的问题。举个简单的例子:对象objA和objB都有字段instance,赋值令objA.instance=objB及。

流楚丶格念的博客 6662

【JVM】万字长文!深入详解Java垃圾回收(GC)机制

如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。

陈宝子的博客 6705

ROS中tf2_ros::Buffer.lookupTransform的正确使用姿势:从踩坑到填坑

本文深入解析了ROS中tf2_ros::Buffer.lookupTransform接口的正确使用方法,重点剖析了因tf2_ros::TransformListener生命周期管理不当导致的经典问题。文章提供了从理解Buffer与Listener共生关系、类成员设计黄金法则到参数详解与异常处理的完整避坑指南,并给出了构建健壮坐标变换工具类的实战方案,帮助开发者稳定实现机器人坐标系变换。

weixin_29253711的博客 134

一文读懂Java垃圾回收机制及算法原理万字详解

一文读懂Java垃圾回收机制及算法原理万字详解

大数据开发、JAVA开发、人工智能AI 1796

STM32 AFIO时钟开启时机与复用功能解析

在嵌入式系统开发中,GPIO复用是微控制器外设配置的核心技术之一。通过复用功能,单个物理引脚可以动态切换不同功能模式,如USART通信或普通IO。其实现原理依赖于芯片内部的时钟树架构和寄存器配置机制。AFIO(Alternate Function I/O)模块作为STM32的特色设计,专门处理引脚重映射、外部中断配置等高级功能。正确理解复用功能与AFIO时钟的关系,能显著提升嵌入式开发效率,避免资源浪费。本文以STM32为例,结合引脚重映射和USART配置等典型场景,详解AFIO时钟的实际应用规范与优化实践

weixin_42389113的博客 578

Dia 使用说明

简述 在linux上面能找到dia这个工具还是挺幸运的,因为之前画流程图总是使用ubuntu默认的word工具 在里面画图,感觉流程图使用起来麻烦,并且视觉效果真的不好看。 自从使用Dia后,感觉至少画起来流程图会变得越来越标准了。但是Dia也存在问题,就是使用的文档很少,使用中遇到为后,查起来比较费劲,但是至少问题不是很多,所以使用中遇到的几点问题我就记下来,和大家分享,加快大家的开发和文档整理能力。 我会按照遇到的问题来说,不存在使用的先后顺序。 1. Dia 去掉背景中的线条 首先去点那个大一点的蓝色

linan101的博客 4926

Java进阶--Java垃圾回收机制全面解析

提起Java的垃圾回收机制大家应该都不陌生。它不仅是面试的常客,也是Java体系中相当重要的一块知识。深入理解Java的GC机制,有助于我们在开发中提高程序的性能。本篇文章将对JVM的垃圾回收机制进行深入分析,同时还会带大家认识众多垃圾回收器的特性。 一、GC机制概述 在《温故知新–JVM运行时内存区域详解》这篇文章中我们对JVM的运行时内存区域进行了详细的分析。我们知道对象的创建是由JVM完成的,在对象创建的时候JVM会在Java堆中开辟一块空间用来存储这个对象。而当对象“死亡”的时候,同样是由JVM来处

smily的博客 4958

ICCompiler II学习笔记(一)ICC II使用全流程 overview

学习笔记同步发布在我的个人网站上,欢迎来访查看。 个人学识有限,理解可能有误,仅供参考。 文章目录一、前言二、 ICC II 简介和 GUI2.1 Blocks 和 Design Libraries2.2 Objects2.3 Application Options三、Design Setup四、APR flow五、 课程主题:如何用 ICC II来实现最好的PPA 一、前言 现在的芯片都在追求一个极致的PPA 芯片的生成可以分为以下 5大步骤: Front-end Design:前端设计,最终产生

一名FPGA芯片设计爱好者的技术博客 2万+

【什么是GC垃圾回收机制?】

GC垃圾回收机制,即Java中的Garbage Collection(GC)机制,是Java内存管理的核心部分。

uutale的博客 443

ANSYS Sherlock新手避坑:从ODB++文件导入到属性匹配的完整流程(附官方教程路径)

本文详细解析了ANSYS Sherlock从ODB++文件导入到属性匹配的完整流程,帮助新手避开常见陷阱。内容包括环境准备、官方教程使用技巧、ODB++导入关键检查点、属性验证策略及常见报错解决方案,特别强调了路径设置和材料匹配的重要性,提升仿真效率。

weixin_42519781的博客 455

在虚拟机中对阿克曼转向车进行导航及避障的仿真测试

一、    在我使用rosdep install teb_local_planner去安装teb_local_planner的时候,报错:Command ‘rosdep’ not found, but can be installed with:sudo apt install python3-rosdep2    我花大半个月好不容易建立起的一系列ROS环境,被python3-rosdep2这条万恶的语句连同ROS一起给我删了。。。悲伤来的那么猝不及防    随着ROS版本的迭代,相关资料很多都不再适用

慕羽★的博客 3806

JAVA的垃圾回收机制

任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用 的意义的时候,需要释放掉这些内容,保证内存能够提供给新的对象使用。对于对象内存的释放就是垃圾回收机制, 也叫做gc,对于java开发者来说gc是一个双刃剑 我们这里找了两张搞笑图片分别来表示c语言的垃圾回收和 java的垃圾回收。 注意:并不是说谁好谁坏,只是一个调侃图。 C语言: JAVA: c的垃圾回收是人工的,工作量大,但是可控性高。 java是自动化的,但是可控性很差,甚至有时会出现内存.

Ant_Spirit的博客 591

财务数字化——解读美的战略规划之财务组织体系建设【附全文阅读】

本文提出适用于集团企业的财务管控方案,面向财务负责人、HR及战略规划人员。方案整合四种管控模式,结合500强案例,构建"职能定位-架构设计-权责划分-人才发展"体系,涵盖财务五大模块。通过明确总部与事业部权责边界,提供组织架构等实操框架,旨在平衡财务管控与业务支持,提升效率与风控能力,满足集团财务体系规范化建设需求。

cdfunlove的博客 663

Java的GC(Garbage Collection,垃圾回收)

Java的GC(Garbage Collection,垃圾回收)机制是Java虚拟机(JVM)中的一个重要功能,用于自动管理堆内存中不再使用的对象,释放其占用的内存空间,以避免内存泄漏和溢出。

2401_83447580的博客 846

拼多多小球直径轨迹重合验证码识别

本文分析了拼多多新型验证码的实现原理与破解思路。该验证码采用Canvas绘制小球弹跳轨迹验证,主要难点在于参数还原和轨迹计算。作者通过逆向工程提取了包括弹跳段数、振幅、旋转参数等关键配置(存储在config.json),并利用Python成功模拟了验证过程。核心算法将滑块值映射为0-1区间,通过三次变换计算小球位置,最终采用斜率截距最小值比对完成验证。整个过程分为静态初始化、核心计算和动态渲染三个阶段,其中干扰元素不影响核心验证逻辑。该研究仅用于技术学习,强调严禁任何违法行为。

码王吴彦祖的博客 1329

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java gc 有钱人_小猿圈java之GC垃圾回收机制

垃圾回收机制是提高性能的重要机制,所以不管学什么语言也好,垃圾回收机制都是有的,也是很重要的,小猿圈这章详解一下java的GC垃圾回收机制,需要用的或者感兴趣的朋友们,可以跟着小编学习一下。一、GC概要JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象。J...

weixin_34835735的博客 143

深度学习工具包 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性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新。 JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world 。它会在任何一种GC算法中发生。stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行。当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成。GC...

dengwankeng6125的博客 243

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【2】JVM-垃圾回收机制算法分析

目录 知识点1:什么是垃圾回收机制 1、finalize方法作用 知识点2:新生代与老年代 知识点3:如何判断对象是否存活 1、引用计数法 2、根搜索算法 知识点4:垃圾回收机制策略 1、标记清除算法 (1)应用场景 (2)优缺点 2、复制算法 (1)概念 (2)应用场景 (3)优缺点 3、标记压缩算法 (1)概念 (2)压缩算法简单介绍 (3)优缺点 4、M...

19年的努力,并不是说说而已! 12万+

java gc 回收_Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,...

weixin_42362885的博客 260

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,

Zhang Phil 2万+

这可能是把Java 垃圾回收机制讲解的最清楚的一篇文章

本文转载自:这可能是把Java 垃圾回收机制讲解的最清楚的一篇文章 Java内存模型 1. 内存回收机制:内存回收就是释放掉在内存中已经没用的对象。 要判断怎样的对象是没用的对象。这里有2种方法: 采用标记计数的方法: 给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。 当然,这也就引发了一个问题:循环引用的对象是无法...

Java_supermanNO1的博客 431

九 9.1 ---垃圾回收概述

九 9.1 —垃圾回收概述 学习渠道:尚硅谷[宋红康] 九 9.1 ---垃圾回收概述九 9.1 ---垃圾回收概述1,学习过程2,GC概述3,经典面试题列举4,那么什么被称作“垃圾”?5,那么为什么需要GC?6,早期的垃圾回收机制7,Java的垃圾回收机制 1,学习过程 拥有了上述的基础之后,我们要做的便是行能优化 2,GC概述 垃圾收集,不是ava语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候

weixin_41628546的博客 317

常问的GC相关面试题(一)

点击上方 "JAVA开发大本营"关注,置顶或星标一起学习每天晚上10点00分,我们不见不散导读小编将每天整理10道经典,系统化的面试题,让你进行学习。每天鸡汤选一种姿...

aaa31203的博客 1163

Java虚拟机GC垃圾回收机制(简单入门)

Java网络编程(客户端服务器)(文本传输)(快速使用)(入门) 前置知识 1:计算机网络基本概念 2:输入输出流的使用 3:一些类的用法,如InetAddress或Socket 服务端 在通信中。先开启服务端监听,客户端才能启动并链接 package com.jjd.Socket; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Tcp01Server { public

qq_45347311的博客 235

JVM 垃圾回收机制(GC)总结

一、概述 说起垃圾收集(Garbage Collection),大多数人都会想起Java,这项技术从始至终伴随着Java的成长,但事实上GC的出现要早于Java,它诞生于1960年MIT的使用动态分配和垃圾回收技术的语言Lisp。经过近60年的发展,目前内存的动态分配和内存回收技术已经非常成熟了,所有的垃圾回收已经自动化,经过迭代更新,自动回收也经过反复优化,效率和性能都非常可观。 为什么要了解GC? 在你排查内存溢出、内存泄漏等问题时,以及程序性能调优、解决并发场景下垃圾回收造成的性...

yangguoqi的专栏 600

面试题练习(1)——什么是垃圾,java垃圾回收的工作原理

这个问题,老师给的文档中没有答案,只能自己找咯! 参考: Java垃圾回收机制 JVM架构和GC垃圾回收机制(JVM面试不用愁)【认识JVM与GC】 Java垃圾回收(GC)机制详解【还讲了引用状态、多种收集器】 java垃圾回收器的工作原理【还讲了会出现的内存泄露问题】 Java 垃圾回收机制原理【讲了内存溢出与内存泄露的区别】 深入理解JVM的垃圾回收机制【含一题面试题】 ...

風的博客 646
上一篇: 2.2.2新版Banner轮播图实现
下一篇: Binder机制详解(一)
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值