jvm(10) -- 内存分配策略

简介: jvm(10) -- 内存分配策略

内存分配策略


0.概述


1dc618a0ed9580ce8bfa6facb208c08f.png


1.内存分配优先进入eden区域


5d4c6812c8535adbb050f4ddf2e1bce8.png


-verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


java -version

66ba272a0bfc97be54a5fa679e3d5482.png


多核,2个G以上的cpu都认为是server vm。


操作1:


1dc618a0ed9580ce8bfa6facb208c08f.png


操作2:

5d4c6812c8535adbb050f4ddf2e1bce8.png


说明大对象直接在老年代分配内存。


操作3:

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


设置vm参数:


-verbose:gc
-XX:+PrintGCDetails
-XX:+UseSerialGC
-Xms20M
-Xmx20M
-Xmn10M
-XX:SurvivorRatio=8

66ba272a0bfc97be54a5fa679e3d5482.png


堆一共才20M大小,给他40M,肯定会内存溢出。


操作4:


1dc618a0ed9580ce8bfa6facb208c08f.png

5d4c6812c8535adbb050f4ddf2e1bce8.png



内存担保,eden区只能存8M,先存3个2M到eden,后面的4M来了,存不了,得放survior区,一个suvivior才1m,于是向老年代借空间,把原来的6m存在老年代。


这个4m根据eden优先原则,存在eden区。


2.大对象直接进入老年代


虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配。


PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效,Parallel Scavenge收集器不认识这个参数,Parallel Scavenge收集器一般并不需要设置。如果遇到必须使用此参数的场合,可以考虑ParNew加CMS的收集器组合。


操作:


指定前:


46a9d80a6e05e4e3b19d57a0ee70bcdf.png66ba272a0bfc97be54a5fa679e3d5482.png


指定多大内存到老年代


1dc618a0ed9580ce8bfa6facb208c08f.png5d4c6812c8535adbb050f4ddf2e1bce8.png


3.长期存活的对象直接进入老年代


46a9d80a6e05e4e3b19d57a0ee70bcdf.png66ba272a0bfc97be54a5fa679e3d5482.png88b9988b40447cb37c7e3c492d49867f.png



通过上面的参数设置,到底多大的年龄进入老年代。


4.空间分配担保


在发生Minor GC 之前,虚拟机会先检查老年代最大可用连续空间是否大于新生代所有对象大小总和,如果条件成立,那么Minor GC可以确保是安全的。如果不成立,虚拟机会查看HandlePromotionFailure设置的值是否允许担保失败。如果允许,那么虚拟机会检查老年代最大可用连续空间是否大于历次晋升到老年代对象大小的平均值,如果大于,将会尝试进行一次Minor GC;如果小于,或者HandlePromotionFailure设置不允许冒险,这时会进行一次Full GC。


JDK 6 Update 24 之后,HandlePromotionFailure参数不会再影响到虚拟机空间分配担保的策略,规则变为只要老年代的连续空间大于新生代对象总大小或者大于历次晋升对象大小的平均值就会进行Minor GC ,否则将进行Full GC。


5.逃逸分析和栈上分配


https://blog.csdn.net/blueheart20/article/details/52050545


讲的比较好


https://www.cnblogs.com/fuguoliang/p/9753061.html


发生逃逸的不要用栈上分配。


如何查看逃逸分析的筛选结果


参考:链接:https://www.jianshu.com/p/f1e5e03ed2f8


可以通过配置 -XX:+PrintEscapeAnalysis 开启打印逃逸分析筛选结果


栈上分配需要有一定的前提


开启逃逸分析 (-XX:+DoEscapeAnalysis)

逃逸分析的作用就是分析对象的作用域是否会逃逸出方法之外,再server虚拟机模式下才可以开启(jdk1.6默认开启)


开启标量替换 (-XX:+EliminateAllocations)

标量替换的作用是允许将对象根据属性打散后分配再栈上,默认该配置为开启


6.TLAB 线程本地分配缓存


全称叫做:Thread Local Allocation Buffer 即线程本地分配缓存


那么能不能构造一种线程私有的堆空间,哪怕这块堆空间特别小,但是只要有,就可以每个线程在分配对象到堆空间时,先分配到自己所属的那一块堆空间中,避免同步带来的效率问题,从而提高分配效率。



相关文章
|
8天前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
24 1
|
10天前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
12 0
|
6天前
|
缓存 算法 Java
JVM内存溢出(OutOfMemory)异常排查与解决方法
JVM内存溢出(OutOfMemory)异常排查与解决方法
|
9天前
|
Java 程序员 编译器
Java内存模型深度解析与实践优化策略
在多线程编程领域,Java内存模型(Java Memory Model, JMM)是确保并发程序正确性的基石。本文深入探讨JMM的工作原理,结合最新研究成果和实际案例,揭示高效同步策略和避免常见并发缺陷的方法。文章不仅阐述理论,更注重实践,旨在为Java开发者提供全面的内存模型应用指南。
|
13天前
|
存储 Java 对象存储
jvm内存模型剖析
当线程cpu时间片执行完后,线程进入休眠状态,当再次唤醒时,通过程序计数器确定指令执行到哪一行,然后继续往下执行。
19 1
|
6天前
|
算法 Java C++
C++和Python在内存分配策略上的主要区别是什么?
【7月更文挑战第2天】C++和Python在内存分配策略上的主要区别是什么?
7 0
|
6天前
|
存储 监控 算法
Java内存管理策略与性能调优
Java内存管理策略与性能调优
|
11天前
|
存储 缓存 算法
详解JVM内存优化技术:压缩指针
详解JVM内存优化技术:压缩指针
|
11天前
|
Java UED 开发者
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
|
11天前
|
存储 缓存 监控
深入解析JVM内存分配优化技术:TLAB
深入解析JVM内存分配优化技术:TLAB