JVM内存数据保存举例说明

参考网站

https://baike.baidu.com/item/%E5%A0%86%E6%A0%88/1682032?fr=aladdin

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);

      

    }

}



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,


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);
      
    }
}


 

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
 
    }
}


 

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
 
    }
}



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

String str1=new String("Hello");

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


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

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


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);     
    }  
}  




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";    
    }
}



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的值不可改变等特殊性,可以把它看成基本数据类型。如果非要用内存图来说明本题实例,也可以



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中主要存在四个内存空间,这些名称的名字和作用如下:

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

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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值