java虚拟机之回收方法区】的更多相关文章

在java虚拟机中并没有规范规定需要对方法区即是新生代进行垃圾回收, 主要是这些区域的回收性价比极低, 一般在新生代中一般垃圾回收中可以达到70%到95%.   其中永久代中的垃圾回收主要回收的是两个部分, 一个部分是废弃的常量,判断一个常量是否废弃, 主要看这个常量在其他地方是否引用了这个字面量. 否则如果此时发生垃圾回收,即会回收这部分常量.   另外一部分是无用的类,判断一个类是否无用,主要看三点, 第一点是这个类的所有实例都被回收了,即是java堆中不存在该类的任何实例, 第二点是加载该…
和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢.字段.方法.常量池.方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多,方法区内存不够肯定会导致方法区溢出,虚拟机同样会抛出内存溢出信息.(内存溢出后面相关文章给大家总结) jdk6和jdk7中,方法区可以理解为永久区(Perm).永久区可以使用参数-XX:PermSize和-XX:MaxPermSize制定.默认情况下-XX:MaxPermSize为64MB.如果你…
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机,他终归要运行在物理机上 在操作系统中体现出来的也就是一个进程 操作系统会给他分配资源,割一块内存作为他的地盘 class文件是静态的,想要运行程序,JVM需要将class文件中的信息加载到加载到他的地盘 然后处理他可以处理的数据类型的数据   JVM将这块内存按照功能进行了更细的划分,不过终究是一个…
Java 虚拟机可以看作一台抽象的计算机,如同真实的计算机,它也有自己的指令集和运行时内存区域. Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存(运行时内存区域)划分为若干个不同的数据区域. 如下图所示: 一.程序计数器 Program Counter Register 1.定义:程序计数器是当前线程所执行字节码的行号指示器. 2.线程私有内存的原因:Java 中的多线程是线程间轮流切换并需要 CPU 给予时间片的方式实现的.在任何一个确定的时刻,都只有一个线程在执行指令.为了…
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期. 由此可见,一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期. 引用关系 加载器和Class对象: 在类加载器的内部实现中,用一个Java集合来存放所加载类的引用. 另一方面,一个Clas…
1.本章内容目录: 概述 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 实战:OutOfMemoryError异常 java堆溢出 虚拟机栈和本地方法栈溢出 方法区和运行时常量池溢出 本机直接内存溢出 2.本章具体内容: 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java…
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为的描述,而不是具体虚拟机的实现. 所有在虚拟机规范之中没有明确描述的实现细节,都不应成为虚拟机设计者发挥创造性的牵绊,设计者可以完全自主决定所有规范中不曾描述的虚拟机内部细节,例如:运行时数据区的内存如何布局.选用哪种垃圾收集的算法.是否要对虚拟机字节码指令进行一些内部优化操作(如使用即时编译器把字…
2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区域随着线程的创建而创建,随着线程的退出而销毁. 2.5.1 pc寄存器 java虚拟机支持多个线程同时执行.每个线程拥有自己的pc(program counter)寄存器.在任何时刻,一个线程只会执行一个方法,即线程的当前方法.如果执行的方法不是本地(native)方法,pc寄存器包含当前正在执行的…
类的生命周期 在开始本节之前让我们再来回顾下类的生命周期 没看过前6个过程的同学建议从头看下<深入java虚拟机学习 -- 类的加载机制>,这里就不再过多介绍了,着重说下类的卸载 类的卸载 当Sample类被加载.连接和初始化后,它的生命周期就开始了,当代表Sample类的Class对象不在被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的声明周期. 由此可见,一个类何时结束生命周期,取决于代表它的Class对象何时结束生命…
Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随线程的开始和结束而创建和销毁. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1 程序计数器 它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器. java虚拟机的多线程是通过轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多…
2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存控制的权利交给了java虚拟机,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄露和溢出问题.但是,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机内存运行过程,排查会很艰难.以下是整个java虚拟机运行的基本结构. 2-1 2.2 运行时数据区域 java虚拟机运…
一 数据类型 与 Java 程序语言中的数据类型相似,Java 虚拟机可以操作的数据类型可分为两类:原始类型(Primitive Types,也经常翻译为原生类型或者基本类型)和引用类型(Reference Types). 与之对应,也存在有原始值(Primitive Values)和引用值(Reference Values)两种类型的数值可用于变量赋值.参数传递.方法返回和运算操作. 二 原始类型与值 Java 虚拟机所支持的原始数据类型包括了数值类型(Numeric Types).布尔类型(…
java虚拟机体系结构 方法区 堆 java虚拟机栈 本地方法栈 方法区 java虚拟机编译的class文件中二进制数据类型解析数据存在方法区中 是所有线程共享 和存在数据的线程安全问题 当二个线程使用同一类并且类还被加载 则让一个线程加载 另一个 线程等待 java虚拟机栈 是线程私有的 既决定了线程的个数 存放的变量 对象引用 堆 是所有线程所共享 存放的是所有的对象 涉及到多线程的并发 对象的引用 直接引用 使用句柄引用 直接内存不是java虚拟机的一部分 加快GC的垃圾回收 但直接内存出…
java虚拟机学习笔记 Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.Java API和Java Class文件的配合.Java虚拟机实例负责运行一个Java程序.当启动一个Java程序时,一个虚拟机实例就诞生了.当程序结束,这个虚拟机实例也就消亡. java虚拟机结构图如下:          1.Java运行时数据区域 当类加载器将class文件加载到jvm后,Java虚拟机在执行java程序的过程中会把它管理的内存划分为…
之前由于考研,对于虚拟机的认识疏忽了太多,现在重新整理回顾一下. 如上图所示,jvm的内存区域(运行时数据区)共分为5处:方法区(Method Area).虚拟机栈(vm Stack).本地方法栈(Native Method Stack).堆(Heap)和程序计数器(Program Counter Register) 程序计数器:它是一块内存较小的区域,可以看成是线程所执行的字节码的行号指示器,字节码解释器运行时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令.在java虚拟机中,多线…
参考资料 JVM高级特性与最佳实践-周志明 HotSpot 虚拟机垃圾回收调优指导 JVM 标准(Java SE 8) JSR 133 Java平台内存模型与线程修订版 命令行工具 JDK Vs JRE JVM 结构 JVM 运行时数据区 程序计数器 每个 JVM 线程都有自己的程序计数器. 如果方…
Java虚拟机规范中规定不要求虚拟机在方法区实现垃圾收集,而且在方法区实现垃圾收集性价比确实很低.在堆中,尤其是新生代,一次垃圾收集可以回收75%-95%的空间,而永久代的垃圾回收效率远低于此. 永久代的垃圾收集主要回收两部分:废弃常量和无用的类.回收废弃常量与回收Java堆的对象非常相似. 以常量池的字面量的回收为例,例如字符串“abc”进入常量池,但是当前系统没有任何一个string对象引用常量池的字符串“abc”,也没有其他地方引用这个字面量,若此时发生回收,则“abc”常量将被回收.常量…
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java虚拟机垃圾回收(二) 垃圾回收算法>了解到Java虚拟机垃圾回收的几种常见算法,在<Java虚拟机垃圾回收(三) 7种垃圾收集器>了解到几种收集器的特点和应用等. 下面来了解总结前面的一些内容:…
前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 数据类型 java总共有两种数据类型:基本类型和引用类型.java虚拟机的设计目标是期望在运行前执行类型识别,并且通过编译器识别而不是jvm虚拟机本身.具体的类型如下所示: 基本类型: numeric,如int.float.double等 boolean,实际上boolean类型与int类型在jvm中的处理方式是一样的,也是8bit,true和false分别映射为1和0…
1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行中的虚拟机实例 Java虚拟机抽象规范仅仅是一个概念,在<The Java Virtual Machine Specification>中有详细的描述. 该规范的实现,可能来自多个提供商,并存在于多个平台上,它或者是全部由软件实现,或者是以硬件和软件相结合的方式来实现.JVM的实现有很多,广为使用…
栈:存放局部变量 堆:存放new出来的对象 方法区:存放类的信息,static变量,常量池(字符串常量) 在堆中,可以说是堆的一部分   创建了一个student类,定义了name属性, id静态变量 和一个study()方法程序运行的时候 java虚拟机会通过类加载器 将类的信息加载到虚拟内存中 存放在方法区里相当于一个类的模板 我们通过这个类的模板来创建对象,这个其实很好理解 我们没有定义类 类加载器加载不到类的信息 不能将这个对象实例化更直白一点,如果凭空new一个对象 编译的时候就会报错…
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身. 3.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 . 栈区:1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中2.每个栈中的数…
方法区和堆区是数据共享区. 栈区:数据不共享.方法参数.局部变量.参与运算的中间结果.返回值等等都在栈区中. 堆区:数据共享.存放对象. 方法区存放类型信息,类型信息包括:字段信息.方法信息.该类型的常量池.类变量.一个到类ClassLoader的引用,一个到Class类的引用.这部分数据是共享的,是一个Java虚拟机实例或者说一个Java程序共享的. 当一个类被多个不同的ClassLoader加载的时候,需要对ClassLoader标识.同时也要标识一个Class类,他的完全限定名. publ…
java栈帧还是需要一些数据支持常量池的解析.正常方法的返回和异常的处理.大部分的java字节码指令需要进行常量池的访问,在栈帧数据区中保存着访问常量池的指针,方便程序访问java常量池.如下图所示: 当函数返回或者程序出现异常的时候,jvm虚拟机必须恢复调用者函数的栈帧,并且让调用者函数继续执行.什么意思呢?举一个通俗的例子: a()调用b()当b()返回的时候肯定继续让a()继续执行对吧.b()抛出异常的时候a()肯定也需要处理对吧. 对于异常的处理,jvm是如何处理的呢?虚拟机肯定必须有一…
Java虚拟机在执行Java程序的过程中会把它管的内存划分为以下若干个不同的区域: 1.程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器:由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只能执行一个线程中的指令,因此为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器来记录线程之前执行到哪里了. 如果线程正在执行的是一个Java方法,这个计…
Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的数据区,也就是说每一个线程都有自己的这么一个区域存放自己的数据,而青色区域则是线程共享的,里面的数据为所有线程共有,原则上都有权限访问. 2.程序计数器: 用途:用来给程序导航指路的.这个是一块较小的内存空间,可以看做是当前线程执行的字节码的行号指示器.理解就是虚拟机把java源代码编译成了字节码,…
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机在Java程序运行时会将内存区域划分成若干个不同的区域,各自负责不同的职责,这些区域都有各自的用途. Java虚拟机运行时数据区分为以下几个部分. 方法区.虚拟机栈.本地方法栈.堆.程序计数器,如下图所示: 图片来源于网络如有侵权请私信删除 2.2.1 程序计数器 程序计数器是一块较小的内存空间,可以看作当前…
1.虚拟机实例 每个java程序都运行在自己的java虚拟机实例中,运行三个java程序就会得到三个虚拟机实例 守护线程(虚拟机自己使用,比如说执行垃圾收集任务的线程) 非守护线程(java初试线程,启动main方法的主线程,以及main中启动的的其他线程) java虚拟机实例生命周期:当程序的所有非守护线程终止,虚拟机实例也会跟着退出,只要还有任何非守护线程在运行,那么这个java程序也在运行(虚拟机仍然存活) JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(me…
运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用途.以及创建和销毁时间.有的随着虚拟机启动而启动,有的区域则依赖java线程的启动和结束来建立和销毁. Java虚拟机运行时数据区图如下(来自深入理解Java虚拟机:jvm的高级特性和实践): 以下对运行时数据区的各个区域做相应的解释: 程序计数器 程序计数器是一个较小的内存空间,可以把它看做当前线…
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途.各自的创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程启动和结束而建立和销毁. 根据<Java虚拟机规范(第2版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 线程共有:方法区.堆 线程私有:Java虚拟机栈.本地方法栈.程序计数器 下面分别来了解一下这几个区域. 一.程序计数器(Program Counter Register)…