jvm内存模型、常见参数及调优
JVM内存结构:

主要分为:方法区、堆、虚拟机栈、本地方法栈、程序计数器,其中方法区和堆是线程共享的,其他的都是线程隔离的。
方法区:
主要存放类的信息、静态变量、常量、编译后的方法代码,永久代PermGen是方法区的实现,JDK1.8后永久代被移除换成了元空间Metaspace,元空间的本质和永久代类似,都是对方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。元空间大小,理论上取决于32位/64位系统可虚拟的内存大小。
堆:
唯一用途就是用来存放对象实例,根据对象的存活周期划分为新生代和老年代OldGen,两者的默认占比为1:2(即新生代:老年代),其中新生代又可以细化为Eden+From Survivor+To Survivor,默认占比为8:1:1。
虚拟机栈:
描述了Java方法执行的内存模型,每个方法执行时都会创建一个栈帧,每个方法从调用到执行完的过程就对应着一个栈帧在虚拟机中入栈到出栈的过程。栈帧存储着局部变量表、操作数栈、动态链接、方法返回地址等信息。每一个方法从调用到执行完的过程就对应着一个栈帧在虚拟机中入栈到出栈的过程。
本地方法栈:
与虚拟机栈类似,只是虚拟机服务的对象不同而已,虚拟机栈服务的是Java方法,而本地方法栈服务的是本地方法即native方法。
程序计数器:
用于记录每条线程当前所执行到的字节码行号,以便线程切换后能恢复到正确的执行位置。因此每条线程都有独立的程序计数器,且各线程间互不影响。
tomcat调节jvm初始内存大小
windows下tomcat的运行文件为catalina.bat,打开文件,在文件中部找到“rem ----- Execute The Requested Command -----”字样 ,在它后面添加如下内容即可
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%" rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=%JAVA_OPTS% -server -Xms2048m -Xmx2048m -Xmn512m -XX:PermSize=400m -XX:MaxPermSize=700m
echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Using CATALINA_HOME2: "%CATALINA_HOME2%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"if ""%1"" == ""debug"" goto use_jdk
echo Using JRE_HOME: "%JRE_HOME%"goto java_dir_displayed
:use_jdk
echo Using JAVA_HOME: "%JAVA_HOME%"
:java_dir_displayed
echo Using CLASSPATH: "%CLASSPATH%"
Eclipse调优:
更改eclipse.ini
做如下更改

当虚拟机进行垃圾回收时会输出GC日志到gc.log,可以将输出的gc.log上传到GC日志在线解析工具https://gceasy.io/进行解析。
常见 JVM 参数说明
堆区:
-Xms 初始堆大小,默认是物理内存的1/64,
-Xmx 最大堆大小,物理内存的1/4,
空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
因此服务器一般设置-Xms、-Xmx 相等,生产环境建议设为1024m以上
-Xmn 年轻代大小
-XX:NewSize 设置年轻代大小
-XX:MaxNewSize 年轻代最大值
非堆区:
-XX:PermSize 设置持久代(perm gen)初始值(非堆内存初始值),物理内存的1/64
-XX:MaxPermSize 设置持久代最大值(最大非堆内存),物理内存的1/4
与垃圾回收相关的JVM参数:
-XX:-DisableExplicitGC — 让System.gc()不产生任何作用
-XX:+PrintGCDetails — 打印GC的细节
-XX:+PrintGCDateStamps — 打印GC操作的时间戳
-XX:NewRatio — 可以设置老生代和新生代的比例
-XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值
-XX:TargetSurvivorRatio:设置幸存区的目标使用率
jvm内存模型、常见参数及调优的更多相关文章
- 记录JVM内存模型,参数含义和优化
一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...
- JVM内存模型及参数调优
堆.栈.方法区概念区别 1.堆 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.根据垃圾回收机制的不同, Java堆有可能拥有不同的结构,最为常见的就是 ...
- JVM 内存模型及垃圾回收
java内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器:程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也可以说 ...
- JVM内存结构、参数调优和内存泄露分析
1. JVM内存区域和参数配置 1.1 JVM内存结构 Java堆(Heap) Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都 ...
- JVM性能调优(1) —— JVM内存模型和类加载运行机制
一.JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM 是 JRE 的核心组成部分 ...
- 【JVM】TroubleShooting之内存溢出异常(OOM)与调优
1. OOM概述 If your application's execution time becomes longer and longer, or if the operating system ...
- JVM性能调优(3) —— 内存分配和垃圾回收调优
前序文章: JVM性能调优(1) -- JVM内存模型和类加载运行机制 JVM性能调优(2) -- 垃圾回收器和回收策略 一.内存调优的目标 新生代的垃圾回收是比较简单的,Eden区满了无法分配新对象 ...
- 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置
VM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃圾 ...
- <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
随机推荐
- redis分布式锁使用方法
引用: StackExchange.Redis.dll Redlock.CSharp.dll RedLock.dll 代码: public class RedlockHelper { public v ...
- NOIP2009 压轴---最优贸易
链接:https://ac.nowcoder.com/acm/contest/959/H来源:牛客网 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路 ...
- 高阶函数HOF和高阶组件HOC(Higher Order Func/Comp)
一.什么是高阶函数(组件),作用是什么? 子类使用父类的方法可以通过继承的方式实现,那无关联组件通信(redux).父类使用子类方法(反向继承)呢 为了解决类(函数)功能交叉/功能复用等问题,通过传入 ...
- 洛谷P5664 Emiya 家今天的饭 题解 动态规划
首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...
- 1087 有多少不同的值 (20 分)C语言
当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: ...
- 小小知识点(四十七)——发送端已知CSI,基于注水算法的功率分配方法,实现功率受限下的信道容量最大化
1. 注水算法的使用条件和推导 注水算法是根据某种准则,并根据信道状况对发送功率进行自适应分配,通常是信道状况好的时刻,多分配功率,信道差的时候,少分配功率,从而最大化传输速率.实现功率的“注水”分配 ...
- 公子奇带你进入Java8流的世界(二)
在上一篇中我们带领大家简单的了解流的概念及使用场景,本节我们就来好好的介绍流的常见用法. 一.筛选和切片 对于一串流,我们有时需要取出我们需要的流中某些元素,主要是通过谓词筛选.看代码: 首先定义一个 ...
- 12款好用的Visual Studio插件,最后一款良心推荐
目录 01 CodeMaid 02 Markdown Editor 03 ReSharper 04 GitHub Extension for Visual Studio 05 ZenCoding 06 ...
- Q&A系列一:DataPipeline常见问题回答
不知不觉中,大家已经陪伴DataPipeline走过了3年时间.在这期间,得益于客户们的积极反馈和沟通,我们总结了一些日常工作中比较常见的问题,并基于这些问题进行了总结. 为避免突兀,我们会先从比较基 ...
- centos7+docker+elasticsearch 安装记录+踩坑
版本: cenos7 :3.10.0-957.21.3.el7.x86_64 (内核需>=3.10 才可以安装) docker: yum安装版本为1.13.1 elasticsearch: 6 ...