精华内容
下载资源
问答
  • 深入理解Java虚拟机 一.Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟机程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统...

    深入理解Java虚拟机(初步)

    一.Java虚拟机原理

            所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机, 大名鼎鼎的Visual BoxVmare就属于系统虚拟机,他们完全是对物理计算的仿真,提供了一个可以运行完整操系统的软件平台。

           程序虚拟机典型代码就是Java虚拟机,它专门为执行单个计算程序而计算,在Java虚拟机中执行的指令我们成为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

         Java发展至今,出现过很多虚拟机,最初Sun使用的一款叫ClassIcJava虚拟机,到现在引用最广泛的是HotSpot虚拟机,除了Sum意外,还有BEA的Jrockit,目前Jrockit和HostSopt都被oralce收入旗下,大有整合的趋势。

    二.Java内存结构

    三.堆、栈、方法区概念区别 

    3.1 Java堆

           堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

           根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代。其中新声带存放新生的对象或者年龄不大的对象,老年代则存放老年对象。新生代分为den区、s0区、s1区,s0s1也被称为fromto区域,他们是两块大小相等并且可以互相角色的空间。绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0s1区,之后每经过一次新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。

    3.2 Java栈 

           Java栈是一块线程私有的空间,一个栈,一般由三部分组成:局部变量表、操作数据栈和帧数据区

    局部变量表:用于报错函数的参数及局部变量

    操作数栈:主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间。

    帧数据区:除了局部变量表和操作数据栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着访问常量池的指针,方便计程序访问常量池,另外当函数返回或出现异常时卖虚拟机子必须有一个异常处理表,方便发送异常的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。

    3.3 Java方法区

            Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。比如类的字段、方法、常量池等。方法区的大小决定系统可以保存多少个类。如果系统定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。方法区可以理解为永久区。

    四.虚拟机参数配置

    4.1 什么是虚拟机参数配置  

            在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查会有一定的帮助,为此,在虚拟机提供了一些跟踪系统状态的参数,使用给定的参数执行Java虚拟机,就可以在系统运行时打印相关日志,用于分析实际问题。我们进行虚拟机参数配置,其实就是围绕着堆、栈、方法区、进行配置。

    4.2 堆的参数配置

    -XX:+PrintGC      每次触发GC的时候打印相关日志

    -XX:+UseSerialGC      串行回收

    -XX:+PrintGCDetails  更详细的GC日志

    -Xms               堆初始值

    -Xmx               堆最大可用值

    -Xmn               新生代堆最大可用值

    -XX:SurvivorRatio     用来设置新生代中eden空间和from/to空间的比例.

    含以-XX:SurvivorRatio=eden/from=den/to

    总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,

    这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。

    4.3 设置最大堆内存 

    参数:-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

    注: 一般JVM调优初始值和最大值设置一样大小。

    代码:

    public static void main(String[] args) throws InterruptedException {
        byte[] b1 = new byte[1 * 1024 * 1024];
        System.out.println("分配了1m");
        jvmInfo();
        Thread.sleep(3000);
        byte[] b2 = new byte[4 * 1024 * 1024];
        System.out.println("分配了4m");
        Thread.sleep(3000);
        jvmInfo();
    
    }
    
    /**
     * 转换为m
     *
     * @param maxMemory
     * @return
     */
    static private String toM(long maxMemory) {
        float num = (float) maxMemory / (1024 * 1024);
        DecimalFormat df = new DecimalFormat("0.00");// 格式化小数
        String s = df.format(num);// 返回的是String类型
        return s;
    }
    
    static private void jvmInfo() {
        // 最大内存
        long maxMemory = Runtime.getRuntime().maxMemory();
        System.out.println("maxMemory:" + maxMemory + ",转换为M:" + toM(maxMemory));
        // 当前空闲内存
        long freeMemory = Runtime.getRuntime().freeMemory();
        System.out.println("freeMemory:" +freeMemory+",转换为M:"+toM(freeMemory));
        // 已经使用内存
        long totalMemory = Runtime.getRuntime().totalMemory();
        System.out.println("totalMemory:" +totalMemory+",转换为M"+toM(totalMemory));
    }

    运行结果:

    4.4 设置新生代和老年代参数 

    -Xmn    新生代大小,一般设为整个堆的1/3到1/4左右

    -XX:SurvivorRatio    设置新生代中eden区和from/to空间的比例关系n/1

    4.4.1 设置新生代比例参数

    参数:-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

    代码:

    public static void main(String[] args) {
        //-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
        byte [] b = null;
        for (int i = 0; i < 10; i++) {
            b =new byte[1*1024*1024];
        }
    
    }

    运行结果:

    注:from区和to区可视为一个区。 

     4.4.2 设置新生代与老年代比例参数

    参数:-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=2 

    使用上面查看新生代比例代码运行查看结果:

           总结:不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。除了可以设置新生代的绝对大小(-Xmn),可以使用(-XX:NewRatio)设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。

    4.4.3 设置栈内存大小

    错误原因:java.lang.StackOverflowError

    栈内存溢出,产生于递归调用,循环遍历是不会出现栈内存溢出的,但是循环遍历中产生递归调用,也会出现栈内存溢出。

    参数:-Xss2m

    代码:

    private static int count;
    public static void count(){
        try {
            count++;
            count();
        } catch (Throwable e) {
            System.out.println("最大深度:"+count);
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        count();
    }

    运行结果:

    4.4 JVM调优总结

    JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标:

    • GC的时间足够的小
    • GC的次数足够的少
    • 发生Full GC的周期足够的长

      前两个目前是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取其平衡。

       1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值
       2)年轻代和年老代将根据默认的比例(12)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代,比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小

       3)年轻代和年老代设置多大才算合理?这个我问题毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大小变化有哪些影响

    • 更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的Full GC
    • 更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率
    • 如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:(A)本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例12也是这个道理 B)通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在11。但应该给年老代至少预留1/3的增长空间。
    展开全文
  • 深入理解计算机系统lab1——gdb调试初步与debug x86汇编初步 以下仅供最简单的入门参考!!!!!!! 安装Linux环境,并进行简单程序的编译GDB调试 一、安装linux系统与环境 第一步,在所使用的电脑平台...

    深入理解计算机系统lab1——gdb调试初步

    以下仅供最简单的入门和参考!!!!!!!

    安装Linux环境,并进行简单程序的编译和GDB调试

    一、安装linux系统与环境

    在这里插入图片描述
    第一步,在所使用的电脑平台上安装linux系统与环境;
    下载VM这个虚拟机后,又下载ubantu的32位Linux操作系统,在VM成功创建了Linux环境的虚拟机。

    在这里插入图片描述

    二、在linux系统中使用gcc完成简单c语言的编译和执行

    第二步,成功在linux系统中使用gcc完成简单c语言的编译和执行;
    打开终端,vim hello.c进行编辑,编辑完成后按:wq保存并退出,gcc hello.c -o hello编译生成可执行文件,./hello将结果成功输出。

    1.打开终端,vim hello.c 新建hello.c

    在这里插入图片描述

    2.编辑hello.c

    在这里插入图片描述

    3.保存hello.c并退出

    在这里插入图片描述

    4.gcc编译,生成可执行文件,执行并查看运行结果

    在这里插入图片描述

    三、GDB进行程序基本的程序调试和反汇编

    第三步,使用GDB进行程序基本的程序调试和反汇编。

    1. gcc -g hello.c -o hello 生成可调试文件,gdb hello进入调试界面
      在这里插入图片描述

    2. list(l)将代码全部加载出来
      在这里插入图片描述

    3. breakpoint (b) 4(第四行)然后设置断点 ,并查看info b,添加成功。
      在这里插入图片描述

    4. run(r)执行,到断点处停止。
      在这里插入图片描述

    5. disassemble得到汇编代码。
      在这里插入图片描述

    实验补充
    四、使用指令新建、编辑、汇编、链接汇编语言程序
    4.1新建并编辑源代码

    命令:getdit sum.c
    说明:gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。使用vi或者vim同样可以实现新建与编辑。
    在这里插入图片描述
    在这里插入图片描述

    4.2预处理

    命令:gcc -E sum.c -o sum.i
    说明:预处理时,编译器会将C源代码中包含的的头文件编译进来
    在这里插入图片描述
    在这里插入图片描述

    4.3编译

    命令:gcc -S sum.i -o sum.s
    说明:gcc首先检查代码的规范性,是否有语法错误,确定代码实际要做的工作,让后将代码翻译成汇编语言。
    在这里插入图片描述
    在这里插入图片描述

    4.4汇编

    命令:gcc -c sum.s -o sum.o
    说明:gcc进行汇编阶段,将编译阶段生成的”.s”文件转成二进制目标代码
    在这里插入图片描述

    4.5链接

    命令:gcc sum.o -o sum.out
    说明:链接过程将有关的目标文件彼此连接起来,使得所有目标文件成为一个能够执行的统一整体。
    在这里插入图片描述

    4.6执行

    命令:./sum.out
    说明:执行可执行文件,输出结果
    在这里插入图片描述

    五、能够使用gdb对汇编语言进行调试

    5.1生成汇编代码

    命令:gcc -g sum.c -o sum
    说明:使用命令生成可以调试文件
    在这里插入图片描述

    5.2开始调试

    命令:gdb sum
    说明:使用gdb对生成的可调试文件进行调试
    在这里插入图片描述

    5.3设置新的断点

    命令:breakpoint(b)
    说明:设置断点的命令是break,它通常有如下方式:
    break 在进入指定函数时停住
    break 在指定行号停住。
    break +/-offset 在当前行号的前面或后面的offset行停住。offiset为自然数。
    break filename:linenum 在源文件filename的linenum行处停住。
    break … if …可以是上述的参数,condition表示条件,在条件成
    立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
    可以通过info breakpoints [n]命令查看当前断点信息。
    在这里插入图片描述

    5.4单步执行程序

    命令:si/ni
    说明:ni/si都是汇编级别的断点定位。si会进入汇编和C函数内部,ni不会。

    5.5查看寄存器

    命令:info regs(i r)
    说明:命令i r能够查看所有寄存器的值
    在这里插入图片描述
    执行命令i r后打印出所有寄存器的列表
    在这里插入图片描述
    程序运行到第七行输出,此时查看寄存器的值,可见eax=9结果正确

    5.6查看指定内存内容

    命令:examine(x)
    说明:x的命令语法如下图所示
    在这里插入图片描述

    执行命令:x/10x $sp
    说明:打印当前栈stack的10个元素
    在这里插入图片描述
    当前栈的第6、7元素对应于a、b的值

    展开全文
  • 初步理解NServiceBus

    2019-06-22 17:16:27
    它在消息发布/订阅支持、工作流集成高度可扩展性等方面表现优异,因此是很多分布式系统基础平台的理想选择。,它能够帮助开发人员在搭建企业.NET系统时避免很多典型的常见问题。同时,该框架也提供了一些可伸缩的...

    概述

    NServiceBus 是一个用于构建企业级 .NET系统的开源通讯框架。它在消息发布/订阅支持、工作流集成和高度可扩展性等方面表现优异,因此是很多分布式系统基础平台的理想选择。,它能够帮助开发人员在搭建企业.NET系统时避免很多典型的常见问题。同时,该框架也提供了一些可伸缩的关键特征,比如对发布/订阅的支持、集成的长时间工作流及深入的扩展能力等。据作者说,其本意是为构建分布式应用软件创建一个理想的基础设施。

    NServiceBus的核心并不依赖于MSMQ。NServiceBus可扩展性允许我们插入自行编写的通信传送器,、订阅存储器和工作流的实现。我已经基于MSMQ实现了一个传送器,还有一个则借助了WCF的NetTCP。开发人员既可以使用这些现有组件,也可以根据需要进行自定义。我们知道当前的许多SOA产品都与HTTP紧密耦合,因此NServiceBus的这种实现方式也将是个另辟蹊径的设计。
    之所以选择使用MSMQ,是因为它是微软公司的两大主流的通讯技术之一(另一个是SQL Server Service Broker)。MSMQ允许双方在离线的状态下进行通信,且它提供了一整套易于使用的API,并已经集成到了.NET框架中,这一点要比Service Broker好得多。我个人认为支持离线通信是任何SOA基础框架都必须考虑的关键部分——因为Tenet of Service Autonomy 并不能保证当前通信的另一端处于可用状态。

    NServiceBus是dotnet世界里面最流行的开源企业服务总线.  它具有以下特点: 1.强大,轻量级.     2.可插拨,简单易用.     3.支持企业级开发.

     

    在internet中的应用

    image

     

     

    Publish / Subscribe (发布者/订阅者)

    ²这种方式解决了发布消息对象知道消息发送给谁.(谁订阅了就给谁发)

    Subscriptions (订阅者)

    image

     

    Publish(发布者)

    image

     

    NserviceBus in Distributor(在分布式系统的应用)

    One publish(一个发布者):

    image

     

    Two publish(两个发布者的时候):

    image

     

     

     

    Point to Point(点对点通信)

    image

     

    Point to Point Configuration(需要配置)

    Client
    
    class EndPointConfig : IConfigureThisEndpoint, AsA_Client { } 
    
    <UnicastBusConfig>      <MessageEndpointMappings>       <add Messages="MyMessages“ Endpoint="MyServerInputQueue" />   </MessageEndpointMappings> 
    </UnicastBusConfig>

     

     

    Server
    
    class EndPointConfig : IConfigureThisEndpoint, AsA_Server { } 
    
    <MsmqTransportConfig InputQueue="MyServerInputQueue" />

     

     

    Request & Response(请求\回复)

    image

     

    Publish & Subscribe(发布者\订阅者)

    image

     

     

    Subscriber
    
    class EndPointConfig : IConfigureThisEndpoint, AsA_Server { } 
    
    <MsmqTransportConfig InputQueue=Subscriber1InputQueue" />   <UnicastBusConfig>      <MessageEndpointMappings>       <add Messages="MyMessages" Endpoint=" MyPublisherInputQueue" />     </MessageEndpointMappings>   </UnicastBusConfig>

     

    Publisher
    
    class EndPointConfig : IConfigureThisEndpoint, AsA_Publisher { } 
    
    <MsmqTransportConfig InputQueue="MyPublisherInputQueue />

     

     

    Saga(Workflow)

    image

     

    Server
    
    class EndPointConfig : IConfigureThisEndpoint, AsA_Server { } 
    
    <MsmqTransportConfig InputQueue=MySagaInputQueue" /> 
      <UnicastBusConfig>   <MessageEndpointMappings>     <add Messages="MyMessages" Endpoint="MyDestinationInputQueue" /> 
          <add Messages=“NServiceBus.Saga.TimeoutMessage” Endpoint=“timeoutmanager” >   </MessageEndpointMappings> 
      </UnicastBusConfig>
    
    <NHibernateSagaPersisterConfig>
      <NHibernateProperties>
          <add Key="connection.provider“ Value="NHibernate.Connection.DriverConnectionProvider"/>
          <add Key="connection.driver_class" Value="NHibernate.Driver.SqlClientDriver"/>
          <add Key="connection.connection_string" Value="Server=localhost;initial 	catalog=NServiceBus;Integrated Security=SSPI"/>
          <add Key="dialect" Value="NHibernate.Dialect.MsSql2000Dialect"/>
        </NHibernateProperties>
      </NHibernateSagaPersisterConfig>

     

     

     

    Distributor(分布式系统)

    image

     

    <appSettings>   <add key="NumberOfWorkerThreads" value="1"/>   <!-- queue that the distributor process reads and feeds to workers -->   <add key="DataInputQueue" value="nservicebus_distributor_data_bus"/> 
      <!--queue that manages work distribution -->  <add key="ControlInputQueue“ 	value="nservicebus_distributor_control_bus"/>   <!-- errors -->   <add key="ErrorQueue" value="nservicebus_error"/>   <!-- queue that maintains the state(availability) of the workers -->   <add key="StorageQueue" value="nservicebus_distributor_storage"/>      <!-- relevant for a Serialization of "interfaces" or "xml" -->   <add key="NameSpace" value="http://www.MySite.com"/>         <add key="Serialization" value="xml"/>   <!-- can be either "xml", or "binary" --> 
    </appSettings> 

     

     

     

    欢迎各位参与讨论,如果觉得对你有帮助,请点击image    推荐下,万分谢谢.

    作者:spring yang

    出处:http://www.cnblogs.com/springyangwc/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    转载于:https://www.cnblogs.com/springyangwc/archive/2011/12/19/2293690.html

    展开全文
  • 多态的初步理解

    2020-05-04 20:15:19
    对于多态的理解,只能说刚刚入门,还需后面的大量练习继续深入学习才能真正融会贯通 做了一个小小的案例来夯实一下多态、封装、继承, 因为简单案例,所以没有拆分,全写一个类中: package tetris; //block:方块 ...

    什么是多态:父类引用指向子类对象

    1、多态的前提:
    a、必须得类与类之间存在关系,可以继承、实现
    b、必须得重写父类的方法
    2、多态的好处:大提高代码的可扩展性
    对于多态的理解,只能说刚刚入门,还需后面的大量练习和继续深入学习才能真正融会贯通
    做了一个小小的案例来夯实一下多态、封装、继承,

    因为简单案例,所以没有拆分,全写一个类中:

    package tetris;
    //block:方块
    public class Block {	
    	void deformation() {	//deformation:变形
    		System.out.println("变形");
    	}
    }
    //	0-一字型,1-田字型,2-L字形,3-z字形
    class BK_yzx extends Block{
    	void deformation() {
    		System.out.println("一字形在变形");
    	}
    }
    class BK_tzs extends Block{
    	void deformation() {
    		System.out.println("田字形在变形");
    	}
    }
    class BK_lzx extends Block{
    	void deformation() {
    		System.out.println("L字形在变形");
    	}
    }
    class BK_zzx extends Block{
    	void deformation() {
    		System.out.println("z字形在变形");
    	}
    }
    

    封装的一个简单工具类:

    package tetris;
    
    public class Utils {	//	工具类
    	void deformation(Block b) {
    		b.deformation();
    	}
    }
    

    最后,执行函数:

    package tetris;
    
    import java.util.Random;
    
    public class Excute {	//	执行
    	public static void main(String[] args) {
    		for (int i = 0; i < 20; i++) {
    			Random r = new Random();
    			int s = r.nextInt(4);
    			Block b = null;	//	定义一个父类引用
    			switch (s) {	//	0-一字型,1-田字型,2-L字形,3-z字形
    			case 0:
    				b=new BK_yzx();
    				b.deformation();
    				break;
    			case 1:
    				b=new BK_tzs();
    				b.deformation();
    				break;
    			case 2:
    				b=new BK_lzx();
    				b.deformation();
    				break;
    			case 3:
    				b=new BK_zzx();
    				b.deformation();
    				break;
    			}
    		}
    	}
    }
    

    最后,放上结果,凑和看吧:
    在这里插入图片描述
    如果有不正确的定义或者代码,还请各位大大不悋赐教!!!

    展开全文
  • 根据vue的官网介绍,可以得知vue是一个mvvm框架,且是响应式的。为了更深入理解其内涵,本人以及理解实现了一个简单的mvvm学习的demo。下面分享给大家,欢迎大家一起讨论。 一、m...
  • 深入理解构造析构函数

    千次阅读 2018-03-18 19:14:08
    深入理解构造析构函数 一、 概述构造函数析构函数是当你刚接触C++的时候就会碰到的两个概念,也是C++语法中较难掌握的两个概念。但是它们又是学习C++必须掌握的,可以说没有理解构造析构函数,你的C++就...
  • 首先为了让我们能够对CookieSession有一个初步理解,先给出一个问题一个例子来引出CookieSession,然后随后带着问题再去思考CookieSession二者的机制。 问题1:为什么我们在浏览网页的时候,会发现它会...
  • c# await async 的初步理解

    千次阅读 2019-07-29 15:09:32
    学习完深入理解C#关于await async的一些总结: 1. await async 的用法 2. await的一些限制 3.异步模式 4.可等待模式 5.从编译器的角度去理解 1. await async 的用法 async为修饰符用于在函数的返回值...
  • ----《深入理解java虚拟机》 在java里面,不需要为每一个new操作还去使用delete/free操作,不那么容易出现内存泄漏溢出的问题,这是因为java程序是由java虚拟机在执行,这些内存管理机制也是控制了内存,但是...
  • 今天看了一下android事件的分发处理机制,以前完全没有去了解过,今天算是初步了解了一下,现将一些总结一下,以便日后复习巩固,当然这只是初步理解总结,距离深入还差很远。不对的地方,希望读者能够指出来,我...
  • AsyncTask的深入理解

    千次阅读 2019-08-15 18:29:29
    AsyncTask的深入理解 一、AsyncTask 1、初步理解 AsyncTask是一个轻量级的异步任务类,底层封装了ThreadHandler,AsyncTask不适合进行特别耗时的后台任务,特别耗时建议使用线程池。 public abstract class ...
  • Spring的定义对DI的初步理解对AOP的初步理解对DI的深入探究对AOP的深入探究Spring的事务管理Spring MVC 接下来阐述一下我对AOP的理解,还是回到之前那个骑士寻找圣杯的场景来。现在场景稍有改变,在骑士寻找...
  • move语义最原始的左值右值定义可以追溯到C语言时代,左值是可以出现在赋值符的左边右边,然而右值只能出现在赋值符的右边。在C 里,这种方法作为初步判断左值或右值还是可以的,但不只是...
  • 总结(一) 知识点初步理解

    千次阅读 2014-11-20 12:59:06
    最近看了些立体视觉方面的资料,感觉立体视觉涉及到的东西太多,且数学理论比较强,特别是几何方面的东西,下面是对这一周看关于立体视觉方面的资料的初步总结,很多知识也是懂了个概念而已,深入的话要在以后的实践...
  • 能够理解汇编代码以及它是如何与原始的C代码相对应的,是理解计算机如何执行程序的关键一步。 基本概念: 程序计数器 成为%eip,表示将要执行的下一条指令在存储器中的地址。 整数寄存器有8个,可以存储32位的值。 ...
  • 今天学习vue的深入响应式原理,需要了解gettersetter,经过一番研究后,写一下自己的理解。举个例子:在使用set时,不仅实现了赋值,还可以顺带打印出赋的值。set setparam(param) { this.param = param...
  • this初步深入学习

    2016-04-28 12:11:00
    一连串的蝴蝶效应让我深深的认识到自己学习的马虎,总是为求快的一笔带过,结果到最后自己也没能很深入的去了解那些看似浅显却需要很细心耐心去理解的知识点,所以在这里我借用阮大大的几个例...
  • 深入理解CSS盒子模型

    2020-05-17 22:56:17
    深入理解盒子模型 1.盒子模型的初步了解 盒尺寸中的4个盒子 content-box、padding-box、border-boxmargin-box分别对应CSS世界中的centent、padding、border、margin属性,这四个属性称为”盒尺寸四大家族”; ...
  • 之前看了很多关于Swift派发机制的内容,但感觉没有一篇能够彻底讲清楚这件事情,看完了这篇文章之后我对Swift的派发机制才建立起了初步的认知.一张表总结引用类型,修饰符它们对于Swift函数派发方式的影响.函数派发...
  • 深入入理理解解Python 代代码码优优化化详详解解 本文初步探讨了 python 常见的性能优化技巧以及如何借助工具来定位分析程 的性能瓶颈并提供了相关可以 进行性能优化的工具或语言希望能够更相关人员一些参考 ...
  • 深入理解Java中的IO

    2019-09-28 04:33:21
    本文转载自:深入理解Java中的IO 为了方便理解与阐述,先引入两张图 在整个Java.io包中最重要的就是5个类一个接口。 5个类指的是File、OutputStream、InputStream、Writer、Reader; 1个接口指的是Serializable....
  • 【IT168 技术】权限两个字,一个权力,一个限制。在软件领域通俗的解释就是哪些人可以对哪些资源做哪些操作。在SQL Server中,”哪些人”,“哪些资源”,”哪些操作”...对于主体,安全对象权限的初步理解,见图1.图
  • 之前看了很多关于 Swift 派发机制的内容, 但感觉没有一篇能够彻底讲清楚这件事情, 看完了这篇文章之后我对 Swift 的派发机制才建立起了初步的认知. 正文 一张表总结引用类型, 修饰符它们对于 Swift 函数派发...
  • 由上一篇我们对可重入锁读写锁的学习,已经初步了解到锁的底层实现原理,今天让我们来对锁进一步的封装 文章目录队列同步器队列同步器的接口与示例队列同步器的实现分析手写实现一个简易AQS 队列同步器 队列...
  • 在以后发表的文章中,这个讲座将介绍TCPUDP协议、路由理论、然后再深入研究具体的路由协议。 IP协议直接位于2层数据链路层之上,负责生成发往目的地的数据报。IP协议原来在RFC 791中定义,后来进行了修改并且进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 651
精华内容 260
关键字:

初步理解和深入理解