1 、说起jvm,很多人感觉jvm离我们开发实际很远。但是,我们开发缺每时每刻都离不开jvm。

     a: java源码 编译后成.class字节码文件,

     b:根据classpath找到这个字节码文件,

     c:然后 用类加载器classloader加载文件。

  经过上面三步后,JVM开始解释执行。

 

  栈:程序运行单位,与当前线程有关内容(局部分量、程序运行状态、方法返回值);

  堆:Java引用传递实现依靠堆内存,同一堆空间可被不同栈内容内存指向;

  程序计数器:小空间,用于计数操作,解决对象晋升问题;

  本地方法栈:递归调用保存栈内容,局部变量表,操作数栈、当前类运行时常量的引用、返回地址。

  2、jvm堆拆分:关键在于堆优化,需清除Java对象访问模式,Java对象引用采用是hotspot的指针引用。

  一般我们会对堆进行拆分,年轻代+老年代+元空间。

   

   a、年轻代中含有 伊甸园区,存活区。

  伊甸园区一般有new对象创建出来的对象,存活区是进行GC后保存的对象,S0或S1存储,但是有一块空间永远是空的,对象向老年代晋升(程序计数器会计算GC次数)。

  如果伊甸园中创建的对象过多,伊甸园占满,会发生晋级操作-经过minorGc

     b、老年代存放又臭又硬的对象,经历无数次的GC后被保留下来的对象或者是对象很大,直接保存到老年代。这些对象清除困难。

  如果老年代出现空间不足,会发生majorGC(FullGc)。majorGC非常耗费整个系统性能。所以我们一般很少使用System.gc();

  3、jvm堆优化

  对堆结构添加伸缩区,当老年代或年轻代空间不足时,可对空间进行压缩或伸展。

  当堆内存空间很大的情况下,减少堆内存的收缩处理操作。就需要考虑到 GC 的执行效率问题。

    Runtime.getRuntime().maxMemory()   最大可用内存  默认大小为当前物理内存的“1 / 4”

    Runtime.getRuntime().totalMemory()   默认可用内存  默认大小为当前物理内存的“1 / 64”

   可使用 至关重要的两个参数-Xms和-Xmx:可以使用的单位(k、m、g)

       -Xms:设置初始化的内存分配大小;

      -Xmx:设置最大的可用内存空间。

    举例设值: -Xms16g -Xmx16g

  对于年轻代,有BTP和TLAB,BTP伊甸园最晚创建对象放栈顶,TLAB分块保存,多线程处理。  

        -Xmn:设置年轻代的空间大小,默认采用的时物理内存的“1 / 64”

        -Xss:设置每一个线程所占用的栈的线程大小

        -X:SurvivorRatio:设置伊甸园区与两个存活区之间的内存分配比,默认“8 : 1 : 1”  

  老年代:
    与年轻代比率:-XX:NewRatio 当对象很大的时候往往不在年轻代进行保存,而是直接晋级到老年代,利用“-XX:PretenureSizeThreshold”。

  元空间不在堆内存中,存在于物理内存中。

  

  4、GC算法:多线程执行

    复制-清理算法,将对象清理,递升存活区到老年代

    标记-清除-压缩,扫描老年代中的存活对象 ,并且进行对象的标记; 遍历整个老年代的内存空间,回收所有标记对象; 为了保证可以方便的

  计算出老年代的大小,还需要进行压缩(碎片整理,把空间集中在一起)。但是这种算法会有一个严重性的问题:STW(产生中断,因为需要进行垃圾的标记)  

      |- 暂停当前的所有执行程序(挂起);
      |- 标记出垃圾,标记的时间越长,那么挂起的时间就越长,如果此时你的堆内存空间很大,那么时间一定会更长;

      |- 预清除处理;

      |- 重新标记过程:看看还有没有垃圾;

      |- 进行垃圾的处理;
      |- 程序恢复执行。

   以前使用的:-Xms48

浅谈jvm的更多相关文章

  1. 浅谈jvm中的垃圾回收策略

    下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已 ...

  2. 浅谈JVM线程调度机制及主要策略

    在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...

  3. 浅谈JVM垃圾回收

    JVM内存区域 要想搞懂啊垃圾回收机制,首先就要知道垃圾回收主要回收的是哪些数据,这些数据主要在哪一块区域. Java8和Java8之前的相同点有很多. 都有虚拟机栈,本地方法栈,程序计数器,这三个是 ...

  4. 浅谈JVM内存区域划分

    好吧,虽说真的有看过<深入分析Java Web技术内幕>一书,但当时看的时候还是一知半解,稀里糊涂的看完了.本来是打算暑假拿起来再看一遍的,但是早两天一个阿里学长给我做了个小面试,让我颇受 ...

  5. 浅谈JVM与内存分配

    一.程序内存分配 初始内存分配 当一个程序准备运行时,它首先向java虚拟机要内存,但是java虚拟机本身没有权限,它只能向操作系统申请内存,此时java虚拟机会拥有一个初始内存, 此处额外说明一下e ...

  6. 浅谈JVM编译原理->.java文件转变为.class文件的过程

    为什么需要编译? 我们平常写代码,有规范的命名方式,都能够看得懂,但是我们写的代码计算机是看不懂的,所以需要编译,也就是一个转换的过程,如下: 1.这个是咱们平时写的代码,就比较好理解,对人友好 2. ...

  7. 浅谈JVM内存模型

    JAVA虚拟机在执行JAVA程序的时候,会把它管理的内存分成若干不同的数据区域,每个区域都有各自的用途.目前大致把JVM内存模型划分为五个区域:程序计数器,虚拟机栈,本地方法栈,堆和方法区. 程序计数 ...

  8. 浅谈 JVM 结构体系、类加载、JDK JRE JVM 三者的关系

    一.java类,创建.编译.到运行的工程: 1.随便建一个Java类,保存后就是一个.java文件, 2.然后我们使用 javac命令编译 .java文件,生产 .class文件. 3.再然后使用 j ...

  9. 浅谈JVM及原理

    前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 运行流程 我们都 ...

随机推荐

  1. 对 jQuery 中 data 方法的误解

    一直以来都认为新版本中 data 是调用 dataset 实现的,对于低版本IE则采用 getAttribute其实一直是我误解了,也不知道最初这个想法是怎么来的.难道我被盗梦了? 今天 谢亮 兄弟和 ...

  2. Python数据类型(整型,字符串类型,列表)

    一:数据的概念 1.数据是什么 x=10,数据10就是我们要存储的数据. 2.为什么数据要分不同的种类? 因为数据是用来表示状态的,不同的状态就要用不同类型的数据去表示. 3:Python中常见的数据 ...

  3. Ubuntu 14.04 + xRDP + Xfce 实现Windows远程桌面连接

    1. 安装xRDP及vncserver sudo apt-get install xrdp sudo apt-get install vnc4server tightvncserver 2. 安装Xf ...

  4. ctime 时间

    1. 类型clock_t: 是个long型,用来记录一段时间内的时钟计时单元数,即CPU的运行单元时间.size_t: 标准C库中定义的,应为unsigned int,在64位系统中为long uns ...

  5. java 面试算法题

    /** * 设有n个人依围成一圈,从第1个人开始报数,数到第m个人出列,然后从 * 出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为 * 止.设n个人的编号分别为1,2,… ...

  6. Java不为人知的小秘密

    Java中的main方法必须有一个外壳类,而且必须是静态的! Java中的所有函数都属于某个类的方法,所以main方法也不例外,必须放在一个类中才能编译运行. 例如: public class tex ...

  7. HTTP之一 If-Modified-Since & If-None-Match

    If-Modified-Since & If-None-MatchIf-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 ...

  8. Scrapy:创建爬虫程序的方式

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在Scrapy中,建立爬虫程序或项目的方式有两种(在孤读过Scrapy的大部分文档后): 1.继承官方Spider ...

  9. SQLite数据库初步

    Windows 10家庭中文版 想使用Python操作SQLite数据库,可是,不知道怎么建立数据库文件. 在SQLite官网溜达了一圈,总算使用上面的工具安装了建立了我需要的数据库文件. 1.进入官 ...

  10. python基础-实现进度条功能,for和yield实现

    实现进度条功能 方法一:简单FOR实现打印进度条功能 for i in range(10): print("#",end="",flush=True) time ...