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

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

时间:2023-02-23 19:23:18浏览次数:104  
标签:剖析 XX StackOverflowTest static 内存 JVM public

JVM整体结构以及内存模型

public class Math {
public static final int initData = 666;
public static User user = new User();

public int compute() { //一个方法对应一块栈帧内存区域
int a = 1;
int b = 2;
int c = (a + b) * 10;
return c;
}

static {
System.out.println("==============加载Math.class=============");
}

public static void main(String[] args) {
Math math = new Math();
math.compute();
}
}

 

 JVM内存参数设置

 

 

Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里): java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar microservice-eureka-server.jar -Xss:每个线程的栈大小 -Xms:设置堆的初始可用大小,默认物理内存的1/64 -Xmx:设置堆的最大可用大小,默认物理内存的1/4 -Xmn:新生代大小 -XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。 -XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。 关于元空间的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示例:

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) ...... 结论: -Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多

标签:剖析,XX,StackOverflowTest,static,内存,JVM,public
From: https://www.cnblogs.com/avalanche/p/17149113.html

相关文章

  • 03 JVM内存泄漏排查思路
    一现象告警系统发出接口波动告警,JVM监控显示内存回收不掉,长时间不重启服务应用卡顿二产生原因大文件读取、全局集合对象、数据库select没有where导致全表数据写入内存......
  • Linux查询CPU,内存,硬盘使用率以及网卡流量指令
    Linux查询CPU,内存,硬盘使用率以及网卡流量指令1.获取cpu使用率//cpu`top-b-n1|fgrep"Cpu"|awk'{print100-$8}'`2.获取内存使用率//内存`free-m|fgrep......
  • 一次排查Jvm线程飙升问题的经历
    问题发现通过线上Grafana监控发现某服务JVM-Thread线程异常高,并且发现每天都在持续飙升,如下。可看到jvm线程少说几百,多则几千甚至过万,并且如果服务不重启,可发现线程数随着......
  • 性能测试-内存溢出(堆溢出、栈溢出、持久代溢出)问题定位和分析【杭州多测师_王sir】【
     1、堆内存溢出1)稳定性压测一段时间后,jmeter报错,日志报java.lang.OutOfMemoryError.Java heap space。2)用jmap -histo pid命令dump堆内存使用情况,查看堆内存排名前......
  • js 内存泄露是什么?常见的有哪些?
    内存泄露定义:一块被分配的内存既不能使用也无法回收,直到浏览器进程结束;常见的有以下这些:1,意外的全局变量;2,console.log;3,DOM泄露;4,闭包;5,被遗忘的定......
  • JVM基础学习笔记
    JDK、JRE、JVM的区别:三层的嵌套关系。JDK>JRE>JVM1、JDK:编译Java源码,生成Java字节码。/bin包含:(1)、java:启动JVM,运行Java程序(2)、javac:Java的编译器,将Java源......
  • Linux内存管理神器:smem工具
    大家好,我是良许。今天给大家分享一款Linux系统里的内存管理神器:smem。smem是Linux系统上的一款可以生成多种内存耗用报告的命令行工具。与现有工具不一样的是smem......
  • Linux 应用内存信息分析 VSS/RSS/PSS/USS【转】
    转自:在分析Linux内存使用时,不仅需要分析kernel内存使用情况,还需要分析Linux应用的内存使用情况,这就引出了VSS/RSS/PSS/USSRSS/PSS可以通过cat/proc/PID/smaps节点查看。1......
  • 【JVM】001-JVM的运行机制
    【JVM】001-JVM的运行机制1、JVM(JavaVirtualMachine)是用于运行Java字节码的虚拟机。2、JVM包括:一套字节码指令集+一组程序寄存器+一个虚拟机栈+一个虚拟机堆+......
  • Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS【转】
    转自:https://www.cnblogs.com/arnoldlu/p/9375377.html 在Linux里面,一个进程占用的内存有不同种说法,可以是VSS/RSS/PSS/USS四种形式,这四种形式首字母分别是Virtual/Res......