`
bblove9800
  • 浏览: 2371 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM简单介绍

    博客分类:
  • java
阅读更多

1.JVM内存管理的机制

  内存空间划分为:Sun JDK在实现时遵照JVM规范,将内存空间划分为堆、JVM方法栈、方法区、本地方法栈、PC寄存器。

  • 堆: 堆用于存储对象实例及数组值,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中对象所占用的内存由GC进行回收,在32位操作系统上最大为2GB,在64位操作系统上则没有限制,其大小可通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于1GB,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例;当空余堆内存大于70%时,JVM会减小Heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRatio=来指定这个比例,对于运行系统而言,为避免在运行时频繁调整Heap 的大小,通常将-Xms和-Xmx的值设成一样。
  • JVM方法栈: 为线程私有,其在内存分配上非常高效。当方法运行完毕时,其对应的栈帧所占用的内存也会自动释放。当JVM方法栈空间不足时,会抛出StackOverflowError的错误,在Sun JDK中可以通过-Xss来指定其大小。
  • 方法区: 要加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。方法区域也是全局共享的,在一定条件下它也会被GC,当方法区域要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。在Sun JDK中这块区域对应Permanet Generation,又称为持久代,默认最小值为16MB,最大值为64MB,可通过-XX:PermSize及-XX:MaxPermSize来指定最小值和最大值。
  • 本地方法栈: 用于支持native方法的执行,存储了每个native方法调用的状态。在Sun JDK的实现中,和JVM方法栈是同一个。
  • PC寄存器: 占用的可能为CPU寄存器或操作系统内存。

2.Java堆和栈的区别

  Java把内存划分成两种:一种是栈内存,一种是堆内存。

  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

  堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

  引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。但是在写程序的时候,可以人为的控制。

3.Java内存泄露和内存溢出

  内存泄漏:分配出去的内存回收不了

  内存溢出:指系统内存不够用了

4.Java类加载机制

  JVM将类加载过程划分为三个步骤:装载、链接和初始化。

  1. 装载(Load):装载过程负责找到二进制字节码并加载至JVM中,JVM通过类的全限定名(com.bluedavy. HelloWorld)及类加载器(ClassLoaderA实例)完成类的加载;
  2. 链接(Link):链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量及解析类中调用的接口、类;
  3. 初始化(Initialize):执行类中的静态初始化代码、构造器代码及静态属性的初始化。

5.内存回收

  收集器:引用计数收集器、跟踪收集器

  • 引用计数收集器:对于Java这种面向对象的会形成复杂引用关系(如ObjectB和ObjectC互相引用)的语言而言,引用计数收集器不是非常适合,Sun JDK在实现GC时也未采用这种方式。
  • 跟踪收集器实现算法:复制(Copying)、标记-清除(Mark-Sweep)和标记-压缩(Mark-Compact)

  复制:当要回收的空间中存活对象较少时,复制算法会比较高效,其带来的成本是要增加一块空的内存空间及进行对象的移动。

  标记-清除:在空间中存活对象较多的情况下较为高效,但由于标记-清除采用的为直接回收不存活对象所占用的内存,因此会造成内存碎片。

  标记-压缩:在标记-清除的基础上还须进行对象的移动,成本相对更高,好处则是不产生内存碎片。

分享到:
评论

相关推荐

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

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

    Linux简单调优与JVM参数.docx

    本文主要介绍了 Linux 服务器调优和 JVM 参数调优的相关知识点,以便提高服务器性能和 JVM 应用程序的运行效率。 Linux 服务器调优 Linux 服务器调优是指对 Linux 操作系统的配置和调整,以提高服务器的性能和稳定...

    jvm监控工具介绍

    jps(Java Process Status)简单易用,用于列出系统中所有运行的JVM进程及其ID、启动路径等信息,是检查Java应用程序是否正常运行的快速方法。 8. **jstatd**: jstatd是JVM监控服务,它基于RMI(Remote Method ...

    jvm 调优的详细介绍

    本文将详细介绍几种常用的垃圾收集(GC)策略及其配置方法,并深入探讨如何针对不同的应用场景选择合适的策略。 #### 常见的GC策略 在Java虚拟机中,垃圾收集主要分为两大阶段:新生代垃圾收集和老年代垃圾收集。...

    Java JVM Instruction Set

    为了更好地理解JVM的工作原理,我们将通过一个简单的例子来逐步分析。 ##### Java考虑因素 在设计JVM时,考虑到Java语言的特点,如面向对象、自动垃圾回收等特性,JVM的设计需要能够支持这些特性。 ##### 如何...

    idea插件JVM内存工具JProfiler11

    总结来说,Idea插件JProfiler11是Java开发者的得力助手,它将复杂的JVM内存管理和性能优化变得简单易行。熟练掌握JProfiler11的使用,不仅可以提高Java应用的性能,也能提升开发者的专业技能。在日常开发中,适时...

    JVM指令手册详细完整版.pdf

    每个系列命令都有其特定的功能和用途,下面我们将逐一详细介绍每个系列命令的作用和用法。 一、未归类系列 未归类系列命令主要包括nop命令和aconst_null命令。nop命令的作用是啥都不做,而aconst_null命令的作用是...

    jvm常用命令工具

    本篇文章将详细介绍以下几个核心的JVM命令工具及其使用方法: 1. **jps** - 显示系统中所有HotSpot虚拟机进程。 2. **jstat** - 收集HotSpot虚拟机各方面的运行数据。 3. **jstack** - 显示虚拟机的线程栈信息。 4....

    JVM JMX java

    MBeans可以是简单的数据结构,也可以包含操作和通知,使得开发者能够远程控制和监控应用。 1. **MBeans**:MBeans是JMX的核心,可以是标准MBean、开放MBean或模型MBean,它们提供了管理接口。 2. **MBean服务器**...

    java虚拟机(jvm)介绍以及相关参数设置与调优

    "java虚拟机(jvm)介绍以及相关参数设置与调优" Java虚拟机(JVM)是Java平台的核心组件之一,它提供了一个运行Java字节码的环境,并且负责管理Java程序的内存分配和垃圾回收。在本文中,我们将深入探讨Java虚拟机...

    北航云计算公开课07 JVM Internal

    在讨论JVM之前,邓侃博士首先介绍了CPU的基本工作原理以及程序如何在CPU上执行。CPU是计算机的大脑,负责执行指令集中的命令,控制计算机的运行。现代处理器可以分为两大类:CISC(复杂指令集计算)和RISC(精简指令...

    tomcat7安装使用及jvm连接数参数调优

    下面我们将介绍 Tomcat7 的安装使用及 JVM 连接数参数调优。 一、Tomcat7 安装 Tomcat7 的安装相对简单,主要需要下载 Tomcat7 的安装包,然后解压缩并配置环境变量。下载 Tomcat7 安装包的方法有多种,例如可以从...

    JVM 字节码从入门到精通

    因此,本文从最简单的Java程序——打印"Hello, World"开始,逐步介绍如何将Java源文件编译成字节码文件,以及字节码文件中所包含的一些基本信息。 首先,我们需要编写一个简单的Java程序(Hello.java),程序中包含...

    JVM学习札记

    本文详细介绍了JVM的基本运行机制、调试参数、垃圾收集算法以及监控和锁的应用等内容。深入理解这些知识点对于高效开发和维护Java应用程序至关重要。通过对JVM的工作原理有一个清晰的认识,开发者可以更好地优化程序...

    pact-jvm-model_2.10-2.1.2.zip

    本文将详细介绍这两个工具,以及它们如何帮助开发者构建更高质量的Java应用。 首先,我们关注"Pact JVM Model 2.10"。Pact是一种契约测试框架,主要用于微服务之间或客户端与服务器之间的交互验证。Pact-JVM是Pact...

    JVM问题定位的典型案例分析

    其中,重点介绍了一种新的写入提前日志(Write-Ahead Log,简称WAL)设计——无锁WAL机制。该机制旨在提高InnoDB处理高并发事务时的性能,并减少因单个锁造成的性能瓶颈。案例中的部分内容虽然提到的是MySQL数据库的...

    jvm工具、参数调优&调试技巧

    以上介绍的各种JVM工具和参数对于Java开发人员来说是非常重要的,它们能够帮助我们更好地理解和管理JVM的行为,从而提高应用程序的性能和稳定性。在实际应用中,根据具体情况选择合适的工具和参数进行配置和调优是...

    JVM常用的GC策略介绍

    本文将详细介绍几种在JDK 1.7中常用的垃圾收集算法、策略以及垃圾收集器,帮助读者更深入地理解JVM是如何高效执行内存回收工作的。 #### 二、典型垃圾收集算法 垃圾收集算法决定了如何识别和回收不再使用的对象,...

Global site tag (gtag.js) - Google Analytics