如何写论文?写好论文?免费论文网提供各类免费论文写作素材!
当前位置:免费论文网 > 美文好词 > 优质好文 > java虚拟机详解

java虚拟机详解

来源:免费论文网 | 时间:2017-05-25 05:38 | 移动端:java虚拟机详解

篇一:《深入理解Java虚拟机》笔记

《深入理解Java虚拟机》笔记

一、内存管理

1、运行时的内存区域

线程私有:虚拟机栈、本地方法栈、程序计数器

线程共享:堆、方法区

2、各个内存区域可能抛出的异常

1、当单线程时,栈的深度太大,会发生StackOverflowError,比如无穷的递归调用。

2、当多线程时,若不停地创建线程,则会导致OutOfMemoryError,因为除去堆和方法区之外,剩下的栈总空间是有限的,不停创建线程则会不停申请栈空间,最终会导致内存溢出。

当不停地创建(new)对象时,会导致OutOfMemoryError

方法区

运行时产生大量的类,去填满方法区,比如用CGLib去无穷生成类。

直接内存

使用Unsafe分配本机内存时,可能导致OutOfMemoryError。

3、各个内存区域容量设置的参数

-Xss2M:设置栈的容量为2M

-Xms10M:设置堆的初始容量为10M

-Xmx10M:设置对的最大容量为10M

-XX:PermSize=10M:设置方法区的初始容量为10M

-XX:MaxPermSize=10M:设置方法区的最大容量为10M

-XX:MaxDirectMemorySize=10M:设置直接内存的最大容量为10M

4、对象的创建

如何在堆中分配内存

根据内存是否规整,即GC收集器是否带有压缩整理功能,分为指针碰撞和空闲列表两种。

如何处理内存分配冲突

1、CAS+失败重试;2、TLAB,即本地线程分配缓冲。

对象在内存中的布局

对象头(哈希码、GC分代年龄、所状态标志等)、实例数据、对象填充

如何访问对象

1、通过句柄(栈上的指针指向句柄,句柄中分别有指向对象的指针,和指向类信息的指针)

2、直接指针(栈上的指针直接指向堆中的对象,对象中头部有一个类型指针,指向类型信息)

5、对象存活判定

即如何判断一个对象所占用的内存是否该回收?

有两种方法:1、引用计数法;2、可达性分析法。

引用计数法

该方法容易出现循环引用的问题,JVM并未采用。

可达性分析法

判断是否能从GCRoots中找到一条到达该对象的路径。

GCRoots包括:栈中变量引用的对象、方法区中静态属性(static)引用的对象、方法区中常量(final)引用的对象。

6、垃圾回收

引用的种类

1、强引用:通常new出来的对象的引用都是强引用。

2、软引用(SoftReference):如果某次回收完之后,还是可能发生内存溢出,则进行第二次回收,在第二次回收时会回收软引用,若这次回收后仍是内存不够,这时候才发生内存溢出。

3、弱引用(WeakReference):其指向的对象只能生存到下一次垃圾收集之前,无论当前内存是否足够,都会回收弱引用指向的对象。

4、虚引用(PhantomReference):设置虚引用的目的可能是为了,在该对象被回收前能够得到一个系统通知。

finalize方法

若某类覆盖了该方法,则其对象再被回收前会调用此方法(仅限于第一次回收该对象时)。

方法区的回收

废弃的常量:当前系统中没有一个对象引用此常量。

无用的类:堆中不存在该类的任何实例,该类的类加载器已被回收,该类的Class对象没有在任何位置被引用。

垃圾收集算法

1、JVM整体上是采用“分代收集算法”。

根据对象的存活周期的不同将Java堆分为新生代和老年代。

新生代又分为Eden区,Survivor From区,Survivor To区,其大小比例默认为8:1:1。

Java的方法区被定义为永久代

2、对于新生代,一般采用“复制算法”。因为新生代的存活时间相对较短,复制的时候不会复制太多对象,所以整体效率不至于太低。

当从Eden和Survivor From区向Survivor To区复制时,若Suvivor To区的空间不够,则需要依赖老年代进行“分配担保”。

3、对于老年代,一般采用“标记-清除”(容易产生内存碎片)或“标记-整理”算法。因为老年代的对象存活率较高,若仍是采用复制操作,则需要复制的对象太多,效率会很低。

4、Stop The World

在判断对象是否应该被回收时,是通过GCRoots来判断的。

当枚举GCRoots时,不可以出现在分析过程中,对象的引用关系还在不断发生变化,所以这时候必须停顿所有线程,这种现象称为“Stop The World”。

5、安全点和安全区域

安全区域是指:在这段代码片段内,引用关系不会发生变化。

6、内存分配和回收策略

对象优先在Eden区分配,若内存不够则进行一次Minor GC,将Eden区的活跃对象复制到Survivor To区。

若Survivor To区大小足够,则将其中的存活对象的GC年龄加1,并判断是否应该晋升到老年代区。

若Survivor To区大小不够,则进行分配担保,将对象复制到老年代。

若此时老年代内存大小不够,则进行一次Full GC。

垃圾收集器

Serial:新生代收集器,单线程收集器,采用复制算法。

ParNew:新生代收集器,多线程收集器,采用复制算法。

Parallel Scavenge:新生代收集器,多线程收集器,侧重于提高程序运行的吞吐量。

Serial Old:老年代收集器,单线程收集器,采用标记-整理算法。

Parallel Old:老年代收集器,多线程收集器,采用标记-整理算法。

由于多线程的老年代收集器可以充分利用服务器多CPU的处理能力,所以常用Parallel

篇二:Java虚拟机工作原理

As the Java Virtual Machine is a stack-based machine, almost all of its instructions involve the operand stack in some way. Most instructions push values, pop values, or both as they perform their functions.

Java虚拟机是基于栈的(stack-based machine)。几乎所有的java虚拟机的指令,都与操作数栈(operand stack)有关.绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。

1 Java体系结构介绍

Javaís architecture arises out of four distinct but interrelated technologies, each of which is defined by a separate specification from Sun Microsystems:

1.1 Java体系结构包括哪几部分?

Java体系结构包括4个独立但相关的技术

the Java programming language ?程序设计语言

the Java class file format ?字节码文件格式

the Java Application Programming Interface?应用编程接口

the Java Virtual Machine ?虚拟机

1.2 什么是JVM

java虚拟机和java API组成了java运行时。

1.3 JVM的主要任务。

Java虚拟机的主要任务是装载class文件并执行其中的字节码。

Java虚拟机包含了一个类装载器。

类装载器的体系结构

二种类装载器

启动类装载器

用户定义的类装载器

启动类装载器是JVM实现的一部分

当被装载的类引用另外一个类时,JVM就是使用装载第一个类的类装载器装载被引用的类。

1.4 为什么java容易被反编译?

? 因为java程序是动态连接的。从一个类到另一个类的引用是符号化的。在静态连接的

可执行程序中。类之间的引用只是直接的指针或者偏移量。相反在java的class文件中,指向另一个类的引用通过字符串清楚的标明了所指向的这个类的名字。

? 如果引用是指向一个字段的话。这个字段的名字和描述符(字段的类型)会被详细说明。 ? 如果引用指向一个成员方法,那么这个成员方法的名字和描述符(方法的返回值类型,

方法参数的数量和类型)会被详细说明。

? 包含对自己字段和成员方法的符号引用。

? 包含可选的调试信息。(包括局部变量的名称和类型)

1.5 垃圾回收器缺点:

无法确认什么时候开始回收垃圾,无法确认是否已经开始收集,也无法确认要持续多长时间 2 平台无关

3 安全

4 网络移动性

5 Java虚拟机

?

?

?

? 每个JVM都有一个类装载子系统。 运行时数据区:方法区,堆,java栈,pc寄存器,本地方法栈 每个JVM实例都有一个方法区和堆。他们是由该虚拟机中所有线程共享的。 每个线程都会得到自己的pc寄存器和java栈,

? pc寄存器的值指示下一条将被执行的指令。

? java栈记录存储该线程中java方法调用的状态。(包括局部变量,参数,返回值,

运算的中间结果。)

? 这些内存区域是私有的。任何线程都不能访问另一个线程的pc寄存器和java栈 java栈由许多栈帧组成。一个栈帧包含一个java方法的调用的状态。

? 当线程调用一个方法的时候,虚拟机压入一个新的栈桢到该线程的java栈中。 ? 当方法返回时,这个栈桢被从java栈中弹出并抛弃。

引用有3中,类类型,接口类型,数组类型。

JVM中,最基本的数据单元是字。至少选择32位作为字长。

JVM有两种类装载器:

? 启动类装载器(JVM实现的一部分,每个JVM都必须有一个)

? 用户自定义的类装载器(JAVA程序的一部分,必须继承java.lang.CloassLoader)。 由不同的类装载器装载的类被放在虚拟机内部的不同的命名空间中。

方法区: ? 大小不固定,根据需要动态调整

? 方法区可以被垃圾回收

? 包含

? 提取装载的类的信息,放到方法区

? JVM总能通过存储于方法区的内存信息来确定一个对象需要多少内存

? 类的静态变量也放到方法区。

? 虚拟机为装载的每个类存储如下信息:

? 这个类型的全限定名 ? ? ? ? ? ?

?

?

?

? ?

?

?

?

?

?

?

? 堆 这个类型的直接超类的全限定名 这个类型是类类型还是接口类型 这个类的访问权限修饰符 任何直接超接口的全限定名的有序列表 该类型的常量池 ? 该类型所用常量的一个有序集合,包括直接常量(String,Integer,floating point),和对其他类型,字段,方法的符号引用 字段信息 ? 字段名 ? 字段类型 ? 字段的修饰符 ? 声明的顺序 方法信息 ? 方法名 ? 方法的返回值类型 ? 方法的参数和类型,顺序 ? 方法的修饰符 ? 方法的操作码 ? 操作数栈和该方法的栈帧中局部变量区的大小 ? 异常表 除了常量以外的所有类(静态)变量 一个到类CloassLoader的引用 一个到Class类的引用 方法表 ? 虚拟机为每一个装载的非抽象类都生成一个方法表

?

? 一个java程序独占一个JVM,一个JVM中只存在一个堆。所以,每个java

程序有它自己的堆,但同一个java程序的多个线程共享一个堆

? 运行时创建的所有类实例

? 数组对象

? 垃圾回收器

? 回收内存

? 移动对象以减少碎片

? 不必是连续的内存,可以动态的扩展和收缩

? 一个JVM的实现的方法区可以在堆顶实现

? 栈帧frame

? 栈帧由3部分组成:局部变量区,操作数栈,帧数据区。

? 局部变量区,操作数栈的大小在编译的时候就确定了。

? 局部变量区(variable Table)

? 以字长为单位,从0开始计数的数组。

? int,float,reference,return address只占据一个字长

? byte,short,char存入数组前转换成int,占据一个字长

? long,double占据2个字长。

篇三:Java学习教程-Java虚拟机一览表

免费和开源的 Java 虚拟机

磨砺营IT教育版权所有

磨砺营IT教育版权所有

收费虚拟机实现

? a fully compliant Java Virtual Machine based on HotSpot

that uses the Azul C4 (Continuously Concurrent Compacting Collector) garbage collector. Supports memory heaps of 100s of GB without GC pauses and is able to grow and shrink the heap based on load.

? CEE-J is a of Sun's Java technology, Skelmir

is not a licensee of Oracle.

?

? Excelsior JET is a licensed Java SE implementation with AOT compiler Hewlett-Packard, Java for HP-UX, OpenVMS, Tru64 and Reliant (Tandem) UNIX

platforms

? J9 (IBM), for Windows, AIX, Linux (x86 and PPC), MVS, OS/400, Pocket PC,

z/OS

?

? "Classic JVM" for IBM OS/400 (superseded by J9) Imsys AB provides their SNAP (Simple Network Application Platform) JVM

running on their proprietary IM1000 and IM3000 microprocessors that feature microcode execution of Java byte codes.

磨砺营IT教育版权所有

比较偏门的专有虚拟机实现

磨砺营IT教育版权所有

?

?

?

? (Tao Group) Novell, India. NSIcom CrE-ME PreonVM (Virtenio) A VM for embedded systems and small devices.

磨砺营IT教育版权所有


java虚拟机详解》由:免费论文网互联网用户整理提供;
链接地址:http://www.csmayi.cn/meiwen/42334.html
转载请保留,谢谢!
相关文章