返回博主主页

linux 系统调用 、jvm、Stringtable

linux 系统调用列表

linux中的系统调用+jvm

笔记:

  • image
  • image
  • image
  • 从BIO->NIO->select->poll->epoll,是一个逐步改进的过程,其驱动力就是来源于尽可能减少系统调用。因为无论是创建线程,还是传递数据,都需要进行系统调用。

字符串常量池StringTable简介(反编译分析)
笔记:

  • 字符串对象拼接:
    即当两个字符串变量拼接时,jvm会创建一个StringBuilder对象,利用其append方法实现变量的拼接。最后再通过其toString方法生成一个新的String对象。
    String s1 = "a";
    String s2 = "b";
    String s3 = "ab";
    String s4 = s1 + s2;

    System.out.println(s3 == s4);  // false
  • 字符串常量拼接:
    编译期间,编译器发现这是两个常量相加,结果是确定的,所以就直接让s5等于“ab”。
    String s1 = "a";
    String s2 = "b";
    String s3 = "ab";
    String s4 = s1 + s2;
    String s5 = "a" + "b"; 

    System.out.println(s4 == s5); // false
  • StringTable也叫串池,听名字就可以知道它和String的存储有关。在1.6,它是存在于永久代中的,到了1.7之后,StringTable被放在了堆中

Nio相关的系统调用

select发起系统调用时,会将rset拷贝到内核态

cs_note

笔记:

  • 方法区用于存放已被加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码等数据。

string table

笔记📒:

String s1 = "ab";
String s = new String("a") + new String("b");  // 也是新建了一个StringBuilder实现字符串的拼接与创建。最终的结果就是在堆中创建了一个“ab”字符串对象。并且在串池中加入“a”,“b”对象。
String s2 = s.intern();

System.out.println(s1 == "ab"); // true
System.out.println(s == "ab"); // false, 因为 s.intern()之前已经存在 "ab",所以 s 仍然指向堆中的对象,s2作为返回值,执行串池中的对象s1="ab"
System.out.println(s2 == "ab"); // true
  • jdk1.7之后的做法:intern方法的作用就是在尝试把堆中对象放入串池中。
    • 如果串池中已有,会返回串池中的对象。并且s调用intern方法后依旧指向堆中的对象。
    • 如果串池中没有,会在串池中创建一个“ab”对象并返回,并且会让s指向串池中的“ab”对象。
  • 在jdk1.6,当一个String调用intern方法时,
    • 如果串池中没有,会将堆中的字符串对象复制一份放到串池中,最后返回StringTable中刚加入的对象。

详解JVM常量池、Class常量池、运行时常量池、字符串常量池(心血总结)

  • image
  • image

常量池知识点

  • class常量池(Class Constant Pool):这部分内容将在类加载后进入方法区运行时常量池中存放。

  • 4.成员变量和局部变量存放的位置:
    !引用类型总是被分配到“堆”上。不论是成员变量还是局部,但是局部会把其对象存储在“堆”,而把这个对象的引用(指针)存储在栈
    !基本类型总是分配到它声明的地方:成员变量在堆内存里,局部变量在栈内存里。

    java的基本类型的成员变量在栈还是堆?记住一个原则即可:方法体中的引用变量和基本类型的变量都在栈上,其他都在堆上

posted @ 2022-09-05 22:11  懒惰的星期六  阅读(44)  评论(0编辑  收藏  举报

Welcome to here

主页