资源描述:
《[互联网]jvm相关》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、JVM相关1.Jvm运行时数据区域2.3.4.程序计数器:它是线程私有的,它是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。如果线程正执行的是一个java方法它记录的是正在执行的虚拟机字节码指令的地址,如果线程正执行的是一个Native方法这个记数器的是则为空(Undefined)此内存区域也是唯一一个在java虚拟机规范中没有规定OutOfMemoryError情况的区域.5.Java虚拟机栈:它也是线程私有的生命周期与线程生命周期相同。它描述的是java方法执行的内存模型:每个
2、方法被执行的时候都会创建一个栈桢用来存储局部变量表方法出入口信息每一个方法被调用直至执行完成的过程,6.本地方法栈:此区域与虚拟机栈起到的作用类似,只不是过虚拟机栈是针对java方法而此区域是针对native方法同时此区域也会抛出StackOverflowError和OutOfMemoryError两种异常.1.Java堆:它是java虚拟机管理的内存中最大的一块,它是被所有线程共享的一块内存区域,它在虚拟机启动时创建,它的唯一目的是存储对象实例,几乎所有的对象都在这里分配内存。Java堆也是垃圾收集器管理的
3、主要区域,如果从内存回收的角度看由于现在收集器采用分代收集算法所以可以分为老年代和新生代再细致有Eden空间from、to空间但是无论怎么划分它都是只是存储对象实例而已。2.方法区:3.运行时常量池:4.String常量池详解: 1.String使用privatefinalcharvalue[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable)。String类有一个特殊的创建方法,就是使用""双引号来
4、创建.例如newString("iam")实际创建了2个 String对象,一个是"iam"通过""双引号创建的,另一个是通过new创建的.只不过他们创建的时期不同, 一个是编译期,一个是运行期!java对String类型重载了+操作符,可以直接使用+对两个字符串进行连接。运行期调用String类的intern()方法可以向StringPool中动态添加对象。 例1 Strings1="sss111"; //此语句同上 Strings2="sss111"; System.out.printl
5、n(s1==s2);//结果为true 例2 Strings1=newString("sss111"); Strings2="sss111"; System.out.println(s1==s2);//结果为false 例3 Strings1=newString("sss111"); s1=s1.intern(); Strings2="sss111"; System.out.println(s1==s2);//结果为true 例4 Strings1=newString("111");
6、Strings2="sss111"; Strings3="sss"+"111"; Strings4="sss"+s1; System.out.println(s2==s3);//true System.out.println(s2==s4);//false System.out.println(s2==s4.intern());//true 结果上面分析,总结如下: 1.单独使用""引号创建的字符串都是常量,编译期就已经确定存储到StringPool中; 2,使用newString("")
7、创建的对象会存储到heap中,是运行期新创建的; 3,使用只包含常量的字符串连接符如"aa"+"aa"创建的也是常量,编译期就能确定,已经确定存储到StringPool中; 4,使用包含变量的字符串连接符如"aa"+s1创建的对象是运行期才创建的,存储在heap中; 还有几个经常考的面试题: Strings1=newString("s1"); Strings2=newString("s1"); 上面创建了几个String对象? 答案:3个,编译期ConstantPool中创建1个,运行期he
8、ap中创建2个.(用new创建的每new一次就在堆上创建一个对象,用引号创建的如果在常量池中已有就直接指向,不用创建) Strings1="s1"; Strings2=s1; s2="s2"; s1指向的对象中的字符串是什么? 答案:"s1"。(永远不要忘了String不可变的,s2="s2";实际上s2的指向就变了,因为你不可以去改变一个String,)-----------------