.java==>class File==>Class Loader==>
运行时数据区(RunTime Data Area)==>
方法区、Java栈、本地方法栈、堆、程序计数器<==>本地方法接口<==本地方法库
jvm调优(方法区、堆),大部分都是堆里
类加载器:加载class文件
凡是带了native关键字的说明Java的作用范围到不了了,回去底层调用C语言的库
进入本地方法栈
调用本地方法本地接口JNI Java native interface
栈--》先进后出,后进先出
队列:先进先出
栈不存在垃圾回收问题
8大基本类型+对象引用+实例的方法
栈运行原理:栈帧
一个jvm只有一个堆内存。堆内存的大小是可以调节的
gc垃圾回收主要是再伊甸园区和养老区
jdk8之后永久存储区被改成元空间
jdk1.6:永久代、常量池再方法区
1.7:永久代、慢慢退化,去永久代、常量池再堆中
1.8:无永久代、常量池再元空间
OOM:
1.尝试扩大堆内存看结果
2.分析内存看一下那个地方出了问题
jprofile、mat作用
分析dump内存文件,快速定位内存泄漏
获得堆中的数据
获得大的对象
-Xmslm -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
+PrintGCDetails 查看gc垃圾回收信息
-Xms 设置初始化内存分配大小 1/64
-Xmx 设置最大分配内存,默认1/4
GC:垃圾回收(新生区(伊甸园区、幸存一区(from)、幸存二区(to))、老年区、持久区)
方法区、堆
一般垃圾回收都是在新生区
GC两种类:轻GC(普通GC)、重GC(全局GC)
GC的常用算法:标记清除算法、标记整理算法、复制算法、分代收集算法(引用计数器)
谁空谁是to
每次GC回收,伊甸园区把活的对象移动到幸存区,伊甸园区则空
JVM老年区默认值是15次GC
复制算法:好处没有内存碎片、坏处:浪费了空间,多了一般永远是空(基本使用实在新生区)
最佳使用场景:新生区
标记清除法
标记:对活着的对象进行标记
清除:对没有标记的对象进行清除
优缺点:严重浪费时间、会产生内存碎片
优点不需要额外的空间
标记压缩
防止内存碎片产生,再次扫描,向一段移动存活的对象,多了一个移动成本
先标记清除法、再标记压缩
年轻代:存活率低---复制算法
老年代:存活率高----标记清除法+标记压缩