虚拟机栈都是线程私有的,只要局部变量不逃逸出方法的作用范围---通过变量传入或者是到返回值就是逃逸出了方法的作用范围---就是线程安全的,但是虚拟机中堆都是线程共享的,因此是线程不安全的,而且堆中有垃圾回收机制。
对内存溢出是正在使用的太多,且没有被垃圾回收机制回收。
outofmemoryerror 这个报错是堆内存溢出;
方法区使用的是堆内存的一部分;
String s1 = "a"; String s2 = "b"; String s3 = s1+s2 ; 执行的过程是 new StringBuild().append(s1).append(s2).toString(); String s4 ="ab"; // s3==s4 是错误的,因为s3 是一个新的new对象,存储的地址变了 String s5 = "a"+"b"; s4==s5是true,因为s4存在于字符串常量池中,s5的结果ab在常量池中已经有了,不会在重新创建; 这是因为javac在编译的时候会优化 s3和s5的主要区别是s3是不确定的它是在运行期间使用stringbuild动态拼接,而s5是已经确定的,它在运行之前就已经拼接完成。 intern方法可以将字符串放入字符串常量池中 (s.intern());
直接内存:是操作系统的内存,不属于jvm,常用于NIO操作时,用于数据缓冲区,分配和回收成本高,但是读写性能高,不受jvm内存回收管理
unsafe类,是一个分配直接内存和释放直接内存的类;