Bootstrap

语言基础和Java内存

各种语言的简介

现在主要的语言有:C,C++,JAVA,GO,C#,SHELL,PYTHON,PHP

C是最基础的语言

每种语言都能实现对方的全部功能,但是开发效率不同即实现同一目标的代码量不同

JAVA和GO擅长超大系统的开发,如服务器集群,由于其提供的类、库比较多,所有所需代码很少

JAVA也多用于手机端开发

C#擅长中小型的系统和桌面开发

C和C++性能最好

PYTHON擅长数据计算多用于校验

PHP多用于中小型网络开发

硬盘

专门存储文件(虚拟内存的数据在硬盘上也是以文件形式存储)

内存

存储变量和函数(函数的本质也是变量)

基础语言汇编与C语言

所有语言都是在操作系统中运行的,操作系统由汇编与C语言编写

各种硬件由汇编与C语言控制

所有程序执行时产生.class文件

各种语言在执行时都会翻译成C语言,各种语言所安装的环境就是用来翻译的

随后将其加载到内存中

进程

各种独立运行的程序称作一个进程,如QQ、微信等

每个进程各自占一块内存,通过申请数组占领内存

每个进程所占的内存称为块,不一定连续

每个进程将所占内存分成若干子部份,用于不同功能

Java所占内存

方法区:存有类信息,静态信息常量池

:方法拷贝运行

存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。

局部变量:方法的参数,或者是方法{}内部的变量

作用域:一旦超出作用域,立刻从栈内存当中消失。

:对象,字符串常量池

凡是new出来的东西,都在堆当中。

堆内存里面的东西都有一个地址值,16进制

堆内存里面的数据,都有默认值。规则:

如果是整数 默认为0

如果是浮点数 默认为0.0

如果是字符 默认为 ‘\u0000’

如果是布尔 默认为false

如果是引用类型 默认为null

程序计数器:辅助栈区域,决定什么时候出栈入栈。

本地方法区:翻译成操作系统本身的内核方法,对接驱动程序

方法区

分为类常量池和静态常量池

Person类

package com;



public class Person {

    public int age;//非静态属性

    public int height;//非静态属性

    public String name;//非静态属性

    public static int flag;//静态属性

    public void m1() {//非静态方法

    }

    public void m2() {//非静态方法

    }

    public static void m3() {//静态方法

    }

}

Test类

package com;

public class Test {

    public static void main(String[] args) {

       m1();

       m2();

    }



    public static void m1() {

       m2();

    }

    public static void m2() {

       m3();

    }

    public static void m3() {

    }

    public static void m4() {

    }

}

Car类

package com;

public class Car {

    public float price;

    public int speed;

}
类常量池

静态常量池

规则:先入后出

程序计数器决定方法什么时候运行完毕,随后执行出栈

以Test类为例

先依次入栈T.main→T.m1→T.m2→T.m3

程序计数器决定T.m3执行完毕后开始出栈T.m3→T.m2→T.m1

然后继续执行T.main

依次入栈T.m2→T.m3

程序计数器决定T.m3执行完毕后开始出栈T.m3→T.m2→T.main

全部出栈,执行完毕

这就是一个线程(一条线的执行过程)

线程本质上是一个栈

Java的基本类型

int a = 2; //   0000000000000000000000000000010

int b = 234;

a与b所占内存相同,因为类型相同都是int,大小32bit

引用类型

可以拆分成基本类型,所占大小不固定,每次值发生改变申请新的一块内存

如数组,字符串

引用类型变量x=值,表示x记录值的内存地址,就是指向内存

引用类型变量x=变量y,表示x指向与y相同的内存

引用类型出栈对对象无影响(前提是有其他引用类型指向对象)

在Java中如果一块空间没有被任何变量指向,则会被清理(自动垃圾回收机制,有一定延迟)

(在C语言中不会清理此内存,随后没有指针能指向该内存,发生内存泄漏)

package com;



public class Test {



    public static void main(String[] args) {

       int a = 111;

       int b = 234;

       short c = 67;

       int[] aa = {2,3,4};

       aa = new int[]{1,1,12,3,3};

       Person x1 = new Person();

       Person x2 = new Person();

       Person x3 = new Person();



       x1.age = 23;

       x1.height = 140;

       x1.name = "aaa";

       x1.name = "aassss";

       m1(x1);

    }

    public static void m1(Person x) {

        m2();

        x.name = "asd";

    }

    public static void m2() {

        m3();

    }

    public static void m3() {

        int a = 10;

        int b = 23;

        a = 45; b = 33;

        if(a <b) {

           int c = 89;

           if(c >a +b) {

              int d = 10;

              d = 99; c  = 66;  a = 67;

           }

        }

    }

    public static void m4() {



    }

}

当执行到int[] aa = {2,3,4};时,要将数据放入堆中,假设地址为111

随后执行aa = new int[]{1,1,12,3,3};aa指向的地址改变,原地址将会被回收

Person也是引用类型,依次执行相同操作(其中的flag与m3已经储存在了静态常量池中)

数据先为默认值

根据代码将数据保存

name为引用类型,需要开辟新的内存

name内容更改,开辟新的内存,原内存将被清除

m1(x1);

相当于x=x1,两个都是引用变量所以指向相同

m1调度m2,m2调度 m3

执行m3

执行完毕后依次出栈,回到m1

name值又进行了更改

最后陆续全部出栈,结束后由于垃圾回收机制,堆中的数据也进行清空

;