JVM
元空间在栈内还是栈外?
在栈外,元空间占用的是本地内存。
垃圾收集有哪些算法,各⾃的特点?
标记 - 清除算法
标记 - 整理算法
复制算法
分代收集算法:分为三代,新生代,老年代,元空间逻辑上属于堆(物理不属于上放在物理主机内存中),新生代为复制算法分为三块伊甸园、from、to为(比例8:1:1)总比1 ,new对象放伊甸园,当放不下时进行垃圾回收使用minorgc,将存对象放在from中,每次回收标记+1,再次又满了将to往from移动,标记+1,如果内存再满执行回收,在往to中移标记累计+1,当标记超过15放入老年代,老年代使用标记整理总比2,老年代满了触发fullGC全盘回收,如果还满内存溢出
虚拟机栈
每个线程运行需要的内存空间称为:虚拟机栈
每次调用方法时所占用的内存称为:栈帧
正在执行的方法称为:活动栈帧
内存溢出
虚拟机栈种,栈帧过多,如无限递归
垃圾回收器
串行:当内存不足全部停下,利用一个线程进行垃圾回收,一般示用单核cpu,合计回收最小,单次长无所谓
吞吐量优先 用户线程时间/(用户线程执行时间+垃圾收集时间),总100分钟垃圾回收1分钟吞吐量99%适合多核,
相应时间优先:边工作边边标记,一遍工作一遍清除
为什么老年代不能使用标记复制?
因为老年代保留的对象都是难以消亡的,而标记复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低,所以在老年代一般不能直接选用这种算法。
G1
可以管理超级答得内存垃圾回收
将空间分为各种格子,将新生代,老年代,自由、大对象标记出来,
内存泄漏和内存溢出有什么区别?
参考答案
内存泄漏(memory leak):内存泄漏指程序运行过程中分配内存给临时变量,用完之后却没有被GC回收,始终占用着内存,既不能被使用也不能分配给其他程序,于是就发生了内存泄漏。
内存溢出(out of memory):简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出。
避免内存泄漏的几点建议:
-
尽早释放无用对象的引用。
-
避免在循环中创建对象。
-
使用字符串处理时避免使用String,应使用StringBuffer。
-
尽量少使用静态变量,因为静态变量存放在永久代,基本不参与垃圾回收。
内存溢出的解决方案:
-
第一步,修改JVM启动参数,直接增加内存。
-
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
-
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
-
第四步,使用内存查看工具动态查看内存使用情况。