Java学习总结(1.1.1) Java程序运行原理分析

精贴 置顶
1565 0
作者:      发布时间: 2020-03-17 16:11:50

class是二进流

JVM运行时数据区

线程共享部分

  方法区: 存class

  堆内存: 存类对象等,全部线程可以访问

线程独占部分

  虚拟机栈

  本地方法栈

  程序计数器

 

线程独占:独立空间,随线程生命周期创建和销毁

线程共享:全线程可以访问,随虚拟机或GC创建和销毁

 

JVM用来存储加载的类信息、常量、静态変量、编译后的代码等数据

虚拟机规范中这是一个逻辑区划。具体实现根据不同虚拟机来实现。

如: oracle的 Hotspot在java7中方法区放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理

 

 

堆内存还可以细分为:老年代、新生代(Eden、 From Survivor、 To Survivor

JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存。

如果满了,就会出现 Outofmemroyerror,后续在内存模型中,详细讲解。

 

虚拟机栈,每个线程都在这个空间有一个私有的空间。

线程栈由多个栈帧( Stack Frame)组成。

一个线程会执行一个或多个方法,一个方法对应一个栈帧

栈帧内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。

栈内存默认最大是1M,超出则抛出 Stackoverflowerror

 

和虚拟机栈功能类似,虚拟机栈是为虚拟机执行JAVA方法而准备的,

本地方法栈是为虚拟机使用 Native本地方法而准备的。

虚拟机规范没有规定具体的实现,由不同的虚拟机厂商去实现。

Hotspot虚拟机中虚拟机栈和本地方法栈的实现式一样的。同样,超出大小以后也会抛出 Stackoverflowerror。

 

 

程序计数器( Program Counter Register)记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行 Native方法,则计数器值为空。

每个线程都在这个空间有一个私有的空间,占用内存空间很少。

CPU同一时间,只会执行一条线程中的指令。

JVM多线程会轮流切换并分配CPU执行时间的方式。

为了线程切換后,需要通过程序计数器,来恢复正确的执行位置

 

操作:

 


标签:
上一篇:
下一篇: Java学习总结(1.1.2) 线程状态

每日一句

如果花了足够多的时间考虑你的目标,你就能用自己的心看到、摸到、尝到和闻到那个目标,你不会轻易放弃。实现目标的欲望会给你足够的毅力克服哪怕是最令人生畏的障碍。在真的取得成功之前,你应该已经在头脑中达成目标。这样你就能承受任何暂时的痛苦,实现自己的梦想。

标签云

vue
最近综合
情绪巨婴是什么 12.18
普通蛋糕做法 05.31
玉米烤肠芝士面包做法 05.31
Mysql安装教程 - 绿色版 06.18
我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
Typora开发版⽆法使⽤解决⽅法 05.04
为什么无知者越自信? -- 达克效应 05.10
马斯洛需求层次理论 04.29
随机综合
Java学习总结(1.1.3) 线程中止 03.17
Java学习总结(1.2.1) Java内存模型详解 03.18
Java学习总结(2.1.2) BIO阻塞网络编程 04.17
Android开发,为什么Android不直接链接mysql数据库 04.12
Java学习总结(1.2.2) 线程安全之原子操作 03.20
Java学习总结(1.3.3) 并发容器类2 04.09
[vue]VUE的一些问题和解决 08.05
Java学习总结(1.1.6) 线程封闭 03.19