博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java程序运行原理分析
阅读量:3927 次
发布时间:2019-05-23

本文共 1512 字,大约阅读时间需要 5 分钟。

Java运行原理分析

class文件内容

class文件包含JAVA程序执行的字节码;数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符;文件开头有一个0xcafebabe(16进制)特殊的一个标志。

这文件是有复杂格式专门给JVM读里面的内容,人类阅读可以借助工具查看,包括:版本、访问标志、常量池、当前类、超级类、接口、字段、方法、属性。

版本号/访问控制

public class Demo1 minor version:0//次版本号 major version:52//主版本号 flags:ACC_PUBLIC,ACC_SUPER//访问标志

版本号规则:JDK5,6,7,8分别对应49,50,51,52

访问标志

标志名称 标志值 含义
ACC_PUBLIC 0x0001 是否为public类型
ACC_FINAL 0x0010 是否被声明为final,只有类可设置
ACC_SUPER 0x0020 是否允许使用invokespecial字节码指令,JDK1.2之后编译出来的类的这个标志为true
ACC_INTERFACE 0x0200 标志这个是一个接口
ACC_ABSTRACT 0x0400 是否为abstract类型,对于接口或者抽象类来说,此标志值为true,其他值为false
ACC_SYNTHETIC 0x1000 标志这个类并非由用户产生的
ACC_ANNONTATION 0x2000 标识这是一个注解
ACC_ENUM 0x4000 标识这是一个枚举

JVM运行原理

在这里插入图片描述

JVM运行时数据区

  • 线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁。
  • 线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁。

方法区

JVM用来储存加载的类信息、常量、静态变量、编译后的代码数据,虚拟机规范中这是一个逻辑区域。具体实现根据不同虚拟机来实现。

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

堆内存

在这里插入图片描述

堆内存还可以细分为:老年代、新生代(Eden、From Survivor、To Survivor)。JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存,如果满了,就会出现OutOfMemoryError。

虚拟机栈

每个线程都在这个空间有一个私有空间。线程栈由多个栈帧(Stack Frame)组成。一个线程会执行一个或者多个方法,一个方法对应一个栈帧。

栈帧内容包括:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。栈内存默认最大是1M,超出则抛出StackOverflowError。

本地方法栈

和虚拟机栈功能类似,虚拟机栈是为虚拟机执行JAVA方法而准备的,本地方法栈是为虚拟机使用Native本地方法而准备得。

虚拟机规范没有规定具体的实现,由不同的虚拟机厂商去实现。HopSpot虚拟机中虚拟机栈和本地方法栈的实现是一样的。

程序计数器(Program Counter Register)

记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空。每个线程都在这个空间有一个私有的空间,占用内存空间很少。CPU同一时间,只会执行一条县城中的指令。JVM多线程会轮流切换并分配CPU执行时间的方式。为了线程切换后,需要通过程序计数器,来恢复正确的执行位置。

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

转载地址:http://pmugn.baihongyu.com/

你可能感兴趣的文章
SpringMVC + ehcache( ehcache-spring-annotations)基于注解的服务器端数据缓存
查看>>
Hibernate二级缓存以及ehcache的搭建配置(注解方式)
查看>>
Hibernate 参数设置一览表
查看>>
java web 静态资源访问配置三种方式
查看>>
spring 几种视图解析器
查看>>
spring 架包的说明
查看>>
web.xml引入 xml (tomcat 7.0.52) 以上版本报错!
查看>>
Ehcache 分布式缓存 -springMVC
查看>>
springMVC Spring MVC 异常处理
查看>>
解决MySQL不允许(其它IP)从远程访问的方法
查看>>
hibernaate 主键生成策略
查看>>
三个annotation类型(RetentionPolicy,ElementType)
查看>>
StringUtils用法 方法说明
查看>>
Spring @Resource、@Autowired、@Qualifier的注解注入及区别
查看>>
oracle创建表中LONG字段类型的使用注意事项
查看>>
Nginx+tomct 动静分离实现负载均衡
查看>>
Uploadify 3.2 参数属性、事件、方法函数详解以及配置
查看>>
uploadify 上传图片附件问题
查看>>
JSP文件是否有必要放在WEB-INF下
查看>>
springMVC + hibernate jar整合 (包含log4j)
查看>>