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

精贴 置顶
1847 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
随机综合
鸿蒙OS代码正式开源 09.11
开发者能力金字塔 04.29
Java学习总结(2.2.3) Netty零拷贝机制 04.21
[vue]VUE的一些问题和解决 08.05
Java学习总结(1.3.2) 并发容器类 04.07
Spring返回json可以跨域设置 08.21
中间件1.3.3-RabbitMQ持久化机制、内存/磁盘控制 04.29
Java学习总结(1.1.6) 线程封闭 03.19