Java内存模型之常考题型

JVM 三大性能调优参数-Xms -Xmx -Xss的含义

java -Xms 128m -Xmx128m -Xss256k -jar xxxx.jar

  • -Xss:规定了每个线程虚拟机栈(堆栈)的大小
  • -Xms:堆的初始值
  • -Xmx:堆能达到的最大值

Java内存模型中堆和栈的区别一内存分配策略

  • 静态存储:编译时确定每个数据目标在运行时的存储空间需求
  • 栈式存储:数据区需求在编译时未知,运行时模块入口前确定
  • 堆式存储:编译时或运行时模块入口都无法确定,动态分配

Java内存模型中堆和栈的区别

  • 联系:引用对象、数组时,栈里定义变量保存堆中目标的首地址
    在这里插入图片描述
  • 管理方式:栈自动释放,堆需要GC
  • 空间大小:栈比堆小
  • 碎片相关:栈产生的碎片远小于堆
  • 分配方式:栈支持静态和动态分配,而堆仅支持动态分配
  • 效率:栈的效率比堆高

元空间、堆、线程独占部分间的联系一内存角度

public class HelloWorld {
	private String name;
	public void sayHello(){
		System.out.println("Hello" + name);
	}
	
	public void setName(String name) {
		this.name = name;
	}	

	public static void main(String[] args){
		int a = 1;
		HelloWorld hw = new HelloWorld();
		hw.setName("test");
		hw.sayHello();
	}

}

在这里插入图片描述

不同JDK版本之间的intern()方法的区别——JDK6 VS JDK6+

String s = new String("a");
s.intern();

JDK6:当调用 intern 方法时,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用。否则,将此字符串对象添加到字符串常量池中,并且返回该字符串对象的引用。

JDK6+:当调用 intern 方法时,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用。否则,如果该字符串对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在,则在池中创建该字符串并返回其引用。

就是将常量池放到了堆中。取消了永久代

jdk1.6版本

public class PermGenErrTest {
	public static void main(String[] args){
		for(int i=0; i <= 1000; i++){
			//将返回的随机字符串添加到字符串常量池中
			genRandomString(1000000).intern();
		}
		System.out.println("Mission");
	}


//返回指定长度的随机字符串
	private static String getRandomString(int length) 	{
		//字符串源
		String str = "abasnaskcaiksucaskcn....";
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < length; i++) {
			int number = random.nextInt(62);
			sb.append(str.charAt(number));
		}
		return sb.toString();	
	}
}

jdk1.8版本

public class InternDifference {
	public static void main(String[] args){
		String s = new String("a");
		s.intern();
		String s2 = "a";
		System.out.println(s == s2);
	
		String s3 = new String("a") + new String("a");
		s3.intern();
		String s4 = "aa";
		System.out.println(s3 == s4);
	}
}
结果:
false
true

jdk1.6版本

public class InternDifference {
	public static void main(String[] args){
		String s = new String("a");
		s.intern();
		String s2 = "a";
		System.out.println(s == s2);
	
		String s3 = new String("a") + new String("a");
		s3.intern();
		String s4 = "aa";
		System.out.println(s3 == s4);
	}
}
结果:
false
false

不太JDK版本之间的intern()方法的区别——JDK6

在这里插入图片描述

不同JDK版本之间的intern()方法的区别——JDK7及以上

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值