JAVA运行时数据区
线程共享:方法区 堆内存 (老年代、新生代(S0、S1)) 随gc而创建和销毁
线程独占部分 虚拟机栈 本地方法栈 程序计数器 随线程生命周期而创建和销毁

文章插图
方法区: 运行时常量池 字符串常量 (non-heap)
- 方法区是各个线程共享的内存区域
- JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据
- 虚拟机规范中这是一个逻辑区划 。具体实现根据不同虚拟机来实现 。
- 如:oracle的HotSpot在java7中方法区放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理
堆内存:
- 还可以细分为:老年代、新生代(Eden、From Survivor、To Survivor)
- JVM启动时创建 。
- 存放对象的实例 。
- 垃圾回收器主要就是管理堆内存 。
- 如果满了,就会出现OutOfMemoryError 。
虚拟机栈
- 每个线程都在这个空间有一个私有的空间 。
- 线程栈由多个栈帧组成 。
- 一个线程会执行一个或多个方法,一个方法对应一个栈帧
- 栈帧内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等 。
- 栈内存默认最大是1M,超出则抛出StackOverflowError
本地方法栈
- 本地方法栈与虚拟机栈的功能类似, 虚拟机栈是为虚拟机执行Java方法而准备的, 本地方法栈是为虚拟机使用Native本地方法而准备的
- Hotspot虚拟机中虚拟机栈与本地方法栈的实现方式一样, 超出大小后也会抛StackOverFlowError
程序计数器
- 记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行的Native方法,则计数器值为空 。
- 每个线程都在一个空间有一个私有的空间,占用内存空间很少 。
- CPU同一时间,只会执行一条线程中的指令 。JVM多线程会轮流切换并分配CPU执行时间的方式 。
- 为了线程切换后,需要通过程序计数器,来恢复正确的执行位置 。
-
javap -v Demo1.class > Demo1.txt 解析 查看指令命令实际操作例子

文章插图
public class Demo1{ public static void main(String[] args){ int x = 500; int y = 100; int a = x / y; int b = 50; System.out.println(a + b); }}经过代码解析文件
Classfile /D:/work/NetEase/课程/vip/高性能编程/多线程并发编程/1.JAVA基础/资料包/part-1/Demo1.class Last modified 2018-11-16; size 414 bytes MD5 checksum ae6fa820973681b35609c75631cb255b Compiled from "Demo1.java"public class Demo1 minor version: 0 // 版本号 major version: 52 // 版本号 flags: ACC_PUBLIC, ACC_SUPER // 访问控制Constant pool: // 类信息解析出来的静态常量池 #1 = Methodref #5.#14 // java/lang/Object."<init>":()V #2 = Fieldref #15.#16 // java/lang/System.out:Ljava/io/PrintStream; #3 = Methodref #17.#18 // java/io/PrintStream.println:(I)V #4 = Class #19 // Demo1 #5 = Class #20 // java/lang/Object #6 = Utf8 <init> #7 = Utf8 ()V #8 = Utf8 Code #9 = Utf8 LineNumberTable #10 = Utf8 main #11 = Utf8 ([Ljava/lang/String;)V #12 = Utf8 SourceFile #13 = Utf8 Demo1.java #14 = NameAndType #6:#7 // "<init>":()V #15 = Class #21 // java/lang/System #16 = NameAndType #22:#23 // out:Ljava/io/PrintStream; #17 = Class #24 // java/io/PrintStream #18 = NameAndType #25:#26 // println:(I)V #19 = Utf8 Demo1 #20 = Utf8 java/lang/Object #21 = Utf8 java/lang/System #22 = Utf8 out #23 = Utf8 Ljava/io/PrintStream; #24 = Utf8 java/io/PrintStream #25 = Utf8 println #26 = Utf8 (I)V{ public Demo1(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=5, args_size=1 // main方法对应栈帧的操作数栈深度、本地变量数量、参数数量 0: sipush 500 3: istore_1 4: bipush 100 6: istore_2 7: iload_1 8: iload_2 9: idiv 10: istore_3 11: bipush 50 13: istore 4 15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 18: iload_3 19: iload 4 21: iadd 22: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 25: return LineNumberTable: line 3: 0 line 4: 4 line 5: 7 line 6: 11 line 7: 15 line 8: 25}SourceFile: "Demo1.java"

文章插图
推荐阅读
-
-
明星照片|古装斜刘海美出天际,林心如第九,翁虹美过颖宝艳冠群芳!
-
斯蒂芬-库里|范乔丹30+11成猛龙队史首人,8记三分创新高!名记:他吸收了库里
-
市场|中国疾控中心:北京此次新发地市场相关疫情已得到有效控制
-
冰箱会着火吗?原因有哪些? 冰箱引发火灾的几率大不大
-
最热文|杨幂杨紫成冠亚军,迪丽热巴遗憾未能入榜,金鹰女神投票正式结束
-
中考|中考结束后为何禁止复读?其中这4点原因,初中生别傻傻不知道
-
【痔疮】十人九痔,必须重视!3个方法助你远离痔疮,早看少遭罪
-
「挖贝网」受疫情影响复工延期,中威电子2020年一季度亏损1700万至1200万
-
-
刘亦菲|不争却始终处于风口浪尖 刘亦菲到底有什么魅力 久久没有被人遗忘
-
国家最新一轮高铁城市规划,湖南这6个地市成最大赢家!
-
-
怎样评价在没人吃的情况下,把带到派对上的食物再带回家呢
-
鲁能确认三名外援,新赛季他将身穿20号球衣出战,最佳主帅还有幸福烦恼
-
-
[晨财经]因个人原因,泰豪科技证券事务代表刘立立辞职
-
赵露思|赵露思新剧仅播出3集,收视率轻松破1!央视八套抓到王炸了
-
【一个八卦|只有两个条件,网友:略显“肤浅”!,王一博谈自己的理想型女生】
-