您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

java程序运行原理解析

时间:2019-08-09 11:41:48  来源:  作者:

JAVA运行时数据区

线程共享:方法区 堆内存 (老年代、新生代(S0、S1)) 随gc而创建和销毁

线程独占部分 虚拟机栈 本地方法栈 程序计数器 随线程生命周期而创建和销毁

 

java程序运行原理解析

 

 

方法区: 运行时常量池 字符串常量 (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 解析 查看指令命令

实际操作例子

java程序运行原理解析

 

  •  
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"

 

java程序运行原理解析

 

 

java程序运行原理解析

 



Tags:java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  Tags: java  点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  Tags: java  点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Tags: java  点击:(5)  评论:(0)  加入收藏
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === &#39;a&#39;) { b = true} else { b = false}// goodb = a === &#39;a&#39;2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Tags: java  点击:(6)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  Tags: java  点击:(11)  评论:(0)  加入收藏
传统游戏项目一般使用TCP协议进行通信,得益于它的稳定和可靠,不过在网络不稳定的情况下,会出现丢包严重。不过近期有不少基于UDP的应用层协议,声称对UDP的不可靠进行了改造,这意...【详细内容】
2021-12-23  Tags: java  点击:(12)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  Tags: java  点击:(12)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  Tags: java  点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  Tags: java  点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  Tags: java  点击:(19)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条