我们 java 程序员从来不缺 对象 ,因为我们平时都是 面向对象开发 ,所以你要是需要, 我来帮你new一个吧 ,new一个看起来很容易,但是你知道 Java虚拟机 为我们做了什么事情吧,看看下面的内容你就懂了。
首先,先给大家看看 JVM 的简图
然后,给大家先简单介绍jvm的三个区
1. 堆区(heap):
用于存放所有对象,是 线程 共享的(注:也属于对象)
2.栈区(stack):
用于存放基本数据类型的数据和对象的引用,是线程私有的(分为虚拟机栈和本地方法栈)
3.方法区(method):
用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆即None-Heap)
4.GC
java的 垃圾回收器, 主要针对堆区
我们来看看下面的代码,以及执行的结果。
package com.example.demo;
public class Student {
private String username;
static {
System.out.println("Student");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "Student{" +
"username='" + username + ''' +
'}';
}
}
package com.example.demo.designMode;
import com.example.demo.Student;
public class TestMain {
static {
System.out.println("TestMain");
}
public static void main(String[] args) {
System.out.println("main方法");
Student student = new Student();
student.setUsername("张三");
System.out.println(student);
}
}
如上可知,jvm new了一个对象,做了如下操作:
1.将TestMain类加载到方法区,以及main方法入栈
2.将Student类加载到方法区
3.将new Student()放到堆中,开辟空间,并初始化值username=null,student变量入栈
4.对username进行赋值,username=“张三”
5.main方法出栈,GC回收