面向对象的内存分析
栈的特点:
1.栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧
2.jvm为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量)
3.栈属于进程私有
4.先进后出
5.栈是由系统自动分配,速度快,是一个连续的内存空间
堆的特点:
1.堆用于储存创建好的对象和数组
2.JVM只有一个堆,被所有线程共享
3.对是一个不连续的内存空间,分配灵活,速度慢
方法区的特点:
方法区可视作特殊的堆,但其中储存的数据一般不会变,例如类的信息
class Person{
String name;
int age;
public void show(){
System.out.println("姓名"+name+"\t年龄"+age);
}
/*Person(String _name,int _age){
System.out.println("姓名"+_name+"年龄"+_age);
}
*/
}
public class project_03 {
public static void main(String[] args) {
Person p1=new Person();
p1.name="星空辰梦";
p1.age=16;
p1.show();
}
}
分代垃圾回收机制:
1年轻代
Eden,Servivor,当年轻代区域存放满对象后,就将对象存放到年老代区域
(经历N次,默认15次,垃圾回收后仍然存活的对象,会被放到年老代中)
2年老代
年老代对象太多后就需要启动Major GC和Full GC(全量回收)来大扫除,全面清理年轻代区域和年老代区域
3永久代
随时出现,只要出现就与java虚拟机共存亡,jdk8后使用metaspace元数据空间和堆替代
Minor GC:清理年轻代区域,Eden区满了就会触发,将有用的对象复制到Survivor1和SURvivor2中
Major GC:清理年老代区域
Full GC:清理年轻代,年老代区域,成本较高,会对系统性能产生影响
JVM调优:很大一部分工作是对于Full GC的
this的本质就是"创建好的对象的地址“
public class project_03 {
int id;
String name;
String pwd;
static String company="张三";
public project_03(int id, String name){
this.id=id;
this.name=name;
}
public project_03(int id,String name,String pwd){
this(id,name);//使用this调用别的构造器,并且必须位于第一句
this.pwd=pwd;
}
public static void pc(){
System.out.println(company);
}
public void login(){
System.out.println(this.name);
System.out.println(company);
project_03.pc();//对象可以调用company(proje_03类)
}
public static void main(String[] aegs){
project_03 p1=new project_03(18,"法外狂徒");
p1.login();
project_03.company="fuck狂徒";
project_03.pc();
}
}
this的解释:this.id
{1.main方法开始,然后p1创建,方法区中project_03类创建,堆中project_03出现,地址为0x11}
this.id即为0x11.id
this不能用于static方法中
static声明的成员变量为静态成员变量,也称为类变量,类变量的生命周期与类相同,在整个应用程序执行期间都有效