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

JVM初探与设置

    博客分类:
  • JAVA
 
阅读更多
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。编译虚拟机的指令集与编译微处理器的指令集非常类似。

一般的高级语言要在不同的机器上运行,需要编译成不同的目标代码。Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

指令系统

同计算机的指令系统类似。java 指令也是由操作码和操作数两部分组成。操作码为8位二进制数,操作数紧随在操作码的后面,其长度根据需要而不同。


操作码例子: 如iload表示从存储器中装入一个整数,anewarray表示为一个新数组分配空间,iand表示两个整数的"与",ret用于流程控制,表示从对某一方法的调用中返回


JVM寄存器

JVM只设置了4个最为常用的寄存器

pc程序计数器

optop操作数栈顶指针

frame当前执行环境指针

vars指向当前执行环境中第一个局部变量的指针

所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。

JVM栈结构

作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以下三类信息:

局部变量

执行环境

操作数栈

局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量


执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。


操作数栈用于存储运算所需操作数及运算的结果。

JVM碎片回收堆

Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险

JVM存储区


JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定,依赖于具体平台的实现方式。JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平台独立性的基础。




当jvm运行起来的时候,它会向系统申请一片内存区(不同的jvm实现可能不同,有些可以使用虚拟内存),将这块内存分出一部分存储许多东西,例如:程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之为“运行时数据区”, 运行时数据区可以划分成方法区、堆、java栈、pc寄存器、本地方法栈。





————————————————————————————————————————————————————————————————————————————

Java命令行参数

1.DisableExplicitGC

java API中有提供显示垃圾清除的方法: System.gc();

但是显式垃圾收集是一个非常糟糕的主意,所以提供了禁用的标志;

-XX:+DisableExplicitGC   。此标志自动将System.gc()调用转换成一个空操作

2.HeapDumpOnOutOfMemoryError


抛出OutOfMemoryError时捕获讯息。运行该命令通知JVM拍摄一个“堆转储快照”,并将其保存在一个文件中以便处理,通常使用jhat实用工具查看。

-XX:+HeapDumpOnOutOfMemoryError

3.bootclasspath


-Xbootclasspath使您可以设置完整的引导类路径(这通常包括一个对rt.jar的引用),以及一些其他JDK附带的(不是rt.jar的一部分)JAR文件。-Xbootclasspath/p将值前置到现有bootclasspath中,并将-Xbootclasspath/a附加到其中。

例如,如果您修改了库中的java.lang.Integer,并将修改放在一个子路径mods下,那么-Xbootclasspath/amods参数将新Integer放在默认的参数前面。

4.verbose

对于虚拟的或任何类型的Java应用程序,-verbose是一个很有用的一级诊断使用程序。该标志有三个子标志:gc、class和jni。

gc -- 寻找是否 JVM 垃圾收集器发生故障或者导致性能低下

class -- 想要诊断ClassLoader和/或不匹配的类冲突

jni - 除了使用JNI或本地库时。打开时,它将报告各种JNI事件,比如,本地库何时加载,方法何时弹回;再一次强调,在不同JVM版本中,输出会发生变化。

5. Command-line-X


运行命令行参数-X,列出JVM提供的所有非标准(但大部分都是安全的)参数—例如:

-Xint,在解释模式下运行JVM(对于测试JIT编译器实际上是否对您的代码起作用或者验证是否JIT编译器中有一个bug,这都很有用)。

-Xloggc:,和-verbose:gc做同样的事,但是记录一个文件而不输出到命令行窗口。


参考:  http://baike.baidu.com/view/160708.htm

              http://developer.51cto.com/art/201010/229659.htm


分享到:
评论

相关推荐

    JVM初探- 内存分配、GC原理与垃圾收集器

    JVM内存管理是Java虚拟机的核心机制之一,其主要包含对象的创建、内存分配、...通过对内存分配策略、对象生死判定、垃圾收集算法和垃圾收集器的理解与应用,可以更好地掌握JVM的内存管理,从而提升应用性能和稳定性。

    JVM初探内存分配GC原理与垃圾收集器共16页.pdf.z

    GC的调优涉及多个方面,包括设置合适的堆大小、选择合适的收集器、调整新生代与老年代的比例、优化并发比等。这需要根据具体应用的特性进行细致的测试和调整。 最后,垃圾收集的过程通常包括以下阶段:初始标记、...

    初探JVM内存区域

    【初探JVM内存区域】 Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java应用程序提供了运行环境。理解JVM内存区域对于优化Java应用性能至关重要。本篇文章将详细探讨JVM中的主要内存区域及其作用。 1. **...

    基于计算机软件开发的JAVA编程应用初探.pdf

    在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的...

    HelloWorld的javap -verbose HelloWorld 字节码初探

    4. **字节码与源码的关系**:探讨源码如何被编译成字节码,以及字节码如何在JVM上运行,解释编译时优化和运行时优化的区别。 5. **案例分析**:“HelloWorld”程序的字节码分析,展示一个简单程序在JVM内部的执行...

    初探ASM

    4. **混淆与优化**:ASM也可以用于代码混淆,通过改变方法名、变量名和字节码序列,使得代码难以被逆向工程。同时,可以通过ASM进行代码优化,比如去除无用的代码或提升常量。 5. **应用实例**:作者可能会给出一些...

    Java本地接口工作方式初探

    Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...

    eclipse 下实现java JNI 初探

    JNI是一种规范,它定义了Java虚拟机(JVM)如何与本地代码(如C和C++)交互。通过JNI,Java开发者可以编写混合模式的应用程序,结合Java的跨平台性和本地代码的高效性。 2. **环境准备** - **安装JDK**:首先确保...

    初探Druid连接池之三——进入内置监控页面(连接数据源后)

    这篇博客“初探Druid连接池之三——进入内置监控页面(连接数据源后)”将引导我们深入了解如何在实际应用中启用并使用Druid的监控功能。 首先,Druid连接池的核心优势在于其对数据库连接的精细化管理,包括连接...

    基于游戏开发的Java语言教学初探.docx

    ### 基于游戏开发的Java语言教学初探 #### 教学设想及开发工具 ##### 教学设想 为了提高学生对Java编程的兴趣并增强其实战能力,本教学方案提出了将游戏开发融入到Java语言教学中的想法。通过游戏开发项目,不仅...

    2022年初探Java类加载机制Java教程.docx

    Java类加载机制是Java虚拟机(JVM)中的一种机制,负责将类从字节码文件加载到内存中,并将其转换为可执行的类对象。在Java中,类加载机制是通过ClassLoader来完成的,该机制在JDK 1.2以后变得更加复杂和灵活。 类...

    基于DeepLearning4J on Spark深度学习方法在药用植物图像识别中应用初探.pdf

    本研究中所使用的DeepLearning4J是一个开源的Java深度学习库,它允许Java和JVM语言开发者使用深度学习技术。基于Spark平台上的DeepLearning4J使得开发者可以利用Spark的分布式计算能力来训练和部署大规模的深度学习...

    初探Java类加载机制

    今天我们就来探讨一下在jvm中这些机制是怎样运行的。让我们假设有一个class字节码文件(比如Hello.class文件),那么在应用程序中,他是如何被加载进来,并形成一个类对象的呢?我们这篇文章的目的就是为了解释这个...

    java实现简单投票程序

    它的设计理念是“一次编写,到处运行”,因为Java代码会被编译成字节码,可以在任何支持Java虚拟机(JVM)的平台上运行。 接着,我们来看“投票程序”的概念。在计算机科学中,投票程序通常包含以下功能: 1. 注册...

    第一章 初识Java1

    ### Java编程语言初探 #### 一、Java编程语言简介 Java是一种广泛使用的高级编程语言,以其跨平台性、易学性和广泛的就业前景而著称。它最初由Sun Microsystems(后被Oracle收购)的詹姆斯·高斯林(James Gosling...

    计算机软件开发中JAVA编程语言及其实际应用.pdf

    更重要的是,Java语言编写的应用可以在任何安装了Java虚拟机(JVM)的平台上运行,这使得它成为跨平台开发的理想选择。Java虚拟机的跨平台特性使得Java开发的应用能够在不同的操作系统和硬件环境下无缝迁移和部署,...

    library.zip

    《Java Web图书馆课程设计——基于Eclipse、MySQL与Tomcat的初探》 在IT行业中,Java Web技术作为企业级应用的重要开发平台,一直是程序员学习的热点。本课程设计项目"library.zip"就是一个很好的入门实践,它利用...

    jetty指导书

    类加载器是Java虚拟机(JVM)中的一个重要组成部分,负责加载应用程序所需的类。在Jetty中,类加载器的正确配置对于避免类加载冲突等问题至关重要。 **7.2 如何使用** 在Jetty中,可以自定义类加载器策略,例如...

    jdk1.7.0_55-part1.zip

    《Java开发工具包JDK 1.7.0_55初探》 JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的重要工具集,它包含了编译器、运行环境、调试器以及各种实用工具。在Java编程的世界里,JDK扮演着不可或...

Global site tag (gtag.js) - Google Analytics