首页 » 2020年12月

jvm学习随手笔记

  1. -Xss
    栈内存大小 设置单个线程栈大小,一般默认512~1024kb

2.一个栈帧对应一个函数,栈帧内包含

  • 局部变量表
  • 操作数栈 ---执行引擎的工作区,类似于操作系统的缓存(执行引擎类似cpu,栈和堆类似内存)
  • 动态链接
  • 完成出口

3.方法区和堆刚启动就已经划好了
4.内存区域:线程私有----虚拟机栈,本地方法栈,程序计数器

       线程共享---堆,方法区(运行时常量池,加载类信息)

5.方法区---虚拟机规范规定的东西(逻辑划分)----JDK1.7对方法区的实现叫永久代,JDK1.8叫元空间,可以用来装载class文件

6.静态常量池/运行时常量池-----javap -v Person.class 静态常量池

Constant pool:
    #1 = Methodref          #55.#123      // java/lang/Object."<init>":()V
    #2 = Fieldref           #54.#124      // geek/me/javaapi/baidu/PcsApi.pcsItemService:Lgeek/me/javaapi/baidu/service/PcsItemService;
    #3 = Methodref          #125.#126     // geek/me/javaapi/baidu/service/PcsItemService.getChildItem:(Ljava/lang/String;)Ljava/util/List;
    #4 = Methodref          #54.#126      // geek/me/javaapi/baidu/PcsApi.getChildItem:(Ljava/lang/String;)Ljava/util/List;
    #5 = InterfaceMethodref #127.#128     // java/util/List.stream:()Ljava/util/stream/Stream;
    #6 = InvokeDynamic      #0:#134       // #0:apply:(Lgeek/me/javaapi/baidu/PcsApi;)Ljava/util/function/Function;
    #7 = InvokeDynamic      #1:#137       // #1:apply:()Ljava/util/function/Function;
    #8 = Methodref          #138.#139     // java/util/stream/Collectors.toMap:(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;
    #9 = InterfaceMethodref #140.#141     // java/util/stream/Stream.collect:(Ljava/util/stream/Collector;)Ljava/lang/Object;
   #10 = Class              #142          // java/util/Map
   #11 = Class              #143          // java/util/ArrayList
   #12 = Methodref          #11.#123      // java/util/ArrayList."<init>":()V
   #13 = InterfaceMethodref #127.#144     // java/util/List.iterator:()Ljava/util/Iterator;
   #14 = InterfaceMethodref #145.#146     // java/util/Iterator.hasNext:()Z
   #15 = InterfaceMethodref #145.#147     // java/util/Iterator.next:()Ljava/lang/Object;
   #16 = Class              #148          // geek/me/javaapi/baidu/dto/PcsItem
...

运行时常量池----符号引用---替换为---直接引用。存放符号和内存地址
7.直接内存---堆外内存,NIO,bitbuff,栈中操作时,用引用操作它。 EHCache---中间件,用的较多

8.注意方法区是静,堆区是动态,都是线程共享区域
9.栈是容器,存的是一个个栈桢

10.jvm代码运行jvm内存处理全流程
a.jvm申请内存,向操作系统
b.初始化运行时数据区,方法区和堆
c.类加载到方法区,常量加载到方法区
d.执行方法main,入栈,创建对象
11.堆,新生代(eden,from,to),老年代tenured
12.jshdb查看内存情况,sawindbg.dll