jvm虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统,是物理机的软件实现。
类的加载过程
编译加载图如下:
jvm和java无关。 jvm只执行class文件。
jvm是一种规范。
什么是垃圾
c语言申请内存:malloc free
c++:new delete
java: new申请 自动回收
自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现下面错误:
1、忘记回收
2、多次回收
没有任何引用指向的一个对象或者多个对象(循环引用)的对象,被定义为垃圾。
如何定位垃圾
1、引用计数 (不能解决循环引用问题)
对象被一次引用以后计数+1,多次引用依次递加。找到引用次数为0的对象被定义为垃圾对象。
2、根可达算法
通过主线程main, 找到被new的对象 静态变量 常量池 jni指针引用的变量为根对象 如果根对象找不到的对象,被定义为垃圾
常见的垃圾回收算法
1、标记清除
找到垃圾以后,将内存区域标记修改成非垃圾区域,位置不连续,产生碎片。
2、拷贝算法
将内存空间切割成两部分,比如A空间,B空间。需要清理空间的时候,将A的有用数据复制到B空间,然后直接清理A空间数据。下次分配数据的时候将数据分配到A空间。
优点:没有碎片,浪费空间。缺点:非常浪费空间。
3、标记压缩算法
找到垃圾以后,将垃圾标记清除的同时,将有用内存进行排成序整理。
优点:没有碎片,空间利用率高。缺点:效率偏低。
JVM分代模型
1、部分垃圾回收器使用的模型
new -young 新生代
新生代=eden区+2个survivor区
新生代满了以后触发MinorGC=YGC
YGC回收之后,大多数对象都会被回收,活着的对象进入survivor1
再次YGC以后,活着的对象eden+survivor1->survivor2
再次YGC以后,活着的对象eden+survivor2->survivor1
年龄足够->进入老年代(15岁,每次YGC加1岁)
old 老年代
存储一些顽固分子,大对象或者15岁以上的对象
老年代满了会触发MajorGc=FGC
尽量减少FGC,因为它回收对象的时候,会将所有内存空间进行清理,并进行一次整理。
永久代(1.7)/元数据区(1.8)metaspace
永久代和元数据作用:装Class对象
永久代:必须指定大小限制;元数据区:可以设置也可以不设置,无上限(受限于物理内存)
字符串常量1.7存在永久代,1.8以后存在堆内存中
methidArea逻辑概念-永久代、元数据