一:java程序启动,都是从main方法启动。main线程是普通线程。普通线程运行,jvm是不会停止的。如果有足够的权限,调用exit方法,也可以停止jvm。一台电脑可以启动多个java程序,一个java程序对应一个jvm虚拟机。
二:jvm所保存的信心全部在数据区。数据区分为五部分,1.本地方法栈(调用navicat方法存信息的栈),2.虚拟机栈(我经常说的栈),3.堆,4.方法区,5.程序计数器。直接内存不属于jvm内存(不属于数据区),它属于电脑内存,当然数据区也是属于电脑内存。每个线程都有自己的程序计数器和堆栈。一般线程共享的部分为:方法区,堆。
三:jvm执行一个方法他会创建一个栈帧,里面包含了局部变量,操作数栈,动态链接,方法出口,对象的引用。
四:介绍数据区的五个部分:
1.方法区:存储static属性,class,本地方法栈也称为永久代。这里面的数据被Gc清除的概率比较低,因为它被Gc清除的条件的比较苛刻。它需要满足3条件。a.class没有被引用创建为对象。b.class的里面方法不能被反射调用。
2:虚拟机栈:存储局部变量,对象的引用。虚拟机栈里面的数据会跟着方法的结束而销毁,所以我们一般可以在方法里面创建对象这样可以优化虚拟机的内存。
3:本地方法栈:这里一般是存储调用navicat方法而产生的数据。
4:堆:存储:成员变量。这个区域包含年轻代和老年代。在hotSpot里面年轻代包含3个区域,1.1个Eden区,2.两个Survivor区(1个:from,1个:to)。一般生成的对象会出现在Eden区,当经过一个Gc没有被清除的对象会被放到Survivor的from区。Survivor区中的from对象经常过15次还没被清除的对象会被放到老年代,当小于15次还没清除的会被放到to区,当to区里面被填满之后会全部移到老年代。
5:程序计数器:存储对象的引用的次数。
四:jvmGc算法;
1.标记清除法:标记清除法会在需要被清除的对象做一个标记,当需要被清除的对象全部被标记后就会被统一回收。缺点:效率不行。
2.复制算法:复制算法一般会将内存分为两块:假设分为:A,B两块。当A内存被用完的时候:会将A内存中还存活的对象全部复制到B内存中,然后再将A内存全部回收,然后就使用B内存。缺点:浪费内存,优点:效率高。
3.标记整理算法:标志整理算法会将存活的对象标记,然后全部往一端移动,然后将这一端界限外的内存全部回收。
4.分代收集算法:分代收集算法是将新生代和老年代全部分开收集。新生代中使用复制算法,老年代中使用标记整理算法。
在说一个例外:程序计数器算法:这个不能作为对象内存回收的方法。这个只能为被引用对象的次数。
五:程序的编译与优化
1:内联方法:将一个方法插入到另一个方法里面。
2:消除同步:在不需要同步的地方不要加同步代码。
3:标量替换:标量就是不能再被分割的变量如:一些基本类型。(聚合量:就是由一些标量组成:如数组,对象)
4:虚拟机栈里面创建对象。
六:java主内存与工作内存。
主内存:包含线程共享的变量,属于虚拟内存的一部分。
主内存和工作内存的交互流程。
java线程------------工作内存--------------save--------------主内存
load
java线程里面包含了栈里面的东西。
线程一般要读取共享变量的步骤:1.从主内存加载变量到工作内存,从工作内存读取共享变量。。
线程一般修改共享变量的步骤:1.从线程将变量刷到工作内存,再将工作内存的变量save到主内存中。
共享变量一般包含8种状态:1.lock 2.unlock 3.use 4.read 5.load 6.assign 7.write 8.store。