JVM
2020-11-21 14:45:41 43 举报
jvm
作者其他创作
大纲/内容
引用计数法
Car car2
老年代
对象在jvm中被实例化分配内存的过程
一次Gc后
Class 内容区
jdk1.8 元空间又称为非堆逻辑上存在,物理上不存在
加载,初始化
To
类加载器Class Loader
Car car3
javac
本地方法接口
getClassLoader
Person person
对象nm:计数器所记的数
本地方法栈Native Method Stack
3.在堆中分配内存
heap 堆
栈 stack 储存对象的引用地址堆 heap 储存对象的实例
JVM
Class File.class
public Class Person{String name;int age;String sex;void sing(){System.out.println(\"这是一个成员方法\");}public static void mai(String [] args){person.sing();}}
Person //类//成员变量 String nameint ageString sex = \"男\"//成员方法String sing()
程序计数器
\"男\"
多适用于新生代
两次扫描这些对象:对活着对象进行标记
stack 栈
对象4(0)
From
堆 heap 的 内部结构
常量池
互相交替变化
对象
main()
运行时数据区(Runtime Data Area)
一次GC
字符串常量池
地址引用
main ()
幸存0区(ServivoFrom)
优点:不需要额外的空间! 缺点:两次扫描,严重浪费时间,会产生内存碎片。内存碎片碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提前触发一次垃圾收集
ClassLoader
幸存1区(ServivoTo)
getClass
因此谁空谁是to
实例化 new
方法区
person.sing()
2.开辟空间
Class car
new Person() //实例//成员变量 String nameint ageString sex = \"男\"//成员方法String sing()
Car.java
老年代(元空间)
4.成员变量初始化
new Person()
Eden区
1.加载类
简单类对象的实例化过程1、在方法区加载类; 2、在栈内存申请空间,声明Person对象 person; 3、在堆内存中开辟空间,分配对象地址; 4、在对象空间中,对对象的属性进行默认初始化,类成员变量显示初始化; 5、构造方法进栈,进行初始化; 6、初始化完成后,将堆内存中的地址赋给引用变量,构造方法出栈;子类对象的实例化过程 1、在方法区先加载父类,再加载子类; 2、在栈中申请空间,声明Person对象 person; 3、在堆内存中开辟空间,分配对象地址; 4、在对象空间中,对对象的属性(包括父类的属性)进行默认初始化; 5、子类构造方法进栈; 6、显示初始化父类的属性; 7、父类构造方法进栈,执行完毕出栈; 8、显示初始化子类的属性; 9、初始化完毕后,将堆内存中的地址值赋给引用变量P,子类构造方法出栈;
对象2(0)
执行引擎
持久带/元空间(perm)
优化,在标记清除之后进行标记整理
jvm 内存模型
5.构造方法进栈
静态区
堆heap
对象1(1)
Person person = new Person();
复制算法
计数器本身也有内存消耗jvm中使用较少
Class FileCar.class
对象3(2)
清除:对没有标记的对象,进行清除
伊甸园区 (Eden)
本地方法库
标记清除-整理算法
方法区Method Area
复制算法+标记清除算法+标记整理算法 分代收集算法原理:根据对象存活的周期的不同将内存划分为几块,然后再选择合适的收集算法。一般是把java堆分成新生代和老年代,这样就可以根据各个年待的特点采用最适合的收集算法。在新生代中,每次垃圾收集都会有大量的对象死去,只有少量存活,所以选用复制算法。老年代因为对象存活率高,没有额外空间对他进行分配担保,所以一般采用标记整理或者标记清除算法进行回收。年轻代:存活率低 ==>复制算法老年代: 区域大 存活率高 ==> 标记清除+标记整理实现
栈Stack
.java
. . .
Car car1
0 条评论
下一页