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