网站建设项目延期验收申请,潍坊建公司网站,虚拟主机的优点,电影网页制作模板四种加载器
1.启动类加载器
2.拓展类加载器
3.应用程序加载器
4.自定义加载器 沙箱机制
就是为了保证安全#xff0c;增加的一些权限。
native方法区#xff08;静态变量#xff0c;常量#xff0c;类信息#xff08;构造方法#xff0c;接口定义#xff09;… 四种加载器
1.启动类加载器
2.拓展类加载器
3.应用程序加载器
4.自定义加载器 沙箱机制
就是为了保证安全增加的一些权限。
native方法区静态变量常量类信息构造方法接口定义运行时的常量池
1.凡是带了native的关键字说明java的作用范围达不到了会去底层调用C语言的库。
2.会进入本地方法栈
3.调用本地方法本地接口 JNI
4.JNI作用会拓展java的使用融合不同的编程语言为Java使用 最初是C C
java诞生的时候C C横行 想要立足必须要有调用 C C的方法
5.它在内存区专门开辟了一个空间 Native Method Stack 来标记native方法
6.在最终执行的时候加载本地方法库中方法通过JNI
堆重点
一个jvm只有一个堆堆的大小可以调节 一般 类方法常量变量 保存我们所有引用类型的真实对象
堆内存还分为3个区域;
新生区
老年区
永久区 用来存在JDK字自身携带的Class对象。interface元数据存储的是java运行时的一些环境或者类信息。
GC垃圾回收主要是在新生区和老年区
在JDK1.8之后 永久区改为元空间 方法区在元空间中 常量池在方法区中
元空间只在逻辑上存在物理上是不存在的。 如果出现OOM 堆内存溢出 怎么解决
1.尝试扩大内存看结果
2.分析内存看下哪个地方出现了问题死循环递归调用之类的
GC
什么是GC root
JVM在垃圾回收的时候需要找到“垃圾”对象也就是没有被引用的对象但是直接找垃圾对象是比较耗时间的所以反过来找先找非垃圾对象也就是正常的对象那么就要从某些“根”去找根据这些根的引用路径找到正常的对象而这些根有个特征就是它会引用其他的对象而不会被其他的对象引用例如栈中的本地变量方法区的静态变量本地方法栈的变量正在运行的线程等都可以作为GC root
jvm在进行垃圾回收的时候并不是对这三个区域统一回收。大部分的时候回收的都是新生代
三个区域进行垃圾回收
新生代
幸存区
老年区
GC 分为两种 轻GC(普通的GC)重GC(全局的GC)
GC题目
JVM内存模型和分区~详细到每个区都放什么看上面的图片
堆里面的分区有哪些 Edenformtoold说说他们的特点
GC的算法? 标记-清除法标记整理复制算法引用计数法不常用 这些怎么用的?下面有详细的工作原理介绍
轻GC和重GC分别在什么时候发生
轻GC是在新生区、存活区进行发生的。
重GC是在新生区、存活区、老年区进行发生的。
复制算法
新生区 幸存区from幸存区to8:1:1 原理就是在新生区产生的内存放在幸存区from中然后两个幸存区 谁的空间是空的 谁就是to区 在内存不断的生成中两个幸存区来回交换即最终保留一个to区 也就是空的另外一个from存放的就是活下来的数据。
好处没有内存的碎片
坏处浪费了内存的空间多了一半空间永远是空的to区
试用的场景对象存活度较低的时候新生区
标记-清除算法
好处不需要额外的空间。
坏处两次扫描严重浪费时间会产生内存碎片。
试用的场景对象存活度较低的时候新生区
JVM1.7和1.8java虚拟机发生了哪些变化
1.7中存在永久代1.8改为元空间元空间所占的内存不是虚拟机内部而是本地内存空间不管是永久代还是元空间他们都是方法的具体实现之所以元空间所占的内存改为本地内存官方的说法是为了和JRockit统一不过还有其他的一些原因比如方法区所存储的类信息通常是比较难确定的所以对于方法区的大小是很难确定的太小了容易出现方法区的溢出太大了又会占用虚拟机更多的 空间而转移到本地则不会影响虚拟机所占的内存。
总结
内存效率复制算法标记清除算法标记整理压缩算法 说白了 就是比较 时间复杂度
内存整齐度复制算法标记整理压缩算法 标记清除算法 说白了 就是比较 内存连不连续
内存利用率标记清除算法 标记整理压缩算法 复制算法
没有最优的算法只有最合适的算法------GC:分代收集算法
年轻代
存活率低
复制算法
老年代
区域大存活率
标记清除内存碎片不是很多标记压缩整理 混合实现
判断 对象是否存活
引用计数法---------每当有一个地方引用它时计数器值就加1当索引失效时计数器就减1任何时刻计数器为0的对象就不可能再被使用。
可达性分析算法---------这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点从这些节点开始向下搜索搜索走过的路径称为引用链当一个对象到GC Roots没有任何引用链相连时按照图说的话就是从GC Roots到这个对象不可达则证明这个对象是不可用的如下图obj5、obj6、obj7、虽然互相有关联但是都是GC Roots是不可达的所以他们将被判定为可回收的对象。 垃圾回收算法
标记-清除算法Mark-Sweep---最基础的算法分为两个阶段标注和清除标注阶段标出所有需要清除的对象清除阶段会回收被标记对象所占用的空间 复制算法---为了解决Mark-Sweep算法内存碎片化的缺陷而被提出的算法。将内存容量将内存划分为等大小的两块。每次只使用其中一块当这一块内存满后将尚存活的对象复制到另一块上去把已经使用的内存清掉如图 标记-整理算法(Mark-Compact) -------结合了以上的两个算法为了避免缺陷而提出。标记阶段和Mark-Sweep算法相同标记后不是清理对象而是将存
活对象移向内存的另一端。然后清除边界外的对象。如图
分代收集算法(Generational Collection)重要
分代收集算法是目前大部分JVM所采用的算法其核心思想是根据对象存活的不同生命周期将内存划分为不同的域一般情况下将GC堆划分为老年代和新生代。 老年代的特点就是在垃圾回收时只有少量的对象需要被回收。
新生代的特点就是在回收时都有大量垃圾需要被回收因此可以根据不同的区域选择不同的算法。
目前大部分的jvm的GC对于新生代都采用Copying算法因为新生代中每次垃圾回收都要回收大部分对象即要复制的操作比较少当通常不是按照11划分新生代。一般将新生代划分为一块较大的Eden空间和两个较小的Suivior空间每次使用Eden空间和其中的一块Survivor空间当进行回收时将该两块空间中还存活的对象复制到另一块Survivor空间中。