JVM内存结构-Java内存模型(JMM)-Java对象模型

1 JVM内存结构

JVM内存结构主要包括:Heap(堆)、Stack(堆栈)和Method Area(方法区、非堆)等

JDK8取消了方法区的永久代PermGen,新增了元空间Metaspace,Metaspace与PermGen之间最大的区别在于:Metaspace并不在虚拟机中,而是使用本地内存。

1.1 Heap(堆):年轻代、老年代

        年轻代:伊甸园、两个幸存者区(from、to)

        堆的GC过程:当伊甸园、幸存者区满足GC条件时候,会执行Young GC

            Young GC:Minor GC,复制算法(两个幸存者区之间复制)

                伊甸园存活对象复制到幸存者区(to)

                判断幸存者区(from)中存活对象的年龄阀值

                    如果年龄到阀值则会进入老年代

                    未到阀值则也复制到幸存者区(to),并且年龄加1

                如果幸存者区(to)已满则全部进入老年代

                如果老年代已满除法Old GC

                幸存者区from和to角色交换,保证to区为空

            Old GC: Full GC,标记-整理算法,标记出存活对象(存在引用的对象)

1.2 Stack(堆栈):存放对象的引用、每个运行线程的线程栈、每个方法的栈帧

1.3 JVM常用参数

-Xms和-Xmx

    -Xms4g -Xmx4g

    用于设置堆的最小和最大值,一般两个值设置一样大(否则GC后计算堆区会降低JVM效率)

-Xmn

    -Xmn2g

    用于设置年轻代大小,配置了这个则不需要配置-XX:NewSize和-XX:MaxNewSize

-Xss

    -Xss512k

    用于设置单个线程的堆栈大小,JDK5.0以后每个线程堆栈大小为1M

-XX:NewSize和-XX:MaxNewSize

    用于设置年轻代的大小,一般两个值设置一样大,建议采用-Xmn,建议设为整个堆大小的1/3或者1/4。

-XX:SurvivorRatio

    -XX:SurvivorRatio=4

    用于设置伊甸园和其中一个幸存者区的比值,

        为4则说明两个幸存者区和伊甸园比值为2:4,即一个幸存者区占年轻代1/6

        为5则说明两个幸存者区和伊甸园比值为2:5,即一个幸存者区占年轻代1/7

2 Java内存模型(JMM)

Java内存模型主要分为主内存和工作内存,工作内存包含了主内存的变量拷贝,线程对变量的读写操作都在工作内存中执行,执行完成后会同步至主内存。

JMM主要围绕并发编程中的原子性、可见性、有序性三个特征建立的

原子性:(synchronized)一个操作要么都执行,要么都不执行

可见性:(synchronized、volatile)一个线程对共享变量做了修改之后,其他线程能立即看到这个变量的变化

有序性:(synchronized、volatile)禁止指令重排

volatile修饰的变量每次操作都会先从主内存同步,然后再执行变量操作

JMM和JVM没有关系,勉强对应起来主内存对应JVM中Heap(堆)的对象实例数据部分,工作内存对应JVM中Stack(堆栈)的部分区域

3 Java对象模型

对象的实例数据存储在Heap(堆)中,对象引用存储在栈中,对象元数据存储在元空间(JDK8以前在方法区)中

参考资料:java中JVM和JMM之间的区别

你可能感兴趣的:(JVM内存结构-Java内存模型(JMM)-Java对象模型)