Jvm内存分析,有代码演示

Jvm内存包括栈内存和堆内存,

栈内存保存的是基本数据类型和对象引用。

基本数据类型包括:byte,short,int,long,Boolean,float,double

堆内存存放的是动态生成的对象和数组

1.  数组的内存存储方式

public class A {

    public static void print(int[] temp){

       for(inti:temp)

       System.out.print(i+",");

    }  

    public static void main(String[] args) {

       int[] data=new int[]{1,2,5,4};

       print(data);

      

    }

}






java 数组存储map_System

2.  

public class A {
    /**
     * 数组扩大两倍
     */
    public static void inc(int[] temp){
       for(inti=0;i<temp.length;i++){
           temp[i]=temp[i]*2;
       }
    }
    public static void print(int[] temp){
       for(inti:temp)
       System.out.print(i+",");
    }  
    public static void main(String[] args) {
       int[] data=new int[]{1,2,5,4};
       inc(data);
       print(data);
      
    }
}




执行结果是2,4,10,8,

java 数组存储map_java 数组存储map_02

3.      对象数组的存储方式

class Person{
    private int age;
    private Stringname;
    public Person(int age,String name){
       this.age=age;
       this.name=name;
    }
    public String getInfo(){
       return"age="+age+",name="+name;
    }
}
public class A {
   
    public static void print(Person[] temp){
       for(Personi:temp)
       System.out.println(i.getInfo());
    }  
    public static void main(String[] args) {
       Person[] data=new Person[]{
              new Person(32,"小明"),new Person(33,"小黄"),new Person(60,"小李")
       };    
       print(data);
      
    }
}




java 数组存储map_System_03

 

4.      字符串声明

 

public class A {
    public static void main(String[] args) {
       String str1="Hello";//直接赋值
       String str2=new String("Hello");//构造方法
       String str3=str2;//引用传递
       System.out.println(str1==str2);//false
       System.out.println(str1==str3);//false
       System.out.println(str2==str3);//true
 
    }
}




 

java 数组存储map_System_04

5.  

public class A {
    public static void main(String[] args) {
       String str1="Hello";//直接赋值
       String str2="Hello";//构造方法
       String str3="Hello";//引用传递
       System.out.println(str1==str2);//true
       System.out.println(str1==str3);//true
       System.out.println(str2==str3);//true
 
    }
}




java 数组存储map_System_05

6.      String采用构造方法实例化

String str1=new String("Hello");

每一个字符串都是String类的匿名对象,所以要在堆内存中开辟一块空间保存字符串”Hello”,而后又使用关键字new,开辟另一块堆内存空间,不过真正使用的使用new开辟的堆内存,而之前定义的字符串常量的堆内存空间将不会有任何的栈内存指向,就将成为垃圾,等待GC回收 。

java 数组存储map_System_06

7,   字符串的内容一旦声明则不可改变

public class A {
    public static void main(String[] args) {
       String str="Hello";
       str+="World";
       str=str+"!!!";
       System.out.println(str);//Hello World!!!
    }
}




java 数组存储map_java 数组存储map_07

8,

1.  

package a;

class Demo{  
    private int data=10;  
   
    public Demo(int data) {  
       this.data =data;  
    }  
   
    public int getData() {  
       return data;  
    }  
   
    public void setData(int data) {  
       this.data =data;   
    }    
}  
public class A {  
    public static void main(String[] args) {  
       Demo demo=new Demo(1000);  
       fun(demo);  
       System.out.println(demo.getData());  //输出结果30
    }  
    public static void fun(Demo temp){  
       temp.setData(30);     
    }  
}






java 数组存储map_java 数组存储map_08


9,

1.  

public class A {
    public static void main(String[] args) {
       String str="Hello";
       fun(str);
       System.out.println(str);
    }
    public static void fun(String temp){
       temp="World";    
    }
}




java 数组存储map_内存空间_09

String类的内容不可改变,所以当修改字符串的数据(temp="World")的时候就发生了一个引用关系的变更,temp指向新的堆内存空间,由于temp本身数据方法的局部变量,所以方法执行完毕后temp就消失了,原始的str对象内容不发生任何改变。


10,

 

class Demo{
    private Stringdata;
    public String getData() {
       returndata;
    }
    public void setData(String data) {
       this.data =data;
    }
    public Demo(Stringdata) {
       super();
       this.data =data;
    }  
}
public class A {
    public static void main(String[] args) {
       Demo demo=new Demo("Hello");
       fun(demo);
       System.out.println(demo.getData());
    }
    public static void fun(Demo temp){
       temp.setData("World");     
    }
}



这个和第8个很像,就是这个是String的成员变量,第8个是int的成员变量,String的值不可改变等特殊性,可以把它看成基本数据类型。如果非要用内存图来说明本题实例,也可以



java 数组存储map_字符串_10

11

package org.test;
class Person{
    private String name;
    private int age;
    static String country="北京";
    public Person(String name,int age) {
       super();
       this.name =name;
       this.age =age;
    }
   
    public String getInfo() {
       return"Person[name=" +name +",age=" +age +"];城市:"+country;
    }
   
}
public class A {
    public static void main(String[] args) {
       Person per1=new Person("张三",20);
       Person per2=new Person("李四",21);
       Person per3=new Person("王五",24);
       per1.country="南京";
       System.out.println(per1.getInfo());
       System.out.println(per2.getInfo());
       System.out.println(per3.getInfo());
    }
   
}




/**

输出结果:

Person [name=张三, age=20];城市:南京

Person [name=李四, age=21];城市:南京

Person [name=王五, age=24];城市:南京

java 数组存储map_内存空间_11

静态常量在内存中开辟了一个“全局数据区”,

java中主要存在四个内存空间,这些名称的名字和作用如下:

1,栈内存空间:保存所有的对象名词

2,堆内存空间:保存每个对象的具体内容。

3,全局数据区:保存static类型的属性

4,全局代码区:保存所有的方法定义。