java-jvm

JVM

内存结构

程序计数器(Program Counter Register)

  • 作用:是记住下一条jvm指令的执行地址
  • 特点:
    • 是线程私有的
    • 永远不会OOM(内存溢出)

java虚拟机栈

  • 每个线程运行时所需要的内存,称为虚拟机栈
  • 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存
  • 每个线程中只能有一个活动栈帧,对应着正在执行的方法

字符串创建

  1. 字面值的方式
    1
    2
    3
    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1==s2);

采用字面值的方式创建一个字符串时,JVM首先会去字符串池中查找是否存在”abc”这个对象,如果不存在,则在字符串池中创建”abc”这个对象,然后将池中”abc”这个对象的引用地址返回给”abc”对象的引用s1,这样s1会指向池中”abc”这个字符串对象;如果存在,则不创建任何对象,直接将池中”abc”这个对象的地址返回,赋给引用s2。因为s1、s2都是指向同一个字符串池中的”abc”对象,所以结果为true。

  1. new关键字新建
    1
    2
    3
    String s3 = new String("xyz");
    String s4 = new String("xyz");
    System.out.println(s3==s4);

采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有”xyz”这个字符串对象,如果有,则不在池中再去创建”xyz”这个对象了,直接在堆中创建一个”xyz”字符串对象,然后将堆中的这个”xyz”对象的地址返回赋给引用s3,这样,s3就指向了堆中创建的这个”xyz”字符串对象;如果没有,则首先在字符串池中创建一个”xyz”字符串对象,然后再在堆中创建一个”xyz”字符串对象,然后将堆中这个”xyz”字符串对象的地址返回赋给s3引用,这样,s3指向了堆中创建的这个”xyz”字符串对象。s4则指向了堆中创建的另一个”xyz”字符串对象。s3 、s4是两个指向不同对象的引用,结果当然是false。

intern 方法
使用 intern 方法,主动将串池中还没有的字符串对象放入串池
String s1 = new String(); s1.intern();

  • JDK1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回
1
2
3
4
5
6
7
8
9
10
11
12
13
        String x1 = new String("a") + new String("b");
String x2 = "ab";
x1.intern();

System.out.println(x1 == x2); //false
````

```java
String x1 = new String("a") + new String("b");
x1.intern(); //此时池中还没有“ab”,因此会将对象放入池中
String x2 = "ab";

System.out.println(x1 == x2); //true
  • JDK1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份,放入串池,会把串池中的对象返回

java-jvm
https://cs-lb.github.io/2024/11/21/Java/java-jvm/
作者
Liu Bo
发布于
2024年11月21日
许可协议