java 内存结构是逻辑存储结构,与内存模型不是一个概念
堆
由线程共享,存放 new 出来的对象,是垃圾回收器的主要工作区域。
方法区
线程共享,实际使用的是堆内存存放已被加载的类信息字符、串常量池、静态变量、即时编译器编译后的代码等信息,JDK 1.8 中方法区被元空间取代,使用直接内存。
栈
线程私有,分为 Java 虚拟机栈和本地方法栈,存放局部变量表、操作栈、动态链接、方法出口等信息,方法的执行对应着入栈到出栈的过程。
本地方法栈:native关键字,凡是被native修饰的方法,都会去调用底层的非java语言的库
程序计数器:程序执行的时候,程序计数器是有值的,其记录的是程序正在执行的字节码的地址
垃圾回收
发现无用的信息对象
回收被无用对象占用的内存空间,使空间再次可被程序使用
垃圾回收算法
垃圾回收主要发生在堆,主要是回收内存无用的对象,本质是产生连续空间供给其他对象使用
引用计数法
每一个对象都有一个引用计数器,当有引用连接到对象的时候,引用计数加一,当引用离开作用域或者被置为null的时候,引用计数减一
自适应的垃圾回收技术
停止—复制法
先暂停程序的运行,然后将所有存活的对象从当前的堆复制到另一个堆,没有被复制的全部都是垃圾,当对象被复制到新的堆的时候,它们是一个挨着一个的,所以新堆保证紧凑排列,然后就可以按照上面的方法简单的分配新的空间了
标记—清理法
从堆栈和静态存储区出发,遍历所有的引用,进而找到所有的存活的对象,每当找到一个存活的对象的时候,就会给这个对象设一个标记,在这个过程不会做任何的回收对象操作。只有全部标记完成之后,清理动作才开始,在清理的过程中,没有被标记的对象被释放,不会发生任何复制的动作,所以剩下的堆空间是不连续的。垃圾回收器要是希望得到连续的空间的话,就必须重新整理剩下的对象。
标记—整理法
和标记—清理法差不多,但是标记之后不是直接清理消亡的对象,而是让存活的对象往一边移动,然后清理掉边界之后的空间,这样操作之后,就会产生连续的堆空间。
分代算法
不同的对象生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率