JVM
三种最主要的JVM:Sun公司的HotSpot(常用),BEA公司的JRockit,IBM公司的J9 VM

JRE、JVM、JDK三者的关系
JDK是Java程序员常用的开发包、目的就是用来编译和调试Java程序的。
JRE是指Java运行环境,也就是我们的写好的程序必须在JRE才能够运行。
JVM是Java虚拟机的缩写,是指负责将字节码解释成为特定的机器码进行运行,值得注意的是在运行过程中,Java源程序需要通过编译器编译为.class文件,否则JVM不认识

本地方法栈
主要作用是登记native方法,然后在execution engine执行的时候加载本地方法库
栈
栈有时我们又叫栈内存,负责Java程序的运行,它是在线程创建时创建的,所以生命周期也是和线程生命周期一致,同时消亡,线程结束了栈也就释放,特别提醒的是栈不存在垃圾回收的问题,因为线程结束栈就是释放了。平时我们写的类变量、引用类型变量、实例方法等等都是在函数的栈内存分配好
程序计数器
是指方法区中的方法字节码由引擎读取下一条指令,它是一个非常小的内存空间。为什么有这种东西呢,大家都知道每个线程都是有一个程序计数器的,是线程私有的,相当一个指针
方法区
它是指线程共享的,谁都可以共享使用,我们通常用来保存装载类的元结构信息,静态变量,常量,类信息(构造方法,接口定义),常量池
堆(heap)
它是Java虚拟机用来存储对象实例的,比我们在开发过程使用的new对象,只要通过new创建的对象的内存的对象都在堆分配,注意一点的是堆中的对象内存需要等待垃圾器(GC)进行回收,也是Java虚拟机共享区,内存调优的主要地方
gc

每创建一个对象将放入Eden区,当eden区满后,触发young GC,存活下来的对象实例全部放入from区,当from满后,再次触发young GC,有存活下来的对象将全部移至to区,from区全部清空,速度快,这时的to区变为from区,空的from区作为to区,某个对象在to区和from区转移次数达到15次(这个值可以设置)时,那么这个对象将转移至老年代。
当老年代内存满了或者发生young GC后要转移至老年代的对象内存大于老年代剩余内存时,触发full GC。(内存很大的对象将直接放入老年代)
经过15次young GC后进入老年代,
young GC时对象总内存大小大于from区的50%时也会进入老年代(动态年龄判断),
大对象直接进入老年代(参数-XX:PretenureSizeThreshold,如果一个对象内存大小大于这个值也会直接进入老年代)
在eden区发生gc后剩余对象内存大小大于from区时,直接进入老年代,
触发young GC,时间短并且不会暂停用户线程,用户无感。young GC采用复制算法。
full GC会触发STW(stop the world),java应用程序的其他所有线程都被挂起(只保留垃圾收集帮助器),清理完垃圾对象再执行线程。
对比full GC和young GC,在堆调优方面只要针对减少full GC的次数或优化full GC时长
触发full GC时,采用标记整理算法,首先是标记阶段,使用可达性分析从gc root来标记被引用的对象(使用引用计数法会导致循环引用问题),然后将被标记的对象移动到内存边界的一段,在清楚剩余的内存空间
gc算法
引用计数法
在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都为 0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。
可达性分析
为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots”对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。
要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。
标记清除算法(Mark-Sweep)
最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。(内存碎片严重)
复制算法(copying)
为了解决 Mark-Sweep 算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。
这种算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原本的一半。且存活对象增多的话,Copying 算法的效率会大大降低。
分代收集算法
分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内存划分为不同的域,一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(YoungGeneration)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。
标记整理算法(Mark-Compact)
结合了标记清除算法和复制算法两个算法,为了避免缺陷而提出。标记阶段和 Mark-Sweep 算法相同,标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。
1万+

被折叠的 条评论
为什么被折叠?



