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未完待续 ,周末再看

不像JVM的JVM的更多相关文章

  1. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  2. 【JVM】JVM随笔索引

    JVM目录 [JVM]Java内存模型 [JVM]类加载机制 [JVM]深度分析Java的ClassLoader机制(源码级别) [JVM]关于类加载器准备阶段的一道面试题目 [JVM]JVM垃圾收集 ...

  3. Java内存管理-初始JVM和JVM启动流程(二)

    勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了什么是程序,以及Java程序运行的三个阶段.也顺便提到了Java中比较重要 ...

  4. 深入理解JVM之JVM内存区域与内存分配

    深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...

  5. Java -JVM:JVM百科

    ylbtech-Java -JVM:JVM百科 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机 ...

  6. JVM(七):JVM内存结构

    JVM(七):JVM内存结构 在前几节的文章我们多次讲到 Class 对象需要分配入 JVM 内存,并在 JVM 内存中执行 Java 代码,完成对象内存的分配.执行.回收等操作,因此,如今让我们来走 ...

  7. [转帖]JVM总结--JVM体系结构

    JVM总结--JVM体系结构 https://blog.csdn.net/samjustin1/article/details/52215274 需要不断的学习才可以. 2016年08月15日 22: ...

  8. JVM之JVM的体系结构

    一.JDK的组成 JDK:JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品.JDK中包含JRE(在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin ...

  9. JVM解毒——JVM与Java体系结构

    你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重 ...

  10. [译]深入理解JVM Understanding JVM Internals

    转载: 英文原版地址:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/ 翻不了墙的可以看这个英文版:https: ...

随机推荐

  1. 第2-3-4章 上传附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

    目录 5.3 接口开发-上传附件 5.3.1 接口文档 5.3.2 代码实现 5.3.3 接口测试 5.3 接口开发-上传附件 第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令 第 ...

  2. ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置

    ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置 操作系统:Ubuntu 18.04 虚幻引擎:4.26.2 目录 ROSIn ...

  3. zabbix6.0安装

    一.简述 zabbix6.0 对相关软件版本要求较高,需要php7.25以上php8.0以下版本支持,若使用mysql数据库,其最低要求为mysql8.0,本此搭建采用的是使用较广的lnmp架构 za ...

  4. 【Serverless】Unity快速集成认证服务实现邮件登录

    ​概述: 认证服务可以为您的应用快速构建安全可靠的用户认证系统,您只需在应用中访问认证服务的相关能力,而不需要关心云侧的设施和实现. 本次将带来如何使用Unity编辑器快速集成认证服务SDK并实现邮箱 ...

  5. 线性时间选择(含平均情况O(n)和最坏情况O(n)算法)

    前言 本篇文章我将介绍 期望为线性时间 的选择算法和 最坏情况为线性时间 的选择算法,即分别为 平均情况下时间复杂度为O(n) 和 最坏情况下时间复杂度为O(n) 的线性时间选择.以下包含了我自己的全 ...

  6. 第2-4-5章 规则引擎Drools高级语法-业务规则管理系统-组件化-中台

    目录 6. Drools高级语法 6.1 global全局变量 6.2 query查询 6.3 function函数 6.4 LHS加强 6.4.1 复合值限制in/not in 6.4.2 条件元素 ...

  7. 螺旋矩阵II-LeetCode59 考验代码能力

    力扣链接:https://leetcode.cn/problems/spiral-matrix-ii/ 题目 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的  ...

  8. 【java】【File】用File相关类写一个小工具,完成从指定目录下抽取指定文件并复制到新路径下完成重命名的功能

    今日份代码: import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.io.*; i ...

  9. 提高python异步效率

    uvloop #Python标准库中提供了asyncio模块,用于支持基于协程的异步编程. #uvloop是 asyncio 中的事件循环的替代方案,替换后可以使得asyncio性能提高.事实上,uv ...

  10. Ubuntu20.04 Java相关环境(JDK、Mysql、Redis、nacos、influxdb)部署以及运行

    重装了系统,系统版本号为:Ubuntu20.04 1.云平台 登录云平台,选择要重装的服务器,关机.一键重装即可 2.安装jdk 下载jdk-8u341-linux-x64.tar.gz,并复制到服务 ...