JVM
2020-12-03 16:43:25 0 举报
JVM
作者其他创作
大纲/内容
被GC
“张三”
2、执行main()
javac
Eden
扫描这些对象,对需要存活的对象标记
程序计数器
// 成员方法(地址值)
Car.class
GC之后
引用
对象n
a=0
对象2(2)
但这个变更对运行在右边CPU中的线程不可见,因为这个更改还没有flush到主存中:要解决共享对象可见性这个问题,我们可以使用java volatile关键字或者是加锁
GC过程中
现存的对象
对象k
getClassLoader()
堆
car1
幸存区(From To)
People people
复制算法:适合新生代。将Eden和From区的对象复制到To区,然后将From区和To区交换身份,确保每次GC之后To区为空。
方法区
From
To
void sing()
Java栈Stack
类的加载、初始化
JVM调优99%都是调堆
完成之后出栈
字符串常量区
类加载器
静态区
本地方法库
car3
每个线程都有自己的工作区域,是从主内存中拷贝的,所以两者数据可能不一致,线程可以进行修改,从而导致数据不一致的问题.
引用计数法
栈
a=2
Car Class
标记清除法
Class内容区
main()
线程工作内存
5、方法调用
JVM的体系结构
对象1
Old
car2
b()
3.1 先堆中开辟空间
运行时数据区(Runtime Data Area)
被GC的对象
堆Heap
执行引擎
JMM
对象3
new People();// 成员变量String name 张三; int age 18; Double height 180.0;
car的实例
对象1(1)
3.5 初始化之之后构造函数出栈
People//类// 成员变量String name; int age; Double height; // 成员方法
JVM
a=1
People//类// 成员变量String name; int age; Double height; // 成员方法void sing()
操作系统(Windows、Linux、Mac)
JVM的位置示意图
Class File .class
1、加载类
3.3 成员变量初始化
Class Loader
...
3.2 构造方法入栈,进行初始化
类装载器Class Loader
对People对象进行赋值
Class File
JRE--JVM
new People();// 成员变量String name; int age; Double height;
简单类对象实例化在内存中的过程
1、在方法区加载类2、程序执行到 main() 方法时,main()函数方法体会进入栈区(压栈),并定义了一个指向People的变量people,在栈内存申请空间,声明People对象people3、执行new People();在堆内存开辟一片内存空间,用于存放People的实例对象,然后将成员变量和成员方法放到new实例中;4、在对象空间中,对对象的属性进行默认初始化,类成员变量显示初始化;5、构造方法入栈,进行初始化;6、初始化完成后,将堆内存中的地址赋给引用变量,构造方法出栈;7、对people对象进行赋值,先在栈区找到people,然后根据地址值找到 new People()进行赋值8、方法调用:先在栈区找到people这个引用变量,根据地址值找到 new People()进行方法体调用,调用完成之后出栈;9、main函数执行完成之后,出栈
常量池
主内存
类加载器Class Loader
复制之后发生身份转换
本地方法接口
扫描这些对象,未标记的对象进行清除
入栈
getClass()
对象3(0)
对象n(2)
不会有垃圾回收
需要给每个对象准备一个计数器,每次引用的时候都要计数加一操作繁琐,较少使用
GC回收
a()
15次GC之后
3、创建对象new People()
public class People{ String name; // 定义一个成员变量 name int age; // 成员变量 age Double height; // 成员变量 height void sing(){ System.out.println(\"人的姓名:\"+name); System.out.println(\"人的年龄:\"+age); System.out.println(\"人的身高:\"+height); } public static void main(String[] args) { String name; // 定义一个局部变量 name int age; // 局部变量 age Double height; // 局部变量 height People people = new People() ; //实例化对象people people.name = \"张三\" ; //赋值 people.age = 18; //赋值 people.height = 180.0 ; //赋值 people.sing(); //调用方法sing }}
对象2
.java
标记压缩法
方法区Method Area
GC之前
本地方法栈Native Method Stack
3.4 堆内存中的地址赋给引用变量
硬件体系(Intel、Spac……)
......
扫描这些对象,压缩:向一端移动存在的对象防止内存碎片产生
实例化new
People()
0 条评论
下一页