JVM简介及JVM内存管理机制

一、JVM简介

JVMJava Virtual MachineJava虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的

计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成, 首先来说一下JVM工作原理中

的jdk这个东西, .JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的

Java运行环境,因此也就虚拟计算机. 操作系统装入JVM是通过jdk中Java.exe来完成。

通过下面4步来完成JVM环境.

1.创建JVM装载环境和配置

2.装载JVM.dll

3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例

4.调用JNIEnv实例装载并处理class类。 

对于JVM自身的物理结构,我们可以从下图了解:


二、JVM内存管理

JVM的一个重要的特征就是它的自动内存管理机制,在执行一段Java代码的时候,会把它所管理的内存划分

成几个不同的数据区域,其中包括:

1.   程序计数器,众所周知,JVM的多线程是通过线程轮流切换并分配CPU执行时间的方式来实现的,那么每一

个线程在切换后都必须记住它所执行的字节码的行号,以便线程在得到CPU时间时进行恢复,这个计数器用于记

录正在执行的字节码指令的地址,这里要强调的是“字节码”,如果执行的是Native方法,那么这个计数器应该为null;

2.   Java计算栈,可以说整个Java程序的执行就是一个出栈入栈的过程,JVM会为每一个线程创建一个计算栈,

用于记录线程中方法的调用和变量的创建,由于在计算栈里分配的内存出栈后立即被抛弃,因此在计算栈里不存

在垃圾回收,如果线程请求的栈深度大于JVM允许的深度,会抛出StackOverflowError异常,在内存耗尽时会抛

出OutOfMemoryError异常;

3.   Native方法栈,JVM在调用操作系统本地方法的时候会使用到这个栈;

4.   Java堆,由于每个线程分配到的计算栈容量有限,对于可能会占据大量内存的对象,则会被分配到Java堆中,

在栈中包含了指向该对象内存的地址;对于一个Java程序来说,只有一个Java堆,也就是说,所有线程共享一个

堆中的对象;由于Java堆不受线程的控制,如果在一个方法结束之后立即回收这个方法使用到的对象,并不能保

证其他线程是否正在使用该对象;因此堆中对象的回收由JVM的垃圾收集器统一管理,和某一个线程无关;在

HotSpot虚拟机中Java堆被划分为三代:

o   新生代,正常情况下新创建的对象会被分配到新生代,但如果对象占据的内存足够大以致超过了新生代的容量

限制,也可能被分配到老年代;新生代对象的一个特点是最新、且生命周期不长,被回收的可能性高;

o   老年代,除了上述所说的大对象会被直接分配在老年代之外,一个在新生代的对象历经多次垃圾回收之后,也

会被直接拷贝至老年代,当然老年代的容量要比新生代大得多;

永久代,永久代并不存储对象,而是存储一些JVM加载的类信息、常量、静态变量、JIT编译后生成的代码等,

JVM也会在内存空间不足的情况下对永久代进行回收。

5.  直接内存,自JDK1.4新加入NIO类之后,Java程序便可以使用Native函数库直接分配堆外内存,然后通过一

个存储在堆中的DirectByteBuffer对象来对这块内存的引用进行操作;直接内存的容量不受堆容量的限制。

JVM基于堆(Heap)和栈(Stack)的内存分配的优缺点:

栈:Java栈的分配和线程绑定在一起,创建线程时,JVM创建一个新的的Java栈。栈中主要存放基本类型变量

(int、short、long等)和对象引用。优点:存取速度快,数据能够共享。缺点:生命周期固定, 缺乏灵活性。

堆:Java的堆是一个运行时数据区域,通过new、newarray等建立,由GC负责回收。优势动态分配内存大小,

生存周期不用预先告知编译器,缺点:运行时分配,储存速度较慢。

JVM内存限制(最大值):

首先JVM内存限制于实际的最大物理内存,假设物理内存无限大,JVM内存的最大值跟操作系统有很大关系。

简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-

3GB(一般来说Windows系统下为1.5GB-2GB,Linux为2GB-3GB),而64bit以上的处理器就不会有限制。

三、JVM内存管理

       1.堆(Heap)和非堆(Non-heap)内存

按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

     2.堆内存分配

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小
     3. 非堆内存分配

       JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。 

三、Eclipse内存优化

      在eclipse安装的文件下有一个eclipse.ini文件, 对于eclipse.ini文件中的各项参数的说明:

       -vmargs:         说明后面是VM的参数
-Xms40m:       虚拟机占用系统的最小内存
-Xmx512m:     虚拟机占用系统的最大内存 ,按需求分配
-XX:PermSize:最小堆大小。一般报内存不足时,都是说这个太小,
                         堆空间剩余小于5%就会警告,建议把这个稍微设
                           大一点,不过要视自己机器内存大小来设置 。
-XX:MaxPermSize:最大堆大小,按需求分配。
- Xmx512M的5%为25.6M,理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M 。






  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值