java学习笔记(java语法+jvm,springboot先不学)

一、语法(参考博客:Java入门级基础教学(史上最详细的整合)

javac Hellow.java 来执行文件会生成一个class文件,接着执行java Hellow来执行编译文件就会自动的打印输出Hello word!

1.编译型:直接编译成系统可以理解的语言,执行速度会更快。
2.解释型:把机器不懂的地方进行解释从而来进行执行。

Java编译器将准备好的源文件编译成了class文件,真正被执行的应该是class文件。此时将class文件放入到类加载器,放在Jvm中进行。“字节码”校验器来进行代码的校验,校验完成若没有了错误,解释器便开始工作将我们的程序解释给操作系统。

感悟:看了java的语法后发现java的语法和c++好像啊!!!

在这里插入图片描述

继承的关键字:extends。
interface用implement,是接口实现而不是类继承。

修饰符的级别:public > protected > default(或者是不写)> private
default:一个包内可以访问,如果不在一个包内,即使是继承关系,子类也无法访问父类。

super.字段和 this.字段可区分子类中的两个一样的字段,一个是父类的,一个是自己的。

instanceof用法:
Object object = new Student() ;
System.out.println(object instanceof Student); // true

异常处理:尽量添加finally语句块去释放占用的资源,finally和golang的defer很像。

二、jvm (参考博客 一篇文章掌握整个JVM,JVM超详细解析!!!)

在这里插入图片描述

方法区是所有线程共享的内存区域,它用于存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

程序计数器可以看作是:保存当前线程所正在执行的字节码指令的地址(行号),为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。

在这里插入图片描述

虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧。

栈指向堆是什么意思?
栈指向堆是什么意思,就是栈中要使用成员变量怎么办,栈中不会存储成员变量,只会存储一个应用地址。

本地方法栈很好理解,和栈很像,只不过方法上带了native关键字的,native关键字的方法是看不到的,必须要去oracle官网去下载才可以看的到,而且native关键字修饰的大部分源码都是C和C++的代码。同理可得,本地方法栈中就是类似C和C++的代码,这些函数为虚拟机的执行进行服务。

GC:GC是不定时去堆内存中清理不可达对象。
System.gc(); // 手动回收垃圾
finalize()方法是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法,finalize()方法是在垃圾收集器删除对象之前对这个对象调用的方法,比如我可以在这个方法里面加个打印信息,打印这个对象要无了。

新生代、老年代、永久代(方法区)的区别:
在Java中,堆被划分成两个不同的区域:新生代、老年代。
老年代就一个区域。新生代分为三个区域:Eden、From Survivor、To Survivor。
默认的,新生代与老年代的比例的值为 1:2 
默认的,Edem : From Survivor : To Survivor = 8 : 1 : 1
JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。
永久代就是JVM的方法区。在这里都是放着一些被虚拟机加载的类信息,静态变量,常量等数据。

新生代中,每次垃圾收集时都发现大批对象死去,只有少量对象存活,便采用了复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
而老年代中因为对象存活率高,就采用“标记-清理”或“标记-整理”算法。

数据会首先分配到Eden区当中(当然也有特殊情况,如果是大对象那么会直接放入到老年代(大对象是指需要大量连续内存空间的java对象)。当Eden没有足够空间的时候就会触发jvm发起一次Minor GC。如果对象经过一次Minor-GC还存活,并且又能被Survivor空间接受,那么将被移动到Survivor空间当中。并将其年龄设为1,对象在Survivor每熬过一次Minor GC,年龄就加1,当年龄达到一定的程度(默认为15)时,就会被晋升到老年代。

Minor GC是新生代GC,指的是发生在新生代的垃圾收集动作。
Major GC是老年代GC,指的是发生在老年代的GC,通常执行Major GC会连着Minor GC一起执行。Major GC的速度要比Minor GC慢的多。
Full GC是清理整个堆空间,包括年轻代和老年代。

Major GC和Full GC 触发条件一般为:Major GC通常是跟full GC是等价的
每次晋升到老年代的对象平均大小>老年代剩余空间,永久代空间不足,执行System.gc(),堆内存分配很大的对象。

引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。至少主流的Java虚拟机里面都没有选用引用计数算法。

什么是引用计数法:每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,计数器为0就代表该对象死亡。但它很难解决对象之间相互循环引用的问题。
例如:

public class Test {
	public Object object = null;
	public static void main(String[] args) {
		Test a = new Test();
		Test b = new Test();
		/**
		 * 循环引用,此时引用计数器法失效
		 */
		a.object = b;
		b.object = a;

		a = null;
		b = null;
	}
}

可达性分析法:
该种方法是从GC Roots开始向下搜索,搜索所走过的路径为引用链。当一个对象到GC Roots没用任何引用链时,则证明此对象是不可用的,表示可以回收。

在这里插入图片描述

上图中Object1、Object2、Object3、Object4、Object5到GC Roots是可达的
Object6、Object7、Object8虽然是互相关联的,但是它们到GC Roots是不可达的
可以作为GC Roots 的对象:
1、虚拟机栈中引用的对象;
2、方法区中类静态引用的对象;
3、方法区中常量引用的对象;
4、本地方法栈中Native方法引用的对象。
可达性算法可解决循环引用问题,这是目前主流的虚拟机都是采用的算法。

标记–清除算法
为每个对象存储一个标记位,记录对象的状态(活着/死亡)。
分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。
回收时,应用需要挂起,也就是stop the world,且会造成内存碎片。

标记–整理算法
在标记清除算法之上解决内存碎片化,不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。

复制算法
该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成长是自己的事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值