天天看点

创建对象内存分析及小结

作者:崔九八

创建对象内存分析

代码示例

public class Pet {

    public String name;
    public int age;
​
    //无参构造器
​
    public void shout(String name){
        System.out.println(name + "叫了一声");
    }
}           
public class Application {
    public static void main(String[] args) {

        Pet dog = new Pet();

        dog.name = "旺财";
        dog.age = 3;
        dog.shout(dog.name);

        System.out.println(dog.name);
        System.out.println(dog.age);

        System.out.println("==================");

        Pet cat = new Pet();
        System.out.println(cat.name);
        System.out.println(cat.age);
    }
}

//输出结果
旺财叫了一声
旺财
3
==================
null
0

Process finished with exit code 0           

对象内存分析图如下:

创建对象内存分析及小结

简单小结:类与对象

1.类与对象

类是一个模板:抽象,对象是一个具体的实例

2.方法

定义,调用!

3.对应的引用

引用类型:基本类型(八个)

对象是通过引用来操作的:栈--->堆

4.属性:字段Field 成员变量

默认初始化:

数字:0 0.0

char:u0000

boolean:false

引用:null

修饰符 属性类型 属性名 = 属性值!

5.对象的创建和使用

必须使用new 关键字创造对象,构造器 Person cuijiuba = new Person();

对象的属性 cuijiuba.name

对象的方法 cuijiuba.sleep()

6.类

静态的属性 属性

动态的行为 方法

封装、继承、多态

每日Java面试题

一、非阻塞I/O(nonblocking IO)

非阻塞I/O模型,我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。

当用户进程发出read操作时,如果kernel中数据还没准备好,那么并不会block用户进程,而是立即返回error,用户进程判断结果是error,就直到数据还没准备好,用户可以再次发read,直到kernel中数据准备好,并且用户再一次发read操作,产生system call,那么kernel马上将数据拷贝到用户内存,然后返回;所以nonblockingIO的特点是用户进程需要不断的主动询问kernel数据好了没有。

阻塞IO一个线程只能处理一个IO流事件,要想同时处理多个IO流时间要么多线程要么多进程,这样做效率显然不会高,而非阻塞IO可以一个线程处理多个流事件,只要不停地询所有流时间即可,当然这个方式也不好,当大多数流没有数据时,也是会大量浪费CPU资源;为了避免CPU空转,引进代理(select和poll,两种方式相差不大),代理可以观察多个流I/O事件,空闲时会把当前线程阻塞掉,当有一个或多个I/O事件时,就从阻塞态醒过来,把所有IO流都轮询一遍,于是没有IO事件我们的程序就阻塞在select方法处,即便这样依然存在问题,我们从select出只是知道IO事件发生,却不知道是哪几个流,还是只能轮询所有流,epoll这样的代理就可以把哪个流发生怎样的IO事件通知我们;

创建对象内存分析及小结

二、I/O多路复用模型(IO multiplexing)

I/O多路复用就在于单个进程可以同时处理多个网络连接IO,基本原理就是select,poll,epoll这些个函数会不断轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程,这三个functon会阻塞进程,但和IO阻塞不同,这些函数可以同时阻塞多个IO操作,而且可以同时对多个读操作,写操作IO进行检验,直到有数据到达,才真正调用IO操作函数,调用过程如下图;所以IO多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中任意一个进入就绪状态,select函数就可以返回。

IO多路复用的优势在于并发数比较高的IO操作情况,可以同时处理多个连接,和blocking IO一样socket是被阻塞的,只不过在多路复用中socket是被select阻塞,而在阻塞IO中是被socket IO给阻塞。

创建对象内存分析及小结

三、信号驱动I/O模型

可以用信号,让内核在描述符就绪时发送SIGIO信号通知我们,通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回,我们的进程继续工作,也就是说它没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已经准备好待处理。特点:等待数据到达期间进程不被阻塞。主循环可以继续执行,只要等待来自信号处理函数的通知:既可以是数据已准备好被处理,也可以是数据报已准备好被读取。

创建对象内存分析及小结

继续阅读