参考网站
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,全局代码区:保存所有的方法定义。