`
julyboxer
  • 浏览: 219074 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JVM小记2 

    博客分类:
  • java
阅读更多

JVM执行引擎:
  方法的字节码是由java虚拟机的指令序列构成,每条指令都包含单字节的操作码,及一个或者多个操作数。执行引擎每执行一条指令时。先取得操作码,如果操作码有操作数
取得它的操作数。它执行操作码及跟随的操作数规定的动作。然后再取得下一个操作码。这个执行字节码的过程在线程完成前将一直持续。通过从它的初始方法返回,或者没有
捕获抛出的异常都可以标志着线程的完成
 关注点:
    请求本地方法调用的指令,虚拟机负责试着发起本地方法调用。如果本地方法里面有有再次调用java对象。则垃圾回收的时候则不会回收被本地方法调用的java对象。
字节码执行技术: 解释,即时编译,自适应优化,芯片级直接执行。最有意义也是最快速的是自适应优化,也就是说,不管什么时候调用方法。总是执行本地代码。自适应
优化器搜集那些只在运行才有效的信息。试图以某种方式把字节码解释和编译成本地代码结合起来。以得到最优化的性能。自适应优化的虚拟机开始的时候对所有的代码都是解释
运行。但会监视代码的执行情况:大多数程序花费80-90%的时间用来执行10-20%的代码。或者判断某个特定的方法是瓶颈的时候。会启动一个后台线程把字节码编译成本地代码
非常仔细地优化这些本地代码。同时程序仍然通过解释来执行字节码。并且只编译和优化那些 “热区”(10-20%代码) 虚拟机可以比传统的即时编译更注重优化性能.

    Java比C++更加面向对象,你可以测量它,可以发现方法启用的频度。动态派发的频度。这些Java程序的运行时特征,就是方法调用和动态派发的高频度发生。首先。每次动态
派发都会产生相关的管理费用。其次,更重要的是方法调用降低了编译器优化的有效性。 优化器在不同的方法里面不能够有效地工作,因此优化器在方法调用的时候就无法专注于代码
。方法调用频度越高,方法调用之间可以用来优化的代码代码就越少。优化器就变得越低效。解决这个问题的办法就是内嵌。把被调用方法的方法体直接拷贝到发起调用的方法中
。内嵌消除方法调用。带来的代码是需要更多的运行时内存。 在面向对象的语言中实现内嵌要比非面向对象的语言更加困难。因为面向对象语言使用了动态派发。在Java中比
C++更加严重。因为java的方法调用和动态派发频度要比C++高得多。一个C程序的标准优化表态编译器可以直接使用内嵌。因为每个函数都有一个函数实现。对于面向对象语言来说
。内嵌就变得复杂了。因为动态方法派发意味着函数调用可能有多个函数实现。换句话说。虚拟机运行时根据方法调用的对象类,可能会有很多个不同的方法实现可供选择。
内嵌一个动态派发的方法调用。一种解决方法就是把所有可能在运行被选择的方法实现都内嵌进去。这种思路的问题在于。如果有多个方法实现。就会让优化后的代码变得非常大
自适应编译比表态编译的优化就在于,因为它是在运行的工作,可以使用静态编译器所无法得到的信息。比如说,对于珍上特定的方法调用。就算有30个可能的方法实现。运行可能只会有其中的两个被调用
。自适应就可以只把这两个方法内嵌。有效减少优化后的代码大小。

  Java线程:
    Java程序不同的线程可以在不同的处理器上并行工作,。折中之一就是优先级考虑最小公分母问题。Java线程可以运行于10个优先级中的任何一个.
      每个线程都有一个工作内存,线程用它保存所使用和赋值的变量的“工作拷贝”。局部变量和参数,因为它们是每个线程私有的。可以从逻辑上看成是工作内存或者主存的一部分
      Java虚拟机规范定义了许多规则,用来管理线程和主存之间的低层次交互行为。比如。一条规则声明:所有对基本类型的操作,除了某些对long类型和double类型的操作之外
      ,都必须是原子级的。两个线程竞争,对于一个int变量定了不同的两个值,就算不存在同步,变量也会采用二都之一。但对于任何没有声明为volatile的long或者double变量
      某些实现可能把它们作为两个原子性的32位值对待.而非一个原子性的64位值。这样对于log或者double的非原子操作可能导致两个竞争性的线程在试图写入不同的值到一个long或者double变量的时候。
      最终得到的是一个不正确的结果。

      1.把变量的值从主存拷贝到它的工作内存
      2。把值从它的工作内存写回到主存

 

 Java Class文件
     一个class文件符合以下格式 
     minor_version
     major_version
     constant_pool_count
     constant_pool
     access_flags
     fields_count
     fields
     methods_count
     methods
     attributes_count
     attributes
     class
     classdescriptor
     property
     propertydescriptor
 类型的生命周期:

 Java虚拟机实现必须在每个类或接口首次主动使用时初始化
   当创建某个类的新实例(或者通过在字节码中执行new指令,或者通过不明确的创建,反射,克隆或反序列化
   当调用某个类的静态方法时(即在字节码中执行invokestatic指令时)
   当使用某个类或者接口的静态字段,或者对该字段赋值时.用final修饰的静态字段除外。它被初始化为一个编译时的常量表达式
   当调用Java API中的某些反射方法时,比如类class的方法或者java.lang.reflect 包中类的方法
   当初始化某个类的子类时(对于接口除外,只有在某个接口所声明的非常量字段被使用时,该接口才会被初始化,而不会因为实现这个接口的子接口
    或类要初始化而被初始化
   当虚拟机启动时某个被标识为启动类的类(即含有main()方法的那个类)
   除了以上六种,其他都是动调用。不会引发初始化

分享到:
评论

相关推荐

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。Java内存模型(JMM)规定了线程对共享变量的可见性和有序性,它通过主内存和工作内存的概念来实现多线程之间的协作...

    jdk,jvm源码

    2. 运行时数据区:包括堆、方法区、程序计数器、虚拟机栈和本地方法栈。堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令地址,虚拟机栈保存每个方法的局部变量、操作数栈等,本地方法栈为JNI...

    jvm 配置jvm参数

    根据操作系统限制,我们可能无法充分利用所有物理内存,因为32位系统通常限制JVM的最大堆大小在1.5GB到2GB之间。为了达到最优性能,我们可以按照以下步骤配置JVM参数: 1. **设置堆大小**:考虑到32位系统的限制,...

    jvm 启动过程 JVM 原理

    2. **验证**:加载后的字节码需要经过严格的验证,以确保其符合Java语言规范,不会对JVM造成破坏。验证包括格式验证、语义验证和类型检查等步骤。 3. **准备**:在验证通过后,JVM为类的静态变量分配内存,并赋予...

    JVM图解-JVM指令-JVM原型图.rar

    2. **JVM指令**: - JVM指令是字节码,每条指令对应一个特定的操作,如加载和存储变量、算术运算、控制流程、对象创建和方法调用等。 - 指令手册会列出所有这些指令,比如`iconst_5`表示将整数5压入操作数栈,`a...

    jvm 详细介绍,了解jvm各个组成部分和功能

    ### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...

    JVM中文指令手册.pdf

    2. push指令:对于int类型的其他数值,除了-1到5这些特殊情况外,可以使用带有参数的push指令(如bipush),将一个1字节(byte)的整数推送到操作数栈。push指令允许把更大范围的整数压入栈中,参数是具体的数值。 ...

    蚂蚁课堂-JVM快速入门2

    "蚂蚁课堂-JVM快速入门2"这个课程显然旨在帮助初学者迅速掌握JVM的基础知识,特别是关于JVM参数的设置和内存溢出问题的处理。 首先,我们来深入了解JVM参数。JVM参数是用来配置和调整JVM行为的关键工具。它们分为两...

    JVM 输出 GC 日志导致 JVM 卡住

    2. JVM 日志配置,包括 GC 日志、JIT 编译日志和 Safepoint 日志 3. Safepoint 机制和其在 JVM 中的应用 4. JVM 卡住的问题和解决方法 5. async_profiler 工具的使用 6. JFR(Java Flight Recording)技术 知识扩展...

    狂神说JVM探究.rar

    2. **类加载机制**: - 类的生命周期包括加载、验证、准备、初始化和卸载五个阶段。 - 双亲委派模型:类加载器在加载类时,会将任务委托给父类加载器,直到Bootstrap ClassLoader。 3. **内存区域**: - 程序...

    jvm视频及笔记

    2. **类装载机制**:包括加载、验证、准备、解析和初始化五个阶段,确保类的正确性和安全性。 3. **内存模型**:包括堆内存、栈内存、方法区(在Java 8之后变为元空间)、程序计数器、本地方法栈等,理解它们的作用...

    JVM必知必会

    #### 2. JVM与JRE、JDK的关系 - **JVM**:负责执行Class文件,是Java虚拟机。 - **JRE**:Java运行环境,包括JVM和Java的核心类库。 - **JDK**:Java开发工具包,包含JRE和编译、调试等开发工具。 #### 3. JVM的...

    jvm-mon基于控制台的JVM监视

    2. **GC活动追踪**:它会记录垃圾收集器的活动,如Minor GC和Major GC的触发次数、耗时,有助于理解垃圾回收对性能的影响。 3. **线程状态**:`jvm-mon`可展示当前运行的线程数量及状态,如RUNNABLE、WAITING、...

    (46页完整版)JVM体系结构与GC调优.zip

    46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    在Java开发领域,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。深入理解JVM的内核原理、诊断技巧以及优化方法对于提升应用性能至关重要。本教程——“深入JVM内核—原理、...

    慢慢琢磨jvm 经典

    2. **执行引擎**:作为解释器,负责解释JVM指令并提交操作系统执行。它是Java程序运行的实际执行者,将字节码转换为机器指令。 3. **本地接口**:允许Java程序调用非Java语言编写的函数,最初旨在整合C/C++代码。...

    JVM原理讲解和调优,详细讲解JVM底层

    JVM(Java虚拟机)是Java语言运行的基础,它负责执行Java字节码,并且是Java跨平台特性的关键实现。JVM的主要职责包括加载Java程序、验证字节码、将字节码转换成机器码执行、内存管理、垃圾回收和提供安全机制等。...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路; 4、基础知识讲解透彻、详尽; 5、JVM零基础也能听懂。 第一节:学习JVM的意义和目标 1.1 意义: 1.2 目标: 第二节:JVM内存模型 1.1 概念 1.2 ...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    2. **内存区域划分**:JVM内存分为堆内存和栈内存,其中栈内存又包括方法区、虚拟机栈、本地方法栈。堆内存用于存储对象实例,而栈内存则存储线程私有的局部变量、方法参数和运算结果。方法区存储类的信息,如常量池...

    JVM高级特性与最佳实践(第2版)源代码.zip

    《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机(JVM)技术的书籍,其源代码提供了丰富的实践案例和示例,帮助读者更直观地理解JVM的工作原理和优化技巧。以下是根据书名和描述所涉及的一些关键知识点...

Global site tag (gtag.js) - Google Analytics