因为每个对象生命周期不一样,jvm在做内存管理的时候,就帮我们分成了三个区域:

  1.  新生代(回收频率高)   新生和老年默认大小比例为1:2

  2.  老年代(回收频率低)     最好所有的对象都不要进入老年代,最好新生代能及时回收空对象释放空间供下次使用。

  3.  永久代(一般放类的加载信息,常量,静态变量)。

  从上图可以看出jdk1.8之前:新生代,老年代放在heap中, 永久代放在方法区中;

  在jdk1.8的时候,就将永久代放到了一块叫Meta Space(元空间)的本地内存中。

   官方之所以这么设计,是为了解决永久代会溢出的问题,meta space有点像ArrayList,拥有自动扩容的特性,从而防止溢出。当然它也不是越大越好,太大了会因为内存占用过多,从而使得堆外内存空间狭小而容易出现内存溢出的情况。这些都是可配置的。

指针碰撞:

  如下图,第一次创建对象的时候线程开辟了一个空间,第二次创建对象线程又开了一个空间,如果多个线程同时创建就会出现“抢占”空间的情况出现指针碰撞,jvm就通过CAS来控制先来后到的顺利,理解成线程锁一样。但是这样创建对象还是CAS还是会出现竞争激烈的情况从而消耗CPU影响性能。为了解决这个问题,jvm又提供了栈上分配。内存规整(即内存连续有规律)

    

栈上分配:

  栈上分配的本质还是在堆中分配内存。

  如下图:在堆里面,每个线程都有自己的Thread local Alltion Buffer,他们都是在自己的空间里面创建对象,这样就不会出现抢占的情况了,从而提高了性能。

对象分配规则:

  (1)对象优先分配在Eden区,如果Eden内存不够,虚拟机就执行一次Minor GC

  (2)大对象(大对象指需要大量连续内存空间的对象)直接进入老年代.这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。

  (3)长期存活的对象进入老年代.虚拟机为每个对象都定义一个年龄计数器,如果对象经过一次Minor GC就去Survivor区,之后每经过一次Minor GC,年龄就会加一,直到15之后就去老年代.

  (4)动态判断对象的年龄.如果Survivor区相同年龄的对象的总和大于Survivor的一半,那么大于或者等于这个年龄的对象直接去老年代

二: Jvm内存模型的更多相关文章

  1. JVM 系列(二)内存模型

    02 JVM 系列(二)内存模型 一.JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域.这些区域有各自的用途.创建/销毁时间: 一. 线程私有区域 线程私有数据区域生 ...

  2. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  3. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  4. JVM内存模型和关键参数设置

    一. JVM内存模型: Jvm内存模型是学好Java很重要的一部分,该部分学习能让我们在系统运维的时候,或者优化服务器的时候能够有方法,懂原理. 二. Jvm关键参数: 1. 堆大小设置参数: -Xm ...

  5. 记录JVM内存模型,参数含义和优化

    一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...

  6. JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集

    (转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...

  7. Java基础知识强化100:JVM 内存模型

    一. JVM内存模型总体架构图:  方法区和堆由所有线程共享,其他区域都是线程私有的 二. JVM内存模型的结构分析: 1. 类装载器(classLoader) 类装载器,它是在java虚拟机中用途是 ...

  8. JVM内存模型及内存分配过程

    一.JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域). 1.Heap是运行时数据区域,所有类实例和数组的内存均从此处分配.Heap区分两大块,一块是 Youn ...

  9. JVM内存模型以及垃圾收集策略解析

    http://xmuzyq.iteye.com/blog/599750 一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程. ...

  10. JVM内存模型及垃圾收集策略解析

    一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文 ...

随机推荐

  1. MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main re

    出现这个问题是因为工程是应用win32,必须要有main函数,修改方式为: configuration properties中General->configuration Type->将a ...

  2. jQery Datatables回调函数中文

    Datatables——回调函数 ------------------------------------------------- fnCookieCallback:还没有使用过 $(documen ...

  3. 【深入理解CLR】2:细谈值类型的装箱和拆箱

    装箱 总所周知,值类型是比引用类型更“轻型”的一种类型,因为它们不作为对象在托管堆中分配,不会被垃圾回收,也不通过指针来引用.但在许多情况下,都需要获取对值类型的一个实例的引用.例如,假定要创建一个A ...

  4. hdu 1695 欧拉函数+容斥原理

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. nginx展示文件目录

    1. 如何让nginx显示文件夹目录 vi /etc/nginx/conf.d/default.conf 添加如下内容: location / { root /data/www/file //指定实际 ...

  6. 【转载】mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists.

    This is about resetting the MySQL 5.7 root password in Ubuntu 16.04 LTS You probably tried something ...

  7. windows Apache ab安装及压力测试

    一:安装 ab是Apache自带的网站压力测试工具.使用起来非常的简单和方便.不仅仅是可以Apache服务器进行网站访问压力测试,还可以对其他类型的服务器进行压力测试.比如nginx,tomcat,I ...

  8. 损坏的RAID5

    损坏的RAID5 string讀入卡cin 関同步 ios::sync_with_stdio(false) 由塊號映射到具體位置 塊號id對應第col個字符串 字符串開始的位置st #include& ...

  9. [design pattern](5) Factory Method

    前言 在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method). 思考题 首先,让我们来思考下面的问题: 在上一 ...

  10. Redis大key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...