【java总结】jvm虚拟机内存区域

java虚拟机堆栈区域JVM区域总体分两类,heap区和非heap区。heap区又分为:Eden Space(伊甸园)、Survivor Space(幸存者区)、Old Gen(老年代)。非heap区又分:Code Cache(代码缓存区);Perm Gen(永久代);Jvm Stack(java虚拟机栈);Local Method Statck(本地方法栈);下面我们对每一...
摘要由CSDN通过智能技术生成

JVM虚拟机区域大致有下图这几个方法区寄存器直接内存

在这里插入图片描述
看到这个图大家首先要有个概念,jvm的内存区域也是内存的一部分,只是针对不同的应用进程 会在内存中单独隔离出一部分区域但是整体还是属于在内存里(为什么说这个问题,因为后续要说到永久带和元空间 这些都是共享的一些内存区域),而且本文所讲的栈和堆也和我们学到的操作系统里面讲的栈和堆概念是一样的 不要被图片上的框框所困扰

class 文件被虚拟机啊加载如内存后示例图,会根据class文件的不同java关键字进行分别存储(如static final method class等)
在这里插入图片描述

关于垃圾回收一些策略我们会在另外一篇文章里面在分析,这里我们大概对堆的一些逻辑空间的分配有个概念。

年轻代(Young Generation)

Eden Space
字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能被回收的对象被放入到空的survivor区域。

Survivor Space
幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象。Survivor有两个,分别为To Survivor、 From Survivor,这个两个区域的空间大小是一样的。执行垃圾回收的时候Eden区域不能被回收的对象被放入到空的survivor(也就是To Survivor,同时Eden区域的内存会在垃圾回收的过程中全部释放),另一个survivor(即From Survivor)里不能被回收的对象也会被放入这个survivor(即To Survivor),然后To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的。

Eden SpaceSurvivor Space都属于年轻代,年轻代中执行的垃圾回收被称之为Minor GC(因为是对年轻代进行垃圾回收,所以又被称为Young GC),每一次Young GC后留下来的对象age加1。

-Xms20m -Xmn10M JVM 堆初始大小为20M。其中年轻代的大小为 10M,那么剩下的就是老年代的大小,有 10M了

老年代(Old Generation)

Old Gen
老年代,用于存放年轻代中经过多次垃圾回收仍然存活的对象,也有可能是年轻代分配不了内存的大对象会直接进入老年代。经过多次垃圾回收都没有被回收的对象,这些对象的年代已经足够old了,就会放入到老年代。

当老年代被放满的之后,虚拟机会进行垃圾回收,称之为Major GC。由于Major GC除并发GC外均需对整个堆进行扫描和回收,因此又称为Full GC。

heap区即堆内存,整个堆大小=年轻代大小 + 老年代大小。堆内存默认为物理内存的1/64(<1GB);默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以通过MinHeapFreeRatio参数进行调整;

XX:MinHeapFreeRatio= 指定 jvm heap 在使用率小于 n 的情况下 ,heap 进行收缩 ,Xmx==Xms 的情况下无效 , 如:-XX:MinHeapFreeRatio=30

默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以通过MaxHeapFreeRatio参数进行调整。

-XX:MaxHeapFreeRatio=
指定 jvm heap 在使用率大于 n 的情况下 ,heap 进行扩张 ,Xmx==Xms 的情况下无效 , 如:-XX:MaxHeapFreeRatio=80

下面我们用java代码来看一下最设置最大堆内存以后如何查看其分布
第一步这只最大堆内存为80m,最小堆内存也是10m等于没说存粹是为了测试使用

-Xmx80m -Xms10m

maxHeapMemory = Eden+Survivor+Old Gen (最大的堆内存=伊甸园区域+幸存者区+老年代区域)

/*获取最大的堆内存*/
long maxHeapMemory = Runtime.getRuntime().maxMemory() 

   for (MemoryPoolMXBean mp : ManagementFactory.getMemoryPoolMXBeans()) {
   
            //虚拟机区域名称 如PS Survivor Space
            String psName = mp.getName();

            //虚拟机区域类型 如Heap 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值