• 不像JVM的JVM


     

    1、面向对象

    • 面向对象的思想:将功能封装到对象中,通过对象去实现

    • 面向对象的目的:将复杂的事情简单化,将以前过程中的执行者变成了指挥者且符合现在人们的思考习惯

    • 面向对象的三大特征:

      1. 封装:将对象的实现细节隐藏起来,通过公共的方法向外暴露该对象的功能

      2. 继承:子类继承了父类之后,成为一种特殊的父类,能直接或间接的获得父类里的成员

      3. 多态 :同一类型的对象在运行时可能表现出不同的行为

    2、类和对象

    • 类的定义:class 类名

    • 类的实例化:

      对象的创建:先有类,再有对象(先有模板,再根据模板制造个体) 
      创建对象:类 对象名 = new 类名()    Student zz = new Student(); //根据类名创建对象
      赋值:对象名.变量名 = 值   zz.age = 18; zz.name = "智障";//注意前后类型一致
      取值:变量 = 对象名.变量名   int age = zz.age;system.out.println(age)
      对象调用方法:对象名.方法名(实参)  

    3、jvm

     

    3.1、java程序执行流程

    一个Java程序的具体执行流程如下:

     

    过程:java源代码被java编译器编译成.class的字节码文件,然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),即JVM内存

     

    3.2、java内存划分

    JVM将内存主要划分为:方法区、虚拟机栈、本地方法区、堆、程序计数器

    (偷的图)

     

     

    3.2.1、虚拟机栈:(一个线程对应一个java虚拟机栈)

    执行引擎每调用一个方法时,就会为这个方法创建一个栈帧,并加入虚拟机栈,每个方法从调用到结束,就是对应一个栈帧的入栈与出栈。(出栈之后栈帧就没了)。虚拟机栈主要用于存储变量,方法参数、方法返回值等。

    • 栈是一种数据结构

    特点:先进后出 入栈:把元素放在栈里

    栈底:栈中最后一个元素 出栈:把元素从栈里移除

    栈顶:栈中的第一个元素

     

    • 执行一个方法,生成一个栈帧,里边放成员变量,在方法执行前入栈,执行完毕后出栈

    public class Test{

    static void sum(int a,int b){

    system.out.println(a+b);

    }

    public static void main(String[] args){

    int x=10;

    sum(10,20);

    }

    }

    第一步:执行主函数,生成一个栈帧

    第二步:执行sum()方法,生成一个栈帧,里边存了x=10这个成员变量,入栈

    第三步:调用sum()方法,生成一个栈帧,里边放a和b两个变量,入栈

    第四步:执行完sum()方法,出栈

    第五步:执行完main()方法,出栈

    3.2.2、堆

    堆用于存储Java对象,每个Java对象都是这个对象类的副本,会复制包含继承自它父类的所有非静态属性。(即使用new关键字的对象,数组之类的)。

    第一步:执行main()方法,生成一个栈帧,在堆中开辟一块小地方,初始化数组,将栈帧指向堆中的地址

    第二步:在堆中开辟另一块空间,初始化数组,将此堆的地址给main()方法栈帧

    第三步:第一步中的堆没有用了被释放(垃圾回收机制)

     

    3.2.3、方法区

    用于存储类结构信息,class文件加载进JVM时会被解析成JVM识别的几个部分分别存储在不同的数据结构中:常量池、域、方法数据、方法体、构造函数,包括类中的方法、实例初始化、接口初始化等。

    方法区被JVM的GC回收器管理,但是比较稳定,并没有那么频繁的被GC回收。

    3.2.4、本地方法栈

    是为JVM运行Native方法(本地方法:非java语言编写的方法,被编译成和处理器相关的代码)准备的空间,类似于Java栈。

    3.2.5、程序计数器(PC寄存器)

    记录下一条要执行的字节码指令地址和被中断地址。如果方法是 native的,程序计数器的值不会被定义为空。

    4、数据类型

    主要分为基本数据类型和引用数据类型

    4.1、基本数据类型

    byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

    short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

    int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

    long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。

    float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。

    double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

    boolean:只有true和false两个取值。

    char:16位,存储Unicode码,用单引号赋值。

    基本数据类型:只有一块存储空间,在栈中存放的是具体的值

    4.2、引用数据类型(即使用new关键字创建出来的类型)

    主要有类、接口、数组、枚举、注解

    引用数据类型有两块存储空间,一个在栈中,一个在堆中,栈中存放的是在堆中的地址

    5、基本数据类型:值传递

    6、引用数据类型:地址传递

    7、一些问答题

    • 为了更好地管理,把堆内存按对象的声明周期划分为 old区和young区
    • young区或者old区内存不够了怎么办?

               对没用的对象进行回收,即垃圾回收机制

    ...............JVM未完待续 ,周末再看

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    STL 之 unordered_map
    vim tab和空格相互替换
    windows使用
    debugger打不开
    存储过程中执行动态Sql语句
    什么是详细设计说明书?
    C#中调用SQL存储过程(带输入输出参数的例子)
    如何解决网站在IE8下出现布局乱的情况?
    SQLServer 游标简介与使用说明
    线程池ThreadPoolExecutor参数设置
  • 原文地址:https://www.cnblogs.com/bzbz/p/11478867.html
Copyright © 2020-2023  润新知