首页 > 系统相关 >JVM内存模型深度剖析与优化

JVM内存模型深度剖析与优化

时间:2023-08-20 20:22:14浏览次数:37  
标签:设置 剖析 XX StackOverflowTest 内存 JVM redo

JDK体系结构

Java语言的跨平台特性

JVM整体结构及内存模型

 二、JVM内存参数设置

 Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里):

java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek
a‐server.jar

关于元空间的JVM参数有两个:-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N
-XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。
-XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M,达到该值就会触发
full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超
过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。这个跟早期jdk版本的-XX:PermSize参数意思不一样,-
XX:PermSize代表永久代的初始容量。
由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生
了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,
对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。

 

StackOverflowError示例:

// JVM设置 ‐Xss128k(默认1M)
 public class StackOverflowTest {

     static int count = 0;

     static void redo() {
     count++;
     redo();
    }

    public static void main(String[] args) {
         try {
            redo();
         } catch (Throwable t) {
             t.printStackTrace();
             System.out.println(count);
         }
     }
 }

 运行结果:
 java.lang.StackOverflowError
 at com.tuling.jvm.StackOverflowTest.redo(StackOverflowTest.java:12)
 at com.tuling.jvm.StackOverflowTest.redo(StackOverflowTest.java:13)
 at com.tuling.jvm.StackOverflowTest.redo(StackOverflowTest.java:13)
 ......
View Code

结论:
-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多
JVM内存参数大小该如何设置?
JVM参数大小设置并没有固定标准,需要根据实际项目情况分析,给大家举个例子
日均百万级订单交易系统如何设置JVM参数

 

结论:通过上面这些内容介绍,大家应该对JVM优化有些概念了,就是尽可能让对象都在新生代里分配和回收,尽量别
让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃
圾回收。

 

标签:设置,剖析,XX,StackOverflowTest,内存,JVM,redo
From: https://www.cnblogs.com/ladeng19/p/17644518.html

相关文章

  • 面试官:JVM是如何判定对象已死的?学JVM必会的知识!
    本文已收录至GitHub,推荐阅读......
  • 面试官:JVM是如何判定对象已死的?学JVM必会的知识!
    本文已收录至GitHub,推荐阅读......
  • 从JDK源码级别彻底剖析JVM类加载机制
    类加载运行全过程当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。publicclassMath{publicstaticfinalintinitData=666;publicstaticUseruser=newUser();publicintcompute(){//一个方法对应一块栈帧......
  • Python - 引用 内存地址 地址传递 值传递
    内存地址是数据在物理内存中的存储位置;Java常量池驻留,int是-5~256  __new__方法用于定义创建对象时执行的操作,__new__方法仅仅为用户提供一个创建对象时干预的入口,真正执行创建对象的操作由object类中的__new__方法完成。del操作的实质是断开变量与内存数据之间的引用,操......
  • 收藏~Dropbox 是如何解决 Android App 的内存泄漏问题的?
    当应用程序为对象分配内存,而对象不再被使用时却没有释放,就会发生内存泄漏。随着时间的推移,泄漏的内存会累积,导致应用程序性能变差,甚至崩溃。泄漏可能发生在任何程序和平台上,但由于活动生命周期的复杂性,这种情况在Android应用中尤其普遍。最新的Android模式,如ViewModel和Life......
  • GE光纤反射内存卡
    高性能光纤网络我们的光纤网络模块提供高性能和可靠性,适用于许多不同的应用。以下是该模块的一些主要特点和规格:板载128Mbyte/256MByte内存,为您提供强大的数据存储和处理能力。错误检测功能,确保数据传输的准确性和完整性。高速光纤网络波特率可达2.125G,提供极高的数据传输速率。数......
  • VMware vSphere Client端设置热添加虚拟机的CPU和内存
    使用vSphereClient连接到VMwareESXiServer,在“配置→网络”中,可以看到,当前有两个虚拟交换机,并且为该虚拟交换机分配了管理地址10.10.228.81,点击“添加网络”如图所示。添加配置向导,在网络类型,选择“虚拟机”,点击下一步。在网络访问,选择“使用vswithch0”,点击下一步在连接设置,填......
  • 20230818 CHAPTER 5 Thanks for the Memories arm64汇编内存使用
    .data段的内存引用实例十进制数不要以0开头,否则会被认为是8进制数一个数前面可以加-负号或者~取反符号; 申请一个内存块; 重复!转义字符!内存对齐  TheoffsetfromthePChas19bitsintheinstruction,whichgivesarangeof+/-1MB. Theoffsetaddress......
  • 剖析MongoDB数据库:理解NoSQL设计模式、优化查询性能和数据安全性
    MongoDB是一个流行的NoSQL文档数据库,它使用JSON样式的文档存储数据。本文将对MongoDB进行剖析,包括NoSQL设计模式、优化查询性能和数据安全性。NoSQL设计模式文档数据库MongoDB采用文档数据库的设计模式,即将相关数据保存在单个文档中,而不是将其拆分成多个表。这种设计模式使得数......
  • JVM线程
    1.JVM概念包括一套字节码指令集一组寄存器一个栈一个垃圾回收一个堆一个存储方法域。Java源文件(通过编译器)->字节码文件(通过JVM)->机器码2.线程JVM允许一个应用并发执行3.内存区域3.1线程私有区域ThreadLocal3.2线程共享区域ThreadShared3.2.1方法区(永久代)......