JVM探究
-
对JVM的了解(虚拟机)
Java → Class文件 → JVM
OOM:内存溢出
Stack Overflow:栈溢出
双亲委派机制:保证安全
如果包名,方法名一样(和API里面的方法toString重名) 执行会向上找 ,只有BOOT,EXC都没有才执行APP里方法
APP当前应用程序 → EXC扩展加载器 →BOOT根加载器(最终执行)向上委托
-
Native:凡是带了native关键字,说明Java的作用范围达不到了,回去调用底层C预言的库.
会进入本地方法栈
调用本地方法本地接口 JNI (java native interface)
JNI作用:扩展java的使用,融合不同的语言为java所用
方法区:static , final , Class , 常量池 ~
-
栈:数据结构
程序=框架+业务逻辑 (SSH→SSM→Spring BOOT→Spring Cloud)
程序=数据结构+算法 (持续学习,吃不了学习的苦,吃生活的苦)
栈:先进后出,后进先出 (桶)
队列:先进先出 (管道) (FIFO:First Input First Output)
栈内存:8大基本类型+对象引用+实例的方法
-
堆 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中写完后立马保存到主内存