Fork me on GitHub

java内存gc相关复习

java内存gc相关复习

##平台无关性

jvm如何加载一个.class 文件的, classloader -》runtime data area -〉execution engine -》native interface

java 反射机制是 在运行状态中,对于任意一个类都能知道这个类的所有属性和方法,对于任意一个对象都能任意调用它的方法和属性;这种能力称 java 反射机制。

classforname();获取实例 , method 或者方法,invoke 进行调用。setacessiable 为true

bootstrapclassloader extclassloader appclassloader

##为什么有双亲委派机制?

​ 避免同一个class被多次加载,如果一个class 被加载是需要先去查询父类加载器是否已经加载,如加载直接返回。

class.forname 是完成初始化的

classloader.loadclass 为未完成初始化的

元空间metaspace 和 永久代区别 都属于 方法区,jdk8 之后元空间代替了永久代,元空间使用本地内存,永久代使用jvm内存。

metaspace优势于永久代的几点:

  1. 字符串常量池存储在永久代中容易出现性能问题和内存溢出
    1. 类的方法和信息大小难易确认给永久代带来困难
    2. 永久代给gc 带来复杂度提升
    3. hotspot 和 jrockit 可能要合并

      有哪些会触发类初始化?

  • 当虚拟机启动,初始化用户指定的主类.
  • new 操作实例化目标类 会触发类的初始化
  • 静态方法的调用,触发方法所在的静态类
  • 静态变量引用,触发静态变量所在的静态类
  • 如果接口 定义了default 方法,那么直接实现或者间接实现接口类的初始化,会触发初始化接口.
  • 使用反射API 对应某类调用时,会触发该类的初始化操作.

##java堆

对象实例的分配区域,堆可以是物理不连续的空间,但是逻辑上是连续的空间

jvm三大调优参数

-Xms 堆初始大小

-Xmx 堆能达到的最大值

-Xss 规定每个虚拟机栈的大小(堆栈)

##java内存中堆和栈的区别-内存分配的策略

​ 静态存储:编译时确定每个数据目标在运行时的存储空间

​ 栈式存储:数据区在编译时未知,运行时模块入口前确认

​ 堆式存储:编译时或运行时模块前都无法确认,动态分配

联系 :引用对象、数组时,栈里定义变量保存堆中目标的首地址。

例如调用Person p = new Person 这个对象时,在栈中存储p这个变量,这个变量的引用地址为堆中这个对象的指针。

栈是自动释放,堆需要gc回收

空间大小栈比堆小

栈碎片小于堆

分配方式堆只有动态分配,栈可以是静态和动态

栈的效率比堆高

jdk 6 和jdk6+ 之后 string 的intern 方法区别?

​ 6+以后不仅仅在字符串常量池中创建对象,而且还会在堆中创建一份。

## 垃圾回收机制

判断对象是否进行引用了

引用计数法,可达分析算法

可做为gc Root对象

  • 虚拟机栈中引用的对象
  • 方法区中常量引用的对象
  • 方法区中静态变量引用的对象
  • 本地方法栈中jni引用的对象
  • 活跃线程引用的对象

垃圾回收的算法

标记-清除

  • 从根集合进行扫描,对存活对象进行标记
  • 对堆内存进行线性遍历,回收不可达的对象
  • 碎片化严重,后续如果遇到大对象需要连续内存则触发垃圾回收

复制算法

  • 分二块区域,存活的对象复制到to区域,之后from区域全部清除,适合生命周期短的对象。年轻代算法。

标记-整理

  • 从根集合进行扫描,对存活对象进行标记
  • 移动所有存活对象且按照内存地址一次排序,然后将内存地址末端进行回收。

分代垃圾回收算法

  • 针对不同的区域进行不同的垃圾回收机制,年轻代用复制算法,老年代和永久代用标记整理或者标记清除算法,1.8以后没有永久代。

Eden survivors 区 比例8:1:1 young占1/3 堆内存 ,老年代2/3 内存

  • -XX:MaxTenuringThreshold 参数是经过多少次minor gc 进入 老年代。 默认值15次
  • -XX:pertennuerSizeThreshold 控制大对象的大小
  • -XX:survivorRatio eden和survivor 的比值 默认8:1:1
  • -XX:NewRatio 年轻代和老年代比值 。2

触发full gc 条件

  • 老年代空间不足
  • 7之前版本 永久代空间不足
  • minor gc 晋升到老年代的空间大于老年代的剩余空间
  • rmi 来进行rpc的java应用默认会一个小时执行一次full gc

垃圾收集器

-XX:UseParNewGC 这个是减少时间停顿 多线程手机其他serial 收集器一样,复制算法 能于cms 一起配合工作

年轻代使用的垃圾收集器 默认是吞吐量-XX:UseParallelGC

CMS -XX: UseconcMarkSweepGC 标记清除 减少停顿

初始标记,并发标记,重新标记,清除。会有stop the world 空间碎片问题

-XX:UseG1GC 用于年轻和老年代的垃圾回收器 复制+标记-整理

将整个堆划分成独立多个region区域

强引用,软引用,弱引用,虚引用

强引用必须收到设置为null,并且jvm认可抛出oom也不会回收的对象

软引用 高速缓存,没有足够空间是垃圾回收 softReference

虚引用,

本文欢迎转载,但是希望注明出处并给出原文链接。 如果你有任何疑问,欢迎在下方评论区留言,我会尽快答复。 如果你喜欢或者不喜欢这篇文章,欢迎你发邮件到 alonecong@126.com 告诉我你的想法,你的建议对我非常重要。

------ 本文结束感谢您的阅读! ------
0%