JDK1.7是通过永久代实现的方法区
JDK1.8是通过元空间实现的方法区
永久代占据的内存空间属性JVM进程空间,大小比较小
元空间占据的内存空间不属于JVM进程空间,大小由物理内存控制
存储的内容也不相同
常量池
class常量池 : 存储在class文件中
运行时常量池:存储在内存中,一个类一个池
字符串常量池:存储在内存中,全局唯一
JAVA堆
被所有线程共享,在java虚拟机启动时创建,是虚拟机管理的最大一块内存
java堆是垃圾回收的主要区域,主要采用分代回收算法
存储方式:堆内存空间在物理上可以不连续,逻辑上连续即可
堆内存的划分:
新生代
Eden空间
from survivor空间
to suivivor空间
老年代
堆大小=老年代+新生代 (比例为2:1)
通过-Xms(初始堆大小) -Xmx(最大堆大小)
方法调用和垃圾回收
JVM如何确定要去执行的方法
类名+方法名+方法描述符(参数类型和返回值类型)
启动GC日志
在JVM中配置 -XX:+PrintGC -Xloggc:/opt/logs/gc.log
-XX:+PrintGC:代表开启简单GC日志
垃圾回收:
判断算法
主要2种:引用计数法(Python)和根搜索算法(JVM)(可达性算法)
引用计数发:给对象搞一个计数器,对象引用一次,加+1,不引用,则-1,当计数器为0,就被回收
可达性算法:会经过2次标记