深入JMM java内存模型

1 篇文章 0 订阅

由于网上有些JMM的文章看着感觉很乱,因为那些的java内存模型文章老是跟OS/硬件混着讲,所以有看着比较乱,于是我想重新梳理一下JMM,本章讲的都是JMM的,不是OS/硬件的

JVM stacks(java虚拟机栈)

这里面存的都是一个一个的栈帧,也就是Frame,每一个栈帧都是一个方法
每开一个线程,都会多一个自己的jvm stacks(java虚拟栈)
还是直接看图片吧直观一点
在这里插入图片描述
上面的局部变量表存的就算方法内的局部变量

native method stacks (本地方法栈)

这个其实没什么好说的,就是存的一些c/c++的一些方法,就是JNI,就是跨语言调用,其实jvm就是c/c++写的,这也理解为什么说写c/c++的看不起写java的,哈哈哈。

Program Counter (程序计数器)

程序计数器是存的jvm的每一条指令的“位置” ,虚拟机的运行就是从这里面拿一条一条的指令的“位置”,然后去找到指令,然后再执行,至于什么是指令,看下图

public class Test2 {
    static class User{
        int age;
        String name;
    }
    public static void main(String[] args) {
        User u = new User();
    }
}

这是一个很简单的代码

0 new #2 <com/test/Test2$User>
3 dup
4 invokespecial #3 <com/test/Test2$User.<init>>
7 astore_1
8 return

这个是main方法里面执行的指令 比如new指令,dup指令,invokespecial指令等,程序计数器存的就是这些指令的位置。

Direct Memory(直接内存)

这个是jdk1.4之后增加的,配合NIO所需,不归jvm虚拟机管,直接归操作系统管,这个内存就算实打实的硬件内存了。而不少jvm里面的内存,其实jvm可以看作是一台跑在真正电脑上的虚拟电脑。之所以有这个直接内存是为了提高效率,因为这样就少了一个拷贝的过程(从操作系统的内存拷贝到JVM内存的过程)实现了零拷贝。

Methdo Area(方法区)

装的是各种各样的Class ,还有运行时常量池的内容 ,被所以线程所共享。
其实对于方法区很多人都有一个误解,以为 方法区= Perm Spac(永久代) ,或者 方法区= Meta Spac(元空间)。其实这个是错误的。首先方法区是一个逻辑上的概念。而 永久代 或者 元空间是方法区的一个具体的实现。其实为了方便理解,我都是把方法区看成是一个接口,而永久代或者元空间则是方法区的一个具体实现类。这样就方便理解了。在HotSpot jdk1.8之前 方法区是由Perm Spac(永久代实现的) jdk1.8之后由 Meta Spac(元空间实现)
这两个有什么区别呢?
一.Perm Spac
1.FGC不会清理。
2.字符串常量位于Perm Spac。
二.Meta Spac
1.FGC会清理。
2.字符串常量位于堆。

Heap(堆)

堆内存,在jdk1.8由年轻代与老年代组成默认比例是1比2,年轻代由1个Eden区和2个survivor区组成,比例是8比2,或者说8比1比1。
堆内存主要是跟GC机制相关,存放是是一些比较大的对象。
下面讲的是分代算法(适用于jdk1.8的Parallel Scaveng+Parallel Old垃圾回收器)
一般比较容易回收的对象,经过YGC就会被回收,YGC就是对年轻代的对象进行回收,而比较顽固的对象,经过几轮YGC之后,如果还没被回收,就会移动到老年代,而老年代满了之后就会触发FGC,FGC会对整个堆内存进行垃圾回收,FGC的时间一般会比YGC的时间长,而且很消耗CPU的性能。至于对象为什么时候会到老年代,是因为每一轮YGC,对象的年龄会增加一。对象内有4位(半个字节)记录着对象的年龄,其最大值是15.但并不是说只有对象的年龄达到15的时候才会进入老年代。这里面牵扯到一些GC优化的问题。对象一开始分配在Eden区,然后经过一轮YGC,会到S1,再经过一轮YGC,会到S2,再经过一轮YGC 又会到S1,就这样在S1和S2之间,跳来跳去。然后年龄不断增加,当s2区里面存着超过s2区内存大小的一半的对象的时候,YGC会把s2区内的年龄最大的对象直接往老年代里存放。所以老年代里面的对象不一定年龄都是15。这个就叫做动态年龄

YGC使用拷贝算法
FGC使用标记清除算法或标记压缩算法
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值