jvm内存模型的理解
Java虚拟机中根据是否对线程共享将内存分为了两个部分。 可知线程是操作系统调度的基本单位。 故而任何一个操作都必包含线程私有和线程共享两部分。
线程私有:
线程私有包括两栈一器。 首先计算器,由于线程具有并发执行的能力,并且任务只在线程中执行,故而每个线程都有一个程序计数器,而且放在线程的私有空间中。负责对指令的有序执行。再说虚拟机栈,虚拟机栈直接面向Java虚拟机,处理的是Java层的方法调用逻辑,栈中的每个元素称为一个栈帧,每个栈帧包含调用方法的参数表,临时变量,方法返回的内存地址等诸多信息。 其次是本地方法栈,与虚拟机栈类似,负责的是native层本地方法的调用管理。
线程共享:
Java堆,Java堆中放置的是Java类这一个层次的变量对象,因为方法层次的变量都是存在虚拟机栈中,而类层次的变量存在被多个线程访问的可能性,所以需要放在共享区中,也就是Java堆。 方法区,方法区放置的是class这一层次的对象,如class类,此时还没有生成真正意义上的Java类,可以说是一个变成品,是classloader加载class之后的一个存放地点,此外,与class相关而与具体实例无关的静态变量,静态常量也会放在方法区之中。
执行引擎专门负责字节码的读取和处理。
GC垃圾回收器的理解
垃圾回收是JVM自动进行的行为,进行垃圾回收需要明确三个问题。
回收谁? 什么时候进行回收? 怎么回收?
第一个问题。解决回收谁的问题,一般有两种,其一是引用计数,每多一个引用,引用数+1,少一个就-1,当为0时,代表没有被使用,可以回收。另一种是可达性分析,即从GCRoot进行遍历,没有遍历到的说明没有被使用。可以回收。
第二个问题,解决什么时候回收的问题。这个问题一般是在空间不够的时候,对主线程进行暂停,然后进行回收。或者未满时一些轻量的回收。后面还会谈到。
第三个问题,解决如何回收的问题。 会使用不同的回收算法。
1.标记清除算法,遍历标记,定点清除。但是会产生内存碎片,适用于存活率比较低的情况。
2.复制算法,遍历,将存活的对象统一复制到新内存区域,原来的区域全部回收。 适用于存活率低的情况。
3.标记整理算法,遍历,将存活的对象统一向一端移动,将可用区域连成片,适用于存活率高的情况,可以避免内存碎片化。
4.分代收集法。分代收集法是对上面几种算法的有机结合,扬长避短。根据其生命周期长短,分别进入不同区域,不同区域又对应不同算法。
其分为新生代,老年代和永久代。新生代,老年代的大小比例约为1:9, 新生代存放。
网友评论