一:JVM内存的分析

java 查看jvm 内存分配 查看jvm内存对象_常量池

 

 

首先编辑java源文件 *.java,然后调用javac编译器将文件编译成.class字节码文件。

当使用到某个类时,类加载器会将字节码文件加载到内存空间中,然后分配空间,

调用Class类newInstance方法实例对象。

内存中的jvm找到程序中main函数作为入口,然后开始执行。

执行过程中的内存管理

1:寄存器:用来存储指定,例如流程控制语句,下一步应该执行那一条指令语句,就是存储

在寄存器,寄存器的空间很小。

2:栈内存:用来存放主函数中变量、局部变量、引用,主要用来存储基本数据类型的值以及引用

类型的地址,指向堆中的对象,栈的结构遵循先进先出,所以不够灵活。

3:堆内存:用来存放new出来的对象,堆相对栈比较灵活,jvm虚拟机内部维护一个垃圾回收机制,

不向C++那样需要析构函数,必须将对象销毁,垃圾回收机制会定期扫描堆,一旦发现该对象不在

被使用(栈中没有地址执行它),就会把它回收掉,来释放存储空间。

4: 常量池,常量池是从堆内存中分配出来的一小块区域,用来存储经常使用的变量,例如字符串常量,

整形-127~128,如果需要使用,首先会到常量池中寻找,如果常量池中有该对象,直接return,如果没有

创建对象,put进常量池中。

5:数据区(方法区、共享区):data segment 存放静态变量,方法

代码区:code segment:用来存放代码。 

二、对于面向对象、类、对象的理解

1.    我们知道面向过程强调的是一系列的动作,面向对象强调是是结果,例如:拿打开冰箱这件事来说,如果我们以面向过程的语言去理解的话:第一步,打开冰箱;第二步;把事物放进去;第三步,把冰箱关上。这就是面向过程,如果我们以面向对象的思想去理解的话,冰箱就是一个对象,他拥有打开,可以存放东西,关闭的方法,我只要用冰箱去调用这些方法就行了。 

class Fridge{
	
	private String brand; //品牌
	
	private double price; //价格
	
	//打开
	void open(){
		System.out.println("open");
	}
	
	//储存食物
	void depositFood(){
		System.out.println("depositFood");
	}
	
	//关闭
	void close(){
		System.out.println("close");
	}

	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}
	
}

 上面是一个冰箱的类,有品牌、价格等属性,还有打开、关闭、存储食物的行为。

public class Person {
	
	private String name;
	
	private int age;
	
	private Fridge fridge;
	
	Person(String name,int age,Fridge fridge){
		this.name=name;
		this.age=age;
		this.fridge=fridge;
	}
	
	void cook(){
		fridge.open();
		fridge.depositFood();
		fridge.close();
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public Fridge getFridge() {
		return fridge;
	}

	public void setFridge(Fridge fridge) {
		this.fridge = fridge;
	}

}

然后又创建Person这个类,这个类有姓名、年龄以及冰箱的属性,因为人如果想使用冰箱,就必须将冰箱对象注入人中。

如果人要cook,那么就要打开冰箱,拿去食物,然后关闭冰箱。 

这就是面向对象的思想,我们眼中只有一个个对象,它的功能实现与我们调用者无关,我们只要使用它们的功能就行了。

举例二:我们打开门,然后进来,把门关上,这是一个过程,而面向对象的思想就是,门是一个对象,拥有打开,关闭的方法,我们只要去调用就行了,至于如何实现,那是门的事情,与我们调用者无关。

2.类与对象,在现实生活中,存在一个个特征鲜明的个体,我们称他们为对象,就是说万事万物都是对象,张三、李四、一只狗,一只猫,它都是与众不同的,如果我们仔细观察事物,会发现,事物之间是存在共性了,张三和李四都是人,都属于人这个类,然后和一只狗之间有都是动物,在往上,和一棵树又都是生物,所以类是一个抽象的概念,它是对一些对象共性的抽取。而对象时现实生活一个个活灵活现的个体。

既然类是很多对象共性的抽取,那么某一类事物肯定又有一些属性,或者行为方式;

举例:人类,有姓名,年龄,国籍,性别,    都吃饭,走路,睡觉,说话,,等等方式,

按照类中的属性和方法对号入座填上数据,那么一个具体的对象就创建出来了 

三:几个关键字的用法

1、return  返回值类型和方法指定类型保持一致,这个值总是确定的。

return的另一个作用是结束方法的执行,对于void方法,没有返回值,不用写return,其实在方法的最后默认

会加上return。

2.this 关键字:表面上是区分成员变量和参数名重名的问题,其实this可以看做一个变量,就是当前值的调用,比如讲台上有一把椅子,它就代表this。那个老师来上课,那个老师就坐在那里,而在java中,只要有对象来调用这个函数,那么this,就代表当前调用本函数的对象。