java中的堆栈

本篇博客是听尚学堂高淇老师讲课所做笔记,如需转载请注明出处!

java虚拟机内存分为:堆(heap)、栈(stack)、方法区(method area)


:方法执行的内存模型(属于线程私有,不属于线程共享)
    特点:先进后出,后进先出(和子弹夹一样),栈存储局部变量。栈由系统自动分配,速度快!栈是一个连续的内存空间


:存放创建好的对象和数组(数组也是对象)(new出来的对象存放在堆中)
    JVM中只有一个堆空间,它被所有线程共享
    堆是一个不连续的内存空间,分配灵活,速度慢!

方法区:(静态区)
    jvm只有一个方法区,被所有线程所共享
    方法区其实也是堆,只是用于存储 类、常量 相关的信息
    用来存放程序中永远是不变或者唯一的内容(类信息【class对象】、静态变量、字符串常量等)

java中的堆栈_第1张图片


构造器:
    1、要通过new关键字调用
    2、构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值
    3、如果没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加
    4、构造器的方法名必须和类名保持一致!

 

垃圾回收器(GC)
    回收过程:1.发现无用的对象
          2.回收无用的对象
    垃圾回收相关算法:1.引用计数法:堆中每个对象被引用一次,计数加1,被应用变量值变为null,计数减1,直到计数为0,则变成无用对象。优点:算法简单;缺点“循环引用的无用对象无法识别(比如两个对象一直互相引用)”  
              2.引用可达法(根搜索算法):程序把所有的引用关系看成是一张图,从一个节点的GC ROOT 开始,寻找对应的引用节点,然后找这个对应节点的引用节点,一直继续下去,当所有节点都被寻找到,剩余的节点则是没有被引用到的无用节点。

分代垃圾回收机制
        由于不同的对象的生命周期不同,因此不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。我们将对象分为三种状态:年轻态、年老态和持久态。JVM将堆内存划分为Eden、Survivor和Tenured/Old空间。

java中的堆栈_第2张图片

垃圾回收过程:
1.新建的对象大多放在Eden中;
2.当Eden满了不能再创建新对象,则触发垃圾回收(GC),将无用对象清理,然后将有用对象复制到survivor1区中,同时清空Eden区
3.当Eden再次满了,将s1中不能清空的对象复制到s2区,同时将Eden中不能清空的对象也复制到s1中,保证Eden和s1均被清空
4.重复多次(默认15次)survivor中没有被清理的对象,则会复制到老年代Old区中
5.当Old区满了,则会触发一个一次完整的垃圾回收(FullGC),之前的新生代垃圾回收成为(MinorGC)

 

 

JVM调优:主要是针对fullGC。导致fullGC的原因有以下四点:
    1.年老代被写满
    2.持久代被写满
    3.System.gc()被显式调用(程序建议启动gc,该方法只是通知JVM,并不是运行垃圾回收器。尽量少用,申请启动fullGC成本高、影响系统性能)
    4.上一次GC之后heap的各域分配策略动态变化


开发中容易造成内存泄露的操作:1.创建大量无用对象;2.静态集合类的使用(例如Hashmap、vector、list等);3.各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭 ;4.监听器的使用(释放对象时没有删除对应的监听器)
要点:1.程序员无权调用垃圾回收器  2.程序员可以调用system.gc(),但不能运行垃圾回收器  3.finalize方法是java提供给程序员用来释放对象或资源的方法,但是尽量少用。

创建对象步骤:1.分配对象空间并将成员变量初始化
          2.执行属性值的显式初始化
          3.执行构造方法
          4.返回对象的地址给的相关信息

 

this关键字
    this的本质就是(创建好的对象的地址),由于在构造方法调用前,对象已创建。因此,在构造方法中也可以使用this代表当前对象。
this最常用法:
1.在程序中产生二义性之处,应用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象
2.使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句
3.this关键字不能用于static方法中

你可能感兴趣的:(java)