jvm和类加载机制学习笔记

 Q.jVM内存划分(5块区域),与内存划分
1.Heap(堆):young新生代(eden,S0,S1,为了标记清除算法),old老年代(标记整理算法)

2.Metaspace(元数据区):常量池(静态变量static和常量final,public static final,枚举类型定义的类型,接口中定义的变量),方法元信息,类元信息

3.stack(栈):局部变量表,操作栈
作用:描述方法执行的内存区域,线程私有,每个方法的执行就是入栈和出栈过程 ,递归调用常出现Stack Overflow

4.Native Method Stacks 本地方法栈 
线程私有,给Native方法服务的,本地方法过多可能胡导致 Stack Overflow或者native heap OutofMemory

5.Program Counter Regiester 程序计数寄存器
作用:每个线程创建自己的栈和程序计数器,线程的执行和恢复依赖计数器,可以找到指令的偏移量


新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2
新生代eden ,servivior( s0,s1)8:1:1

-Xmx5m -Xms5m -XX:-UseGCOverheadLimit 内存设置

Q:对象的内存布局
1.对象头
2.实例数据
3.对齐填充

-XX:+PrintGCDetails 

Q.对象常见初始化,内存分配
1.对象创建和初始化过程


Q.垃圾回收,新生代对象变成老年代对象过程
创建对象 ->新生代eden区-->满了,进行YGC  -->未回收对象放入Survier的from区域--》放不下进入老年代区---》老年带FGC--》老年带满了,抛出OOM异常
                                                                            
HotSpot实现的复制算法流程如下:

 1. 当Eden区满的时候,会触发第一次Minor gc,把还活着的对象拷贝到Survivor From区;

当Eden区再次触发Minor gc的时候,会扫描Eden区和From区域,对两个区域进行垃圾回收,
经过这次回收后还存活的对象,则直接复制到To区域,并将Eden和From区域清空。

 2. 当后续Eden又发生Minor gc的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到From区域,并将Eden和To区域清空。

 3. 部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代。

Q.GC分类和策略

GC触发条件:引入GC Roots 引用链,如果对象没有跟引用链有引用关系,就会开始GC

2.可达性分析
根节点 GC Root开始,向下搜索,搜索过的路径为引用链, 当一个对象没有任何引用链和他相连,证明该对象不可用

1.标记清除算法:对每个有引用关系的对象进行标记,将没有引用关系对象进行清除
2.标记整理算法:先标记有引用关系的对象,放到内存一块连续的区域,清除区域以外的清理掉
3.标记复制(mark-copy)算法,Eden和servivor两块内存,激活或者未激活,把活的对象复制到未激活空间,标记为激活,将已激活的空间标记为未激活,释放对象,是YGC使用的算法

垃圾回收器
      新生代收集器:Serial、ParNew、Parallel Scavenge;

      老年代收集器:Serial Old、Parallel Old、CMS;

      整堆收集器:G1;

串行回收器(serial Garbage Collector),标记复制算法,主要应用在YGC,特点STW,暂停应用程序,容易产生大量碎片

并行CMS回收器(concurrent mark sweep collector),标记清除算法,之后进行碎片整理,标记清除算法,之后进行碎片整理

G1(Garbage-first Garbage Collector)回收器:采用标记复制算法 jdk1.7引入

Q.JVM运行参数
-XX: +HeapDumpOnOutOfMemory  JVM当抛出oom异常,JVM可以输出堆信息
-Xms256M -Xmx256M            JVM堆区内存大小设置,生产环境建议保持一致,防止GC后堆内存扩容回缩消耗资源
-XX:PermSize;XX:MaxPermSize:永久代在JDK8中被完全的移除了。所以永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了。

-XX:MetaspaceSize; XX:MaxMetaspaceSize 元数据区分配信息


Q。
1.jps主要用来输出JVM中运行的进程状态信息。语法格式如下
2.jstack主要用来查看某个Java进程内的线程栈信息。语法格式如下:栈溢出
3.jmap(Memory Map)和jhat(Java Heap Analysis Tool)
  jmap用来查看堆内存使用状况,一般结合jhat使用。GC算法、堆配置参数和各代中堆内存使用情况,
用jmap把进程内存使用情况dump到文件中,再用jhat分析查看
4.jstat(JVM统计监测工具)jstat -gc 23540 堆内何种空间使用统计数据

Q.类加载过程
将class加载到内存中
1.load 加载class文件,产生二进制流,创建相应的Class实例
2.link
    1)验证 final ,static 是否合规,类型是否正确
    2)准备 为静态变量分配内存,设定默认值
    3)解析 解析类和方法,类和类之间的正确引用,完成内存结构布局
3.init
初始化,赋值


Q。类加载器如果定位到具体的类进行读取(双亲委派模型)
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@27bc2616
null
1.最顶层的类加载器类Bootstrap,JVM创建,负责加载Object,String,System类 或者rt.jar
2.第二层Extension ClassLoader,加载系统扩展类 跟xml 加密 等功能类 ext/*.jar
3.第三层Application ClassLoader Class 应用加载器 classpath下面的类 

双亲委派模型流程
1)一个类与遇到能否加载某个类,会询问上层类加载器是否可以加载,
2)上层判断,我是否已经加载,没有那我能否去加载,得到的结果都为否,下层类才可以加载
3)从下往上询问是否已加载,从上往下尝试能否加载

双亲委派模型非强制,可以自己指定类加载器
1)隔离加载类,应用程序引用多个框架,发生类冲突
2) 修改类加载方式,按照摸个时间点动态加载
3) 编辑加密处理
Q. 自定义类加载
继承ClassLoader ,实现findclass方法:
    加载class文件生成字节码,将字节码生成相应的类defineClass方法
使用自定义的加载器去加载类
    Class c=myClassLoader.loadClass("com.example.demo.classtest.Test");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值