zoukankan      html  css  js  c++  java
  • 面向对象面向过程、内存分析、垃圾回收机制

    2019-08-04         19:57:28

    面向对象与面向过程的总结

    1.面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。(不对立)

    2.面向过程思想思考问题时,我们首先思考“怎样按照步骤实现?"并将步骤对应成方法,一步一步,最终完成。这个适合简单任务,不需要多协作的事务。如“如何开车?”

    当需要很多协作才能完成时,面向对象的思想应运而生。如“如何造车?” ,需要多人协作, 所以面向对象的思想适合开发一些大型的软件。

    3.解决复杂问题时:宏观上使用面向对象把握,微观处理上依然是面向过程(方法与控制语句是典型的面向过程的产物)

    4.都是解决问题的思维方式,都是代码组织的方式。

    对象是一个在内存中是一个内存块,用来表示一堆相关联的数据以及一些相关的方法。

    对象的产生,类比企业发展,更深刻地理解为什么会产生"对象"这个概念。

    数据无管理时代:最初的计算机语言只有基本变量(类似基本数据类型),用来保存数据。面对的数据逻辑非常简单不需要涉及"数据管理"的问题。类型与企业初期发展阶段只有几个人,大家都闷头做事就行了。

    数据管理和企业部门制:企业发展中,员工多了怎么办?自然的想法是将他们归类。同理在编程中,变量多了,很简单的想法就是“将同类型的数据放在一起”,于是就形成了“数组”的概念,这就是“归类”的概念,便于管理数据、管理人。

    对象和企业项目制一个完整的项目组,就是个创业公司甚至小型公司的编制,大型公司内部都采用“项目制”的方式进行管理。随着计算机编程继续发展,各种变量的类型增多了,而且对数据的操作(指的是方法)也复杂了,为了方便协作和管理,我们”将相关数据和相关方法封装到一个独立的实体”,于是对象产生了;

    比如,一个学生对象

    属性(静态特征):年龄:20  姓名:张三  学号:1706

    也可以有方法:学习、吃饭、睡觉

    对象和类的概念:类(class)可以看作是对象的模板,或者图纸。类是对象的抽象。对象(class,instance(实例)),我们说某个类的对象与某个类的实例是一个意思。

     类=属性+方法,属性(成员变量)用于定义该类对象包含的数据或者说静态特征。  方法用于表示该类或该类实例的行为特征和功能实现。

    一个简单的学生类,属性以及方法:

    面向对象的内存分析:

    java虚拟机的内存可以分为三个区域:栈stack   、堆heap   、方法区method area(也在堆里,作用特殊,所以独立出来)

    栈的特点如下:1.栈描述的是犯法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)

    2.栈属于线程私有,不能实现线程间的共享。启动程序一个程序的时候,这个程序会包含很多的线程。

    3.JVM为每个线程创建一个栈,用于存放该线程执行方法的信息。

    4.栈的存储特性是“先进先出,后进后出” (子弹夹模型)

    5.栈是系统自动分配,速度快!是一个连续的内存空间。

    堆的特点如下:1.用于存放创建好的对象和数组(数组也是对象)(new好的对象放在堆里)

    2.JVM只有一个堆,被所有线程共享。

    3.是一个不连续的内存空间,分配灵活,速度慢!

    方法区:1.JVM只有一个方法区,被所有线程共享。

    2.方法区实际也是堆,只是用于存储类、常量相关的信息。

    3.用来存放程序中永远不变的内容。(静态变量、类信息、字符串常量等)

    该程序的内存分析:

    public class Student {
        //属性fields
        int id;
        String name;
        int age;
        Computer comp;  //comp是对象
        //方法
         void study(){
            System.out.println("我在认真学习!使用电脑:"+comp.brand);
        }
         void play(){
            System.out.println("我在玩游戏");
        }
        //程序执行的入口
        //javac Student.java ,java Student(虚拟机启动)执行类
        public static void main(String agrs[]){
            Student stu=new Student(); //创建对象
            stu.id=170602;
            stu.name="laura";
            stu.age=20;
            Computer c1=new Computer();
            c1.brand="联想";
            stu.comp=c1;
            stu.study();//调用study方法
        }
    }
    class Computer{   //创建一个电脑类,一个java程序中只能有一个public类
        String brand;    
    }

    简略直观的小图:

     

    垃圾回收机制(Garbage Collection)

    垃圾回收机制是Java提供的自动释放内存空间的机制。垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程,用于回收没有被引用的对象。

    java引入了垃圾回收机制,可以讲更多的经历放在业务逻辑上而不是内存管理上,大大提高了开发效率。(相当于c++与java两个饭店,c++饭店每次客人吃完饭后需要自己打扫完桌子才能离开,如果不打扫,则下一桌客人无法继续就餐;java饭店则雇佣了一个服务员(GC),每次客人吃完饭后,主动去打扫垃圾,因此生意越来越好)

    垃圾回收的过程:1.发现无用的对象    2.回收无用对象占用的空间

    垃圾回收的相关算法1.引用计数法 堆中每一个对象都有一个引用计数。被引用一次,计数器加1.被引用变量值变为null,则计数器减1,直到计数器为0,则表示变为无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法识别。2.引用可达法(根搜索算法)程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点后,继续寻找这个节点的引用节点,当所有引用节点寻找完毕之后,剩余的节点被认为是没有引用到的节点,即无用的节点。

    通用的分代垃圾回收机制  分代垃圾回收机制是基于这样一个事实:不同对象的生命周期是不一样的。因此,不同生命周期的对象采用不同的回收算法,以便提高回收效率。我们将对象分为三类:年轻代、年老代、持久代。JVM将堆内存分为Eden 、Survivor、Tenured/Old空间。

    1.年轻代:所有新生成的对象都是放在Eden区,年轻代的目标就是尽可能快速地收集那些生命周期短的对象,对应的是Minor GC,每次Minor  GC会清理年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会浪费内存空间。当“年轻代”区域存满对象后,就将对象存放到年老代区域。

    2.年老代:在年轻代中经历了N(默认15次)垃圾回收后仍然存活的对象,就会被放在老年代中。因此,当年老对象越来越多,我们就需要启动Major GC和Full GC(全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。

    3.持久代:用于存放静态文件,如java类、方法等,持久代对垃圾回收没有显著影响。

    容易造成内存泄漏的操作:创建大量无用对象、静态集合类的使用、各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭、监听器的使用

    注:以后深入了解到相关知识时,再回过头来看这些操作

    •要点:1.程序员无权调用垃圾回收器

    2.程序员可以通过System.gc(),该方法只是通知JVM,并不是运行垃圾回收器,尽量少用,会申请启动Full  GC,成本高,影响系统性能。

    3.finalize方法,是java提高给程序员用来释放对象或资源的方法,但是尽量少用。

    Minor GC :用于清理年轻代区域。Eden区满了就会触发一次Minor GC,清理无用对象,将有用对象复制到"Survivor 1"、"Survivor 2"区中(这两个区,大小空间相同,同一时刻至于一个在用,一个为空)

    Major GC :用于清理老年代区域

    Full GC:用于清理年轻代、年老代区域,成本较高,会对系统性能产生影响。

    垃圾回收过程:

    1.新创建的对象,绝大多数都会存储在Eden中

    2.当Eden满了(达到一定比例)不能创建对象,则会触发垃圾回收(GC),用Minor GC将无用对象清理掉。然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区。

    3.当Eden再次满了,再查验一遍S1区,清空S1区的无用对象;会将S1中不能清空的对象放在另一个Survivor中,如S2。同时将Eden区不能清空的对象,也复制到S1中,保证Eden和S1均被清空。

    4.重复多次Survivor中没有被清理的对象会被放在老年区Old中,老年区达到一定比例也会用Major GC清理。

    5.当Old区满了,则会触发一个一次完整的垃圾回收(Full GC),之前新生代的垃圾回收称为(minor  GC)

  • 相关阅读:
    WinHex简介
    CTF中图片隐藏文件分离方法
    隐写术的相关解法
    JPEG文件格式
    PNG文件结构
    网络安全实验室—基础关
    实验吧—密码学(1)
    YIT-CTF—隐写术
    YIT-CTF—Web
    YIT-CTF—社工类
  • 原文地址:https://www.cnblogs.com/laurarararararara/p/11299288.html
Copyright © 2011-2022 走看看