这篇文章上次修改于 1423 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 > 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."":()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."":()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
没有评论