JVM探究

JVM探究

  1. 对JVM的了解(虚拟机)

    Java → Class文件 → JVM

    OOM:内存溢出

    Stack Overflow:栈溢出

    双亲委派机制:保证安全

    如果包名,方法名一样(和API里面的方法toString重名) 执行会向上找 ,只有BOOT,EXC都没有才执行APP里方法

    APP当前应用程序 → EXC扩展加载器 →BOOT根加载器(最终执行)向上委托

    截图

  2. Native:凡是带了native关键字,说明Java的作用范围达不到了,回去调用底层C预言的库.

    会进入本地方法栈

    调用本地方法本地接口 JNI (java native interface)

    JNI作用:扩展java的使用,融合不同的语言为java所用

    方法区:static , final , Class , 常量池 ~

  3. 栈:数据结构

    程序=框架+业务逻辑 (SSH→SSM→Spring BOOT→Spring Cloud)

    程序=数据结构+算法 (持续学习,吃不了学习的苦,吃生活的苦)

    栈:先进后出,后进先出 (桶)

    队列:先进先出 (管道) (FIFO:First Input First Output)

    栈内存:8大基本类型+对象引用+实例的方法

  4. 堆 Heap (存放:类,方法,常量,变量 ~ 保存所有引用类型的真实对象)

    Heap 一个JVM只有一个堆内存,堆内存的大小是可以调节的

    堆内存中还要细分三个区域:

    ​ 新生区 (伊甸园区) Young/NEW

    ​ 养老区 old

    ​ 永久区 Perm 不存在GC回收,关闭JVM虚拟机就会释放这个区域的内存

    GC 垃圾回收, 主要是在伊甸园区和养老区 ~

    OOM :内存满了,内存不够 OutOfMemoryError

    解决方式:1,尝试扩大内存看结果 (-Xms1024m -Xmx1024m -XX:+PrintGCDetails)

    2,分析内存,看一下那个地方出现了问题(内存快照分析工具 Eclipse插件:MAT IDEA插件:Jprofiler)

    JDK8以后把永久区改名为 元空间 (逻辑上存在,物理上不存在 ,计算内存 Young+old=Total Memory)

    两种GC: Full GC 重GC 清理Young + old 轻GC 清理Young区

    默认情况下:分配的总内存是电脑内存的1/4 ,而初始化的内存 1/64

    MAT , Jprofiler 作用:

    ​ 分析Dump内存文件,快速定位内存泄漏

    ​ 获得堆中的数据

    ​ 获得大的对象

    ​ OOM用Jprofiler定位错误,先安装Jprofiler,在Ideal中Seting,在Edit Configuration中Dump出文件

    ​ 把Dump出的文件用Jprofiler分析,分析线程可以定位到错误代码行

    (-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError)

    GC的算法有哪些:标记清除法,标记压缩,复制算法,引用计数器,

    没有最好的算法,只有最合适的算法 --> GC : 分代收集算法

JMM : Java内存模型 Java Memory Mode

​ 作用: 缓存一致性协议,用于定义数据读写的规则(遵守)

​ JMM定义了线程工作内存和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中

​ 每个线程都有一个私有的本地内存 (Local Memory)

​ 解决共享对象可见性这个问题 : volilate : 多线程Local中写完后立马保存到主内存

posted @ 2021-07-07 18:19  DingGuo  阅读(31)  评论(0编辑  收藏  举报