JVM篇-堆空间(Heap)

2023-11-16

堆的核心概述

  1. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域
  2. Java堆区在JVM启动的时候既被创建,其空间到校也就确定了,是JVM管理的最大一块内存空间(堆内存可以调节
  3. 《Java虚拟机规范》规范,对可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的
  4. 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB
  5. (几乎)所有的对象实例以及数组都应当在运行时分配在堆上。
  6. 数组和对象可能永远刽存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置。
  7. 在方法结束后,堆中的对象不会马上被已出货,仅仅在垃圾收集的时候才会被溢出
  8. 堆,是GC(Garbage Collection ==>垃圾收集器) 执行垃圾回收的重点区域。(仅有方法区与堆中有GC)
    在这里插入图片描述

内存细分

Java 7以及之前堆内存逻辑上是分为三部分:新生区+养老区+永久区
在这里插入图片描述

Java 8以及之后的堆内存逻辑上分为:新生区+养老区+元空间

设置堆内存的大小与OOM

堆空间的大小设置

	-Xms //用于表示堆空间的起始内存(泛指年轻代与老年代),等价 -XX:InitialHeapSize
	-Xmx //用于表示堆区的最大内存 -XX:MaxHeapSize
----------------------------------------------
/**
 * 1. 设置堆空间大小的参数
 * -Xms 用来设置堆空间(年轻代+老年代)的初始内存大小
 *      -X 是jvm的运行参数
 *      ms 是memory start
 * -Xmx 用来设置堆空间(年轻代+老年代)的最大内存大小
 *
 * 2. 默认堆空间的大小
 *    初始内存大小:物理电脑内存大小 / 64
 *             最大内存大小:物理电脑内存大小 / 4
 * 3. 手动设置:-Xms600m -Xmx600m
 *     开发中建议将初始堆内存和最大的堆内存设置成相同的值。
 *
 * 4. 查看设置的参数:方式一: jps   /  jstat -gc 进程id
 *                  方式二:-XX:+PrintGCDetails

在这里插入图片描述
查看堆内存占用情况

OOM异常


import java.util.ArrayList;
import java.util.Random;

/**
 * -Xms600m -Xmx600m
 * @author shkstart  shkstart@126.com
 * @create 2020  21:12
 */
public class OOMTest {
    public static void main(String[] args) {
        ArrayList<Picture> list = new ArrayList<>();
        while(true){
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(new Picture(new Random().nextInt(1024 * 1024)));
        }
    }
}

class Picture{
    private byte[] pixels;

    public Picture(int length) {
        this.pixels = new byte[length];
    }
}

在这里插入图片描述

年轻代老年代

JVM中的Java对象可以划分两类(从生命周期划分)

  1. 一类是生命周期较对的瞬时对象,这类对象的创建和小王都是迅速的
  2. 另一类对象的生命周期非常长,在某些极端的情况下还能够JVM的生命周期一致

Java堆区进一步花费可分为
年轻代(YoungGen)
年轻代可以划分为
Eden(伊甸园)空间
Survivor 0空间(From区)
Survivor 1空间(To区)
老年代(OldGen)

在这里插入图片描述

关于这个新生代参数的设置

 -Xms600m -Xmx600m

 -XX:NewRatio : 设置新生代与老年代的比例。默认值是2.
 -XX:SurvivorRatio :设置新生代中Eden区与Survivor区的比例。默认值是8
 -XX:-UseAdaptiveSizePolicy :关闭自适应的内存分配策略  (暂时用不到)
 -Xmn:设置新生代的空间的大小。 (一般不设置)

对象分配过程

1. new 的对象先放在伊甸园区(Eden)这个区域有大小限制===>因此只有这里有OOM异常
2. 当一点远去的空间填满时,触发Minor GC,进行垃圾回收
3. 将伊甸园中剩余对象移动到幸存者0区
4. 在此触发垃圾回收,此时幸存者0区的对象还是或者那么就会方法幸存者1区
5. 如果在此精力垃圾回收,此时会重新放回幸存者0区,接着再去1区
6. 什么时候进入养老区呢?可以设置次数,默认阈值是15(既age=15,在0区1区反复横跳15次之后)
	也可用过参数设阈值 -XX:MaxTenurigThreshold=<N>

总结

针对这个幸存者s0,s1的总结:

复制之后有交换,谁空谁是to区

关于垃圾回收

频繁的在新生区收集,很少在养老区收集,几乎不去永久区/元空间收集

对象分配的特殊情况

在这里插入图片描述

Minor GC Major GC Full GC

JVM进行GC时,并不是针对上面三个内存区域(新生代,老年代,方法区)一起回收的

HotSpot VM GC按照回收区域又分为两大类型

部分收集(Partial GC)

新年代收集(Minor GC/Young GC):只是新生代的垃圾回收
老年代收集(Major GC/Old GC):只是老年代的垃圾收集

	 目前只有CMS GC会有单独收集老年代的行为
	 注意:Major GC只是老年代的垃圾收集,不能Full GC混淆使用.需要具体分辨是老年代回收还是值整堆回收

混合收集(Mixed GC) :收集整个新生代以及部分老年代的垃圾收集

	目前,只有G1 GC会有这种行为

整堆收集(Full GC)

	收集整个java堆和方法区的垃圾收集

垃圾回收GC触发机制

年轻代GC(Minor GC)触发机制

当年轻代内存不足时,就会触发Minor GC 这里年轻代是指Eden(伊甸园)代满了 , Survivor满了不会触发GC
Java大多对象具有
朝生夕死
的特性,因此Minor GC是频繁的,一般回收速度也比较快
Minor GC会触发STW,暂停其他用户的线程,等垃圾回收结束,用户线程才能恢复运行

在这里插入图片描述

老年代GC(Major GC/Full GC)触发机制

1. 值发生在老年代的GC,对象从老年代小时,便可以说Major GC 或者 Full GC触发了
2. 出现了Major GC 经常会伴随至少一次的Minor GC(不绝对,在Parallel Scavenge 收集器的收集策略就有直接进行Major GC 的策略选择过程)
3.  Major GC的速度一般会比Minor GC 慢10倍以上,因此STW时间更长
4. 如果Major GC后,内存还不足就会报OOM异常

Full GC触发机制(五种情况)

  1. 调用System.gc()时,系统建议执行Full GC 不必然你执行
  2. 老年代空间不足
  3. 方法区空间不足
  4. Minor GC后进入老年代的平均大小>老年代的可用内存
  5. Eden区,survivor space 0 (From Space)区向survivor space 1(To Space)区赋值时 对象大小大于To Space可用内存,就会吧这个对象转存到老年代,且老年代的可用内存小于该对象的大小

要避免full gc 是开发调优中要避免的 这样STW时间会短一点

堆空间的分代思想

为什么需要把Java堆分代?不分代就不能正常工作了吗?

因为Java的对象70%-99%都是朝生夕死的 分代可以优化GC的一个性能问题

内存分配策略(对象提升规则(Promotion))

针对不同年龄段的对象分配原则如下

  1. 优先分配到Eden
  2. 对象直接分配到老年代(尽量避免程序中过多大对象)
  3. 长期存活的对象分配到老年代
  4. 动态对象年龄判断
    若S区所有对象的大小的总和大于S区空间的一半 其年龄>=该年龄对象可就直接进入老年代,不需要等到阈值(默认15)
  5. 空间分配担保
    -XX:HandlePromottionFailure

为对象分配内存 TLAB

为什么有TLAB?

  1. 堆空间是线程共享区域 任何线程都可以访问到堆区的共享数据
  2. 由于对象实例的创建在JVM中非常平凡,因此开发坏境下从堆区中花费内存空间是线程不安全的
  3. 为了便面多个线程操作同一个地址,需要采用加锁的策略,进而影响分配速度
    什么是TLAB?
    在这里插入图片描述
  4. 从内存模型的角度看,JVM为每个线程分配了一个私有缓存区域,包含Eden空间内
  5. 多线程同事分配内存是,使用TLAB可以避免一些列的非下层安全问题,同事还能提升内存分配的吞吐量,因此我们将这种内存分配方式成为快速分配策略
    6.所有 Open JDK 衍生的JVM都提供了TLAB
  6. JVM将TLAB作为内存分配的首选
  7. -XX:UserTLAB 设置开启TLAB空间
  8. 默认TLAB的内存很小,仅有Eden空间的1%
  9. JVM分配内存失败,JVM会尝试通过加锁进制确保数据操作的原子性
    在这里插入图片描述

小结堆空间的参数设置


/**
 * 测试堆空间常用的jvm参数:
 * -XX:+PrintFlagsInitial : 查看所有的参数的默认初始值
 * -XX:+PrintFlagsFinal  :查看所有的参数的最终值(可能会存在修改,不再是初始值)
 *      具体查看某个参数的指令: jps:查看当前运行中的进程
 *                             jinfo -flag SurvivorRatio 进程id
 *
 * -Xms:初始堆空间内存 (默认为物理内存的1/64)
 * -Xmx:最大堆空间内存(默认为物理内存的1/4)
 * -Xmn:设置新生代的大小。(初始值及最大值)
 * -XX:NewRatio:配置新生代与老年代在堆结构的占比
 * -XX:SurvivorRatio:设置新生代中Eden和S0/S1空间的比例
 * -XX:MaxTenuringThreshold:设置新生代垃圾的最大年龄
 * -XX:+PrintGCDetails:输出详细的GC处理日志
 * 打印gc简要信息:① -XX:+PrintGC   ② -verbose:gc
 * -XX:HandlePromotionFailure:是否设置空间分配担保
 *
 */
public class HeapArgsTest {
    public static void main(String[] args) {

    }
}

堆是分配对象的唯一选择吗?

随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配标量替换优化技术会导致一些微妙的变化,所有对象都分配到对上也逐渐不那么绝对了

如果经过====>逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出去方法的话,那么就可能被优化成栈上分配

逃逸分析概述

  • 想要把堆上的对象分配到栈,需要使用逃逸分析手段
  • 这是一种可以有效的减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法
  • 同过逃逸分析,Java HotSpot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要讲这个对象分配到堆上.
  • 逃逸分析的基本行为就是分析对象动态的作用域
  1.  当一个对象在方法中被定义后,**对象只在方法内部使用,**则**认为没有发生逃逸** 
    
  2. 当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸,例如作为调用参数传递到其他方法中
/**
 * 逃逸分析
 *
 *  如何快速的判断是否发生了逃逸分析,大家就看new的对象实体是否有可能在方法外被调用。
 * @author shkstart
 * @create 2020 下午 4:00
 */
public class EscapeAnalysis {

    public EscapeAnalysis obj;

    /*
    方法返回EscapeAnalysis对象,发生逃逸
     */
    public EscapeAnalysis getInstance(){
        return obj == null? new EscapeAnalysis() : obj;
    }
    /*
    为成员属性赋值,发生逃逸
     */
    public void setObj(){
        this.obj = new EscapeAnalysis();
    }
    //思考:如果当前的obj引用声明为static的?仍然会发生逃逸。

    /*
    对象的作用域仅在当前方法中有效,没有发生逃逸
     */
    public void useEscapeAnalysis(){
        EscapeAnalysis e = new EscapeAnalysis();
    }
    /*
    引用成员变量的值,发生逃逸
     */
    public void useEscapeAnalysis1(){
        EscapeAnalysis e = getInstance();
        //getInstance().xxx()同样会发生逃逸
    }
}

结论

开发中能使用局部变量的,就不要使用方法外定义

基于逃逸分析之代码优化策略

1. 栈上分配策略

  • JIT编译器在编译期间根据逃逸分析的结果,发现:
  • 若一个对象没有逃逸出方法的话就可能被优化成栈上分配.
  • 分配完成就继续在调用栈内执行,最后线程结束,栈空间呗回收,局部变量对象也被回收,这样就不需要进行垃圾回收了
常见栈上分配的场景
  1. 成员变量赋值
  2. 方法返回值
  3. 实例引用传递
package com.atguigu.java2;

/**
 * 栈上分配测试
 * -Xmx1G -Xms1G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails
 */
public class StackAllocation {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();

        for (int i = 0; i < 10000000; i++) {
            alloc();
        }
        // 查看执行时间
        long end = System.currentTimeMillis();
        System.out.println("花费的时间为: " + (end - start) + " ms");
        // 为了方便查看堆内存中对象个数,线程sleep
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    }

    private static void alloc() {
        User user = new User();//未发生逃逸
    }

    static class User {

    }
}

大家可以看到这个是开启逃逸分析的效果(JDK7(确切来说JDK6_23)以后是默认开启逃逸分析)
执行时间是5毫秒
在这里插入图片描述
那我们来看看不开启逃逸分析的结果

在这里插入图片描述

执行时间是113毫秒 可见优化以后的性能是大有提升的
在这里插入图片描述

同步省略(锁消除)

	 如果一个对象被发现只能从一个线程被访问到 那么对于这个对象的操作者可以不考虑同步
  • 线程同步代价是相当高的,同步的后果是降低并发性和性能
  • JIT可以借助逃逸分析来判断同步快锁使用的锁对象是否能够被一个线程锁访问而没有被发布到其他线程

标量替换(分离对象)

====>有的对象可能不需要作为一个连续的内存结构存在也可以被访问到 
====>那么对象的部分(或者全部)可以不存在内存 而是存在CPU的寄存器里
标量(Scalar)
===>无法在分解成更小的数据的数据
如Java中的原始数据类型就是标量
聚合量(Aggregate)
可以分解的数据叫聚合量
如Java对象

JIT阶段如果经过逃逸分析,发现一个对象不会被外界访问的话 那么经过JIT优化就会把这个对象拆解成若干个其中包含多个成员变量来代替换 这个过程就好标量替换



/**
 * 标量替换测试
 *  -Xmx100m -Xms100m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-EliminateAllocations
 */
public class ScalarReplace {
    public static class User {
        public int id;
        public String name;
    }

    public static void alloc() {
        User u = new User();//未发生逃逸
        u.id = 5;
        u.name = "www.atguigu.com";
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            alloc();
        }
        long end = System.currentTimeMillis();
        System.out.println("花费的时间为: " + (end - start) + " ms");
    }
}

/*
class Customer{
    String name;
    int id;
    Account acct;

}

class Account{
    double balance;
}


 */



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM篇-堆空间(Heap) 的相关文章

  • PLC程序的基本组成和编程语言

    一般情况 PLC程序由主程序 多个子程序 多个中断服务程序等三部分组成 这三部分被组织在一起 经过编译可以下载到PLC中运行 如下图就是一个简单的例子 MAIN是主程序 SBR0是子程序 可以被MAIN调用 运行在一个循环中 中断服务程序独
  • 如何解决Visual Studio2019登录微软账户登录不上的问题

    试用期30天过了 这个问题困扰了我好几天 几乎把网络上所有的问题都搜索遍了 下面总结了网上常用的解决方案还有登录方式 登陆不上微软账户排除自己密码账户没有输入正确以外 是网络的问题 我没有用WiFi 用的是手机的热点连接的 方法1 如果挂V
  • IDEA技巧-快速编写一个String类型的JSON对象

    1 先编写一个String类型空值对象 String strJson 2 将光标放在 中间 3 Alt Enter调出Inject language or reference视图界面 回车选中Inject language or refer
  • 数据在OSI七层模型中的名字 数据帧、数据包、数据报以及数据段

    数据帧 数据包 数据报以及数据段 OSI参考模型的各层传输的数据和控制信息具有多种格式 常用的信息格式包括帧 数据包 数据报 段 消息 元素和数据单元 信息交换发生在对等OSI层之间 在源端机中每一层把控制信息附加到数据中 而目的机器的每一
  • 多种系统如何安装并启动Redis

    1 Windows 系统下安装 首先坏消息是reids官网没有提供windows版的redis 但好消息是微软的开源技术团队在gtihub上开发和维护了windows版的redis 具体如何使用参考下这片文章 windows系统本地安装re
  • Struts2 重点总结 (2)

    国际化 资源文件和资源包 要用Struts实现国际化和本地化 首先要定义资源文件的名称 这个文件会包含用默认语言编写的会在程序中出现的所有消息 这些消息以 键 值 对的形式存储 如下 error validation localtion T
  • 软测入门(十)Jmeter接口测试基础

    接口测试流程 接口测试的流程 分析接口文档和需求 编写接口测试计划 5W1H 编写接口测试用例 接口测试执行 输出接口测试报告 接口测试分类 Web接口测试 服务器接口测试 模块接口测试 单元测试 接口测试的要点 数据是否正常 参数类型错误
  • 人工智能基础部分16-神经网络与GPU加速训练的原理与应用

    大家好 我是微学AI 今天给大家介绍一下人工智能基础部分16 神经网络与GPU加速训练的原理与应用 在深度学习领域 神经网络已经成为了一种流行的 表现优秀的技术 然而 随着神经网络的规模越来越大 训练神经网络所需的时间和计算资源也在快速增长
  • Ajax传json对象(jQuery)

    Ajax传json对象 相信很多小伙伴想要通过Ajax传输json数据给后端 本来直接发送一个data JSON stringify obj 就可以了 但是发现后端的请求参数中有一个参数需要int类型 这个时候就需要用到对象了 封装对象 首
  • 知识蒸馏基础及Bert蒸馏模型

    为了提高模型准确率 我们习惯用复杂的模型 网络层次深 参数量大 甚至会选用多个模型集成的模型 这就导致我们需要大量的计算资源以及庞大的数据集去支撑这个 大 模型 但是 在部署服务时 就会发现这种 大 模型推理速度慢 耗费内存 显存高 这时候
  • 如何在pycharm中使用配置好的virtualenv环境

    使用pycharm自动建立虚拟环境 file gt setting gt interpreter 选择添加环境 添加虚拟环境 这里选择不勾选第一个选项框 之后 将 requirements txt 文件放到虚拟目录 venv 下 pycha
  • MODIS数据的简介和下载(一)——MODIS数据简介

    借最近上课实习上机内容 来介绍MODIS数据相关方面内容 本部分主要包括了MODIS数据的简介和下载的问题 本篇是第一部分 MODIS的简介 主要分为三个部分 1 MODIS传感器简介及参数 2 MODIS产品及命名规则 3 MODIS的典
  • 【马士兵】Python基础--19

    Python基础 19 文章目录 Python基础 19 with语句 os模块的常用函数 os path模块的常用方法 with语句 with open logo png rb as src file with open copy2log
  • JS组件Bootstrap实现弹出框和提示框效果代码

    前言 对于Web开发人员 弹出框和提示框的使用肯定不会陌生 比如常见的表格新增和编辑功能 一般常见的主要有两种处理方式 行内编辑和弹出框编辑 在增加用户体验方面 弹出框和提示框起着重要的作用 如果你的系统有一个友好的弹出提示框 自然能给用户
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • hi3861 通过MQTT协议连接OneNet平台(配置好的环境+详细步骤)

    目录 前言 下载配置完毕的镜像 下载链接 修改Onenet信息 添加编译 编译 烧录 HiBurn下载 查看状态 作者留言 更多详情参考gitee网站 前言 hi3861单片机通过MQTT协议连接OneNet平台 下载配置完毕的镜像 下载链
  • 消除WORD中的域连接

    消除WORD中的域连接 Control A Control Shift F9
  • Docker服务启动报错:Job for docker.service failed because the control process exited with error

    报错信息 Job for docker service failed because the control process exited with error code See systemctl status docker servic
  • Idea的 Cannot resolve method ‘getAttribute(java.lang.String)‘问题解决

    问题 写javaweb jsp时使用application getAttribute出现报错 Cannot resolve method getAttribute java lang String 解决方法 第一步 File gt Proj
  • ansible定时任务模块和用户组模块使用

    接上篇 还是一些基础模块的使用 这里主要介绍的是系统模块的使用 下面例子都进行过相关的实践 从而可以直接进行使用相关的命令 3 用户模块的使用 用户模块主要用来管理用户账号和用户的属性 对远程主机用户进行批量管理 用户模块依赖的指令为use

随机推荐

  • 数据回归算法

    文章目录 效果一览 文章概述 研究内容 程序设计 参考资料 效果一览 文章概述 数据回归算法 Matlab实现高斯过程回归预测模型 研究内容 高斯过程回归 Gaussian Process Regression 是一种基于概率的非参数回归方
  • [转]DLL中使用全局变量

    默认只是 其宿主进程的全局变量 也是说 每个宿主程序都有这个副本 所以这个全局变量不能被所有进程共用 windows好像是用 copy on write机制进行保护的 如果共用 需要设置共享段 并把它放到共享段中 这样 一个宿主进程改了它的
  • 第十三届蓝桥杯省赛 最优清零方案题解

    题目描述 给定一个长度为N的数列A1 A2 AN 现在小蓝想通过若干次操作将这个数列中每个数字清零 每次操作小蓝可以选择以下两种之一 选择一个大于0的整数 将它减去1 选择连续K个大于0的整数 将它们各减去1 小蓝最少经过几次操作可以将整个
  • 电流反馈型运放电路设计指南

    刚开始使用电流反馈型运放时 总会从资料上看到这样的信息 电流反馈型运放直流特性不好 适合放大高频的交流信号 带宽不因频率增加而减小 也就是没有增益带宽积的概念 再深一点 CFB运放的反馈电阻需为恒定的值 为了弄清楚这些问题 我看过很多英文应
  • 为qt安装第三方插件qwt,可以在creator设计界面中拖拽

    前言 个人笔记 欢迎探讨 注意事项 1 如下步骤涉及的编译器 必须和creator使用的版本一样 而creator使用的编译器版本 可以通过qt的creator界面帮助菜单中查看关于creator得到 我使用的是creator4 4 1 编
  • Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知 binlog日志对于mysql数据库来说是十分重要的 在数据丢失的紧急情况下 我们往往会想到用binlog日志功能进行数据恢复 定时全备份 binlog日志恢复增量数据部分 化险为夷 一 简单了解binlogMySQL的二进制日志
  • Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

    最近在编写Python脚本过程中遇到一个问题比较奇怪 Python脚本完全正常没问题 但执行总报错 AttributeError module object has no attribute xxx 这其实是 pyc文件存在问题 问题定位
  • 人机交互-7-交互需求定义

    1 背景 无论取代或更新已有系统 还是开发新产品 需求的建立都是非常重要的 需求获取是项目设计的第一个阶段 确定和记录现有的工作流程 收集 将信息组织起来 整体上涵盖工作的各个方面 描述 产品是不同的 对需求提出了特殊的要求 用户是不同的
  • Spring中@Controller 和 @RestController 的作用与区别

    一 Controller 和 RestController都是Spring XXX类是否可以接收HTTP请求 二 Controller 和 RestController的不同点 当用 Controller时在方法上必须添加注解 Respon
  • 使用SVN钩子强制提交日志和限制提交文件类型

    作者 朱金灿 来源 http blog csdn net clever101 Subversion本身有很好的扩展性 用户可以通过钩子实现一些自定义的功能 所谓钩子实际上是一种事件机制 当系统执行到某个特殊事件时 会触发我们预定义的动作 这
  • python--判断闰年

    year int input 输入一个年份 if year 4 0 if year 100 0 if year 400 0 print 0 是闰年 format year else print 0 不是闰年 format year else
  • PyTorch训练简单的全连接神经网络:手写数字识别

    文章目录 pytorch 神经网络训练demo 输出结果 来源 pytorch 神经网络训练demo 数据集 MNIST 该数据集的内容是手写数字识别 其分为两部分 分别含有60000张训练图片和10000张测试图片 神经网络 全连接网络
  • App Transport Security has blocked a cleartext HTTP 报错解决办法

    Xcode 7 创建新项目用到 UIWebView 发送请求时 报下面的错 App Transport Security has blocked a cleartext HTTP http resource load since it is
  • Java制造业MES系统源码-免费领取

    Java制造业MES系统源码 免费领取 一 技术架构 开发环境 idea MySQL git redis 软件架构 Spring Boot Mybatis MybatisPlus SpringDataJpa Redis WkHtmlToPd
  • Spring源码分析(十一)依赖注入源码解析4:DefaultListableBeanFactory#findAutowireCandidates 根据类型查找所有候选Bean

    根据类型查找所有候选Bean org springframework beans factory support DefaultListableBeanFactory findAutowireCandidates protected Map
  • linux 如何rsync实现增量同步文件到多台机器?

    背景 我需要经常把160机器上的文件 同步到171 111 105等 为什么选择rsync 它可以实现增量同步 这也是没选scp的原因 所以 我选择rsync来实现 解决方案步骤如下 1 安装 sudo apt get install rs
  • Mac M1 安装 Ruby

    在M1芯片的Macbook安装Ruby会遇到很多问题 比如 用ruby install会失败 rbenv install 2 7 2也会失败 我结合网上的一些方法把成功的流程梳理一下 供参考 第一步 安装gpg brew install g
  • 网络证书有含金量吗?(转)

    网络证书有含金量吗 转 more 老板 含金量 市场需求 个人能力 说到证书的含金量 微软某培训经理曾经在网上有一个非常精辟的论述 如果两个人都是清华大学计算机系本科毕业的 两个人毕业时工资会一样么 如果发展三年以后 我想工资会相差很大 但
  • Java 终止线程的几种方式

    一 正常运行结束 所谓正常运行结束 就是程序正常运行结束 线程自动结束 public class ThreadTest extends Thread public void run do something 二 使用退出标志退出线程 一般r
  • JVM篇-堆空间(Heap)

    堆的核心概述 一个JVM实例只存在一个堆内存 堆也是Java内存管理的核心区域 Java堆区在JVM启动的时候既被创建 其空间到校也就确定了 是JVM管理的最大一块内存空间 堆内存可以调节 Java虚拟机规范 规范 对可以处于物理上不连续的