【Java进阶营】Java程序运行原理分析

【Java进阶营】Java技术专题-从底层分析LockSupport原理机制 从底层分析LockSupport原理机制 知识点 LockSupport的介绍 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数,而仅仅两个简单的接口,就为上层提供了强大的同步原语,先来解析下两个函数是做什么的。 public native void unpark(Thread jthread); public native void park(boo. 阅读详情

一. JVM原理

class文件内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEnCgkku-1650627075591)(//upload-images.jianshu.io/upload_images/14004247-2cd494127435b211.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

JVM运行时数据区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUkQVnRl-1650627075594)(//upload-images.jianshu.io/upload_images/14004247-eccfcc2b31c4f14f.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

线程独占: 每个线程都会有它独立的空间,随线程的生命周而创建和销毁

线程共享: 所有线程都能访问这块内存数据,随虚拟机或GC而创建和销毁

方法区
  • 方法区是各个线程共享的内存区域

  • 用于存储已被虚拟机加载的类信息, 常量,静态变量, 即时编译后的代码等数据

  • 虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分, 但它却有一个别名叫Non-Heap, 目的应该是与Java堆区分开来

  • Oracle的Hotspot虚拟机在Java7中方法区放在’永久代’(Permanent Generation), Java8放在元数据空间, 并且通过GC机制对这个区域进行管理

  • 运行时常量池是方法区的一部分

Java堆
  • Java堆是被所有共享的一块内存区域, 在虚拟机启动时创建

  • 存放对象的实例

  • 垃圾收集器的主要管理区域

  • Java堆还可以细分为: 新生代和老年代, 新生代又可以细分为Eden 空间, From Survivor空间 和To Survivor空间

  • 空间满了会抛OutOfMemoryError

Java虚拟机栈
  • Java虚拟机栈是线程私有的, 它的生命周期与线程相同

  • Java虚拟机栈描述的是Java方法执行的内存模型: 每个方法被执行的的时候都会同时创建一个栈帧(栈帧是方法运行时的基础数据结构)用于存储局部变量表, 操作栈, 动态链接, 方法出口等信息.在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

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

本地方法栈
  • 本地方法栈与虚拟机栈的功能类似, 虚拟机栈是为虚拟机执行Java方法而准备的, 本地方法栈是为虚拟机使用Native本地方法而准备的

  • Hotspot虚拟机中虚拟机栈与本地方法栈的实现方式一样, 超出大小后也会抛StackOverFlowError

程序计数器
  • 程序计数器是线程私有的一块较小的内存空间

  • 记录当前线程执行的字节码位置, 存储的是字节码指令地址, 如果执行Native方法, 则计数器为空

  • CPU同一时间, 只会执行一条线程的指令. JVM多线程会轮流切换并分配CPU的执行时间的方式. 为了线程切换后, 需要通过程序计数器来恢复正确的执行位置

二. 程序运行分析

使用Demo.java进行测试, 运行javac Demo.java编译成class文件, 然后运行javap -v Demo.class > Demo.txt查看class文件内容

public class Demo{
    public static void main(String[] args){
        int x = 500;
        int y = 100;
        int a = x / y;
        int b = 50;
        System.out.println(a + b);
    }
}

demo.txt

Classfile /E:/*/Demo.class
  Last modified 2019-6-30; size 412 bytes
  MD5 checksum efd785af33e58aa9fc9834110b74b87b
  Compiled from "Demo.java"
public class Demo
  minor version: 0      //次版本号
  major version: 52     //主版本号 版本号规则: JDK5,6,7,8分别对应49,50,51,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            // Demo
   #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               Demo.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               Demo
  #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 Demo();     // 默认隐式无参的构造函数
    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[]);      //程序的入口main方法
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC       //访问控制
    Code:
      stack=3, locals=5, args_size=1        //方法栈栈帧中操作数栈的深度,本地变量数量,参数数量
         0: sipush        500       //Jvm执行引擎执行这些源码编译过后的指令码, javap翻译出来的
         3: istore_1                //是操作符, class 文件内存储的是指令码, 前面的数据是偏移量,
         4: bipush        100       //Jvm根据这个去区分不同的指令. 详情参照'JVM指令码表'
         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: "Demo.java"

Class执行过程详解

程序分析图1 - 加载到方法区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4gT5KBtt-1650627075596)(//upload-images.jianshu.io/upload_images/14004247-58b5a8a2d86aaa27.PNG?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

程序分析图2 - JVM创建线程执行代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDKk3dPe-1650627075608)(//upload-images.jianshu.io/upload_images/14004247-45ae6cb4389c425a.PNG?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

程序分析图3 - main方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NgeJ0Aez-1650627075610)(//upload-images.jianshu.io/upload_images/14004247-c12932a674c35e15.gif?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

JAVA程序运行原理——知其然,而知其所以然 最近看书被几个有意思的问题吸引: 你写java程序吗? 它的运行机制你懂多少? 你用eclipse开发吗?它的运行机制你懂多少? 你用tomcat 部署吗? 它的运行机制你懂多少? 你想过这些软件也是人开发出来的吗?依赖这么深入,哪天它不干了,你还干不干?   然后,让我就接着看了看,然后,让我们一起来看看java语言原理。【哈哈】 编译型语言   VS   解释型语言 编译型语言 阅读详情

相关推荐

C++程序分析及运行结果

本课程主要掌握C++语言的基本语法,以及面向对象程序设计与分析,重点掌握面向对象中类与对象的定义及调用,运算符函数重载,继承性与多态性的运用,理解掌握C++中输入输出流类和模板的使用。最终达到能够简单的、综合的面向对象程序设计能力。

Java死循环的分析与解决

死循环是指程序中的循环结构由于某种原因无法正常结束,导致程序一直执行下去,直到外部干预或程序崩溃。通常情况下,死循环是由于循环条件设置不当或循环体内缺少退出机制导致的。死循环是Java编程中一个常见且可能导致程序崩溃的问题。通过理解死循环的成因,采取有效的预防措施,并学会使用调试工具和线程堆栈分析来识别和解决死循环,开发者可以更好地控制程序的行为,确保程序的稳定性和可靠性。

C_V_Better的博客 1063

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(上)

本文深入解析了AM32电调固件的源码架构与核心模块实现。文章首先介绍了AM32电调作为开源无人机;动力心脏的重要地位,随后从硬件基础、源码目录、模块划分三个维度构建解析框架。重点剖析了系统初始化模块的时钟配置、GPIO初始化和定时器设置,以及FOC控制模块的坐标变换算法、角度估算和SVPWM生成等关键技术实现。通过逐行代码解析,揭示了电调如何将飞控指令转换为电机驱动的完整过程,为开发者理解AM32电调工作原理提供了系统性指导。

bother3000的博客 6577

搞懂Java的死循环(for、while、do-while)

家人们,今天我想跟你们唠唠我在学 Java 编程的时候碰到的几个特别基础但又超级重要的东西 ——for 循环、while 循环还有 do - while 循环,重点讲讲它们的死循环写法,别一听 “死循环” 就觉得吓人,其实弄懂了可有用啦!

潜意识Java的博客 1857

手把手教你用TJA1145A实现CAN节点智能唤醒(含数据帧过滤技巧)

本文详细介绍了如何使用TJA1145A收发器实现CAN节点的智能唤醒功能,包括数据帧过滤技巧和超低功耗设计。通过硬件级帧过滤和双条件唤醒机制,TJA1145A在保持微安级休眠电流的同时,能对特定报文做出毫秒级响应,显著提升电池供电设备的续航能力。

weixin_28721917的博客 253

第21章 分层架构软件测试

技术人员和客户代表对代码服务相关的技术进行详细的交流,由此确定代码审计的方案(哪些代码要审计、用什么方式审计、审计的时间、审计的要求等)代码审计报告提交和沟通之后,跟开发人员针对代码审查发现的问题进行修改,然后代码审查人员进行回归的检查,然后提交复查的报告;本层不需要了解其它层的实现细节,只需要考虑与本层相关的两层之间的接口和调用的情况。然后对客户要求的功能点进行人工的代码审查,对源代码的扫描结果进行人工的分析和确认;结合自动化扫描的结果和人工审查的结果生成测试对象的代码审查报告,最后提交给客户;

李黏黏的博客 3273

Java程序运行原理分析。

class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时数据区 线程独占: 每个线程都会有它独立的空间,随线程的生命周期而创建和销毁线程共享: 所有线程都能访问这块内存数据,随虚拟机或GC而创建和销毁 方法...

yihuliunian的博客 228

香橙派5B-RK3588-NPU内核升级至0.9.8:RKLLM多模态部署实战

本文详细介绍了香橙派5B-RK3588设备NPU内核升级至0.9.8版本的完整流程,重点讲解了升级的必要性、两种升级方案(预编译包安装与自行编译内核)以及RKLLM SDK的安装配置。通过实战演示多模态模型转换与推理,显著提升AI计算性能,为嵌入式AI部署提供实用指南。

salt9的博客 1028

JAVA程序运行原理分析

【主题】 JAVA程序运行原理分析 【信息】 class文件内容 字节码,开头包含一个0xcafebabe(16进制)特殊的一个标志 魔数cafebabe来源可参考WIKI百科: Java_class_file class文件可用二进制软件查看,比如ultraedit,我用notepad++的ansi转hex看不出来开头的魔数,应该是原来class文件是windows1252编码问题。 JVM...

EdwardDrew的专栏 348

从零开始:在Unity中使用Dynamic Bone实现角色骨骼自然抖动(以女性角色胸部为例)

本文详细介绍了在Unity中使用Dynamic Bone插件实现角色骨骼自然抖动的完整流程,特别以女性角色胸部为例。从插件导入、骨骼系统基础到Dynamic Bone组件配置和参数调优,提供了全面的技术指导。文章还包含性能优化技巧和常见问题解决方案,帮助开发者快速掌握这一物理效果实现方法。

weixin_28728495的博客 457

OMI数据获取与可视化:从下载到大气污染分析

本文详细介绍了如何获取与处理OMI卫星数据,以进行大气污染分析。内容涵盖从NASA GES DISC官方源下载对流层NO2数据、使用MATLAB或Python进行月均数据处理与网格化,到利用m_map或cartopy工具进行专业可视化的完整流程。重点解析了数据下载技巧、NetCDF格式处理、地图投影与填色方法,并探讨了时间序列分析与动态可视化等深度应用,为环境研究者提供了一套从数据到洞察的实用指南。

weixin_29210759的博客 269

Java程序运行原理

Java程序运行原理 - Java代码的运行 在了解Java的运行原理之前,配置好JDK后,我们首先要了解如何运行一个Java程序 首先我们需要创建一个Java的源代码 /** *This is a java program */ public class HelloWorld{ public static void main(String [] args){ System.out....

weixin_45036949的博客 731

SAP COPA实战:手把手教你用CMOD增强搞定自定义特性派生(以客户字段为例)

本文详细介绍了在SAP COPA模块中通过CMOD增强实现自定义特性派生的全流程,以客户字段为例,展示了从特性设计、SPRO配置到特性派生逻辑实现的完整步骤。重点讲解了如何利用CMOD增强技术解决业务需求,提升获利能力段分析的灵活性和准确性。

weixin_30275415的博客 429

分析Java程序运行原理

分析Java程序运行原理前言Class文件内容及包含的java逻辑语义Class文件内容:Class文件内容包含哪些java逻辑语义:Jvm运行时内存的数据区划分线程共享区域:线程独享区域:Java程序运行原理完整分析上一个简单实操的java类从头分析其运行原理: 前言 在分析Java程序运行原理前,我们先了解两点基础的前提知识点: class字节码文件到底存储的什么内容,以及它包含了哪些java语义逻辑内容? Jvm在运行时内存的数据区到底如何划分? Class文件内容及包含的java逻辑

ZKC_开成的博客 550

笔试题-2023-加特兰-数字IC设计【纯净题目版】

笔试题-2023-加特兰-数字IC设计【纯净题目版】

w0shishabi的博客 2249

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

详述Java程序运行原理

前言 我们都知道,Java是一种面对对象的语言,这样就避开了繁琐的过程使编码变得简单。同时Java是在JVM虚拟机上运行,故具有良好的可移植性。 现在,让我们来一起探索Java程序运行的原理 基本原理 Java语言是一种先编译后解释的语言,一般我们在编写一个Java程序时需要在记事本(或编辑器)上先编辑好源代码 这些源代码经过编译器编译后,就会生成一个.class文件,这个文件就是编译好的Jav...

飞翔的企鹅的博客 321

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java程序运行原理分析

一、JVM原理 class文件内容 JVM运行时数据区 方法区 堆内存区 虚拟机栈 本地方法栈 程序计数器 二、程序运行分析示例 代码如下 /** * 示例1 - JAVA程序执行分析 */ public class Demo1 { public int x; public int sum(int a, int b) { return a + b; } publi...

maxleader的博客 285

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java程序运行堆栈原理

Java程序运行原理分析 Java程序运行流程 Java程序运行原理分析----环境介绍 从最初的jdk安装开始,都是程序运行的关键步骤,每一个步骤都正确执行,一台电脑上才真正的能够运行Java程序。 工欲善其事,必先利其器。这里作为一个Java开发人员,平时跟代码打交道,但是这里,所谓的代码,其实是源代码,供程序开发人员间相互阅读使用的。 而在...

java武林梦 2967

java程序运行原理分析

java程序运行过程详解概述java代码的编写编译翻译class文件源文件分析组成部分JVM内存模型指令码表运行分析总结 概述 本文主要介绍一个java程序是如何运行的,主要涉及到jvm一些知识点,本文以安装了JRE运行环境,不涉及到环境的安装。java程序运行的主要步骤包括: java程序代码的编写 java源文件的编译 java源文件代码的执行 以下则围绕这几个点来进行详细的分析。 jav...

xiaofbing的专栏 387
上一篇: 【Java进阶营】Java入门必备“学习路径和书籍”推荐
下一篇: Java开发程序员面试:spring部分面试题及答案
java364108
博客等级 码龄5年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值