zoukankan      html  css  js  c++  java
  • JVM的理解

    一、JVM如何执行程序

    Java程序如何做到跨平台的,其底层就是运行的JVM虚拟机,JVM虚拟机就Java编写的代码,首先先解析成class文件,JVM然后去解析class文件成机器码,最后执行。机器码是各个操作系统中可识别的,且能够执行的。

    程序执行会分两个步骤

    1. Java代码解析成Java字节码即class文件
    2. JVM解析成机器码
    3. 操作系统执行机器码

    二、JVM结构

    image

    三、JVM类加载过程

    类加载的整个流程:class文件加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 执行

    对class文件装载,装载之后需要解析成JVM能够看的懂的内容,然后对类进行初始化后在执行

     四、JVM类加载时变量方法存在 方法区,Java堆,Java栈

    方法区:是各个线程共享的区域,存放类信息、常量、静态变量
    Java堆:存放对象的实例
    Java栈:每个线程的私有区域,每个线程都有一个Java栈,每次执行一个方法就会往栈中压入一个元素,这个元素叫“栈帧”,而栈帧中包括了方法中的局部变量、用于存放中间状态值的操作栈,存放类和方法的指针

    五、理解Java堆

    Java堆存储各种类的实例对象。Java堆分为新生代和老年代。新声带存放新生的对象,老年代存放应用程序声明周期长的内存对象。除了Java堆存放对象,还有一个地方存储,这个被称为永久代,永久代存储更大。当足够大的对象,并且声明周期也长,则会从老年代移动到新生代。

    新生代分Eden,和两个Survivor区域,占用内存比是8:1:1,Eden没有被gc的则会被移动到Survivor,但会有一个Survivor是空闲的,出现了gc时,会将那些没有被回收的对象复制到空闲的Survivor,并且这些对象的年龄+1,当年龄大于默认的15时,则会被移动到熬老年代。

    Java中的垃圾回收一般发生在新生代和老年代,分别是Minor GC、Full GC ,Minor GC发生在新生代,Full GC发生在老年代。

    新生代几乎是所有 Java 对象出生的地方,即 Java 对象申请的内存以及存放都是在这个地方。Java 中的大部分对象通常不需长久存活,具有朝生夕灭的性质,那么当一个对象被判定为 “死亡” 的时候,GC 就有责任来回收掉这部分对象的内存空间。新生代是 GC 收集垃圾的频繁区域。

    Full Gc当老年代的内存达到一定的空间后,则会发生一次Full GC了。

     

    六、参数设置

    -Xmx3550m:设置JVM最大堆内存为3550M。
    -Xms3550m:设置JVM初始堆内存为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
    -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。需要注意的是:当这个值被设置的较大(例如>2MB)时将会在很大程度上降低系统的性能。
    -Xmn2g:设置年轻代大小为2G。在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8。
    -XX:NewSize=1024m:设置年轻代初始值为1024M。
    -XX:MaxNewSize=1024m:设置年轻代最大值为1024M。
    -XX:PermSize=256m:设置持久代初始值为256M。
    -XX:MaxPermSize=256m:设置持久代最大值为256M。
    -XX:NewRatio=4:设置年轻代(包括1个Eden和2个Survivor区)与年老代的比值。表示年轻代比年老代为1:4。
    -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区(JVM堆内存年轻代中默认有2个大小相等的Survivor区)与1个Eden区的比值为2:4,即1个Survivor区占整个年轻代大小的1/6。
    -XX:MaxTenuringThreshold=7:表示一个对象如果在Survivor区(救助空间)移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于需要大量常驻内存的应用,这样做可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代存活时间,增加对象在年轻代被垃圾回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。
    XX:MetaspaceSize=256m # FGC 达到最大值时运行
    -XX:MaxMetaspaceSize=256m # 永生代的最大设置,
    -XX:+UseG1GC 使用G1垃圾回收机制

  • 相关阅读:
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 实现业务
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 开发流程
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 报表系统集成说明
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 处理报表
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 数据访问
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 分布式应用
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 实现插件
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 对象设计器使用帮助
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 数据层开发
    Jquery 中的CheckBox、 RadioButton、 DropDownList、CheckBoxList、RadioButtonList的取值赋值
  • 原文地址:https://www.cnblogs.com/skyice/p/10164918.html
Copyright © 2011-2022 走看看