JVM系列(三):JVM内存结构和参数说明
一、概述,内存结构图

二、堆Heap,存放对象实例,是垃圾回收的主要区域,非堆的内存不进行GC,GC会导致程序运行中断, 物理上可以不连续,堆空间不足时会产生OutOfMemoryException,各个线程的共享区域
1. 年轻代
a. Eden空间:存放新生的对象,绝大部分对象在这里;引发minor collection
b. From Survive空间:存放每次垃圾回收后存活的对象
c. To Survive空间
2. 老年代:存放应用程序中生命周期长的存活对象, 引发major collection,即Full gc,会严重影响性能
3. 参数设置大小
-Xms 设置堆的最小空间
-Xmx 设置堆的最大空间
-XX:NewSize 设置年轻代的最小空间
-XX:MaxNewSize 设置年轻代的最大空间
-XX:PermSize 设置永久代的最小空间,在方法区
-XX:MaxPermSize 设置永久代的最大空间,在方法区
-Xss 设置线程的栈的空间
老年代的空间=堆的空间大小-年轻代的空间大小

三、方法区Method Area
1. 存储类信息、常量、静态变量等数据,是线程共享的区域,也可以叫永久代
2. 当空间不够,产生OutOfMemoryException
四、栈Stack:主要用于方法的执行,是线程私有的区域
1. 程序计数器
控制程序流程,分支、跳转等操作
2. JVM栈和本地方法栈
方法调用相关,会产生StackOverFlow
五、主内存和工作内存
1. 概念:
主内存:主要包括本地方法区和堆,所有线程共享
工作内存:每个线程私有的栈和寄存器(程序计数器和cpu工作的高速缓存区),抽象概念,物理上不存在

2. 原理:
a. 所有的变量都存在主内存中,所有线程共享,new对象也放在主内存中
b. 每个线程都有自己的工作内存,线程对变量的操作是对工作内存中从主内存拷贝过来的变量,而不能对主内存中的变量进行操作
b. 线程间的变量传递需要通过主内存,而不能直接访问其他线程工作内存中的变量
六、内存模型与多线程
1. 多线程的并发问题都会反映在java内存模型上,所谓线程安全就是控制多个线程对某个资源的有序读写
2. Java内存模型主要解决两个问题:可见性和有序性
3. volatile解决可见性问题,不保证有序性,适合直接赋值的场景,当一个线程修改了共享变量,其他线程应该看到最新修改的值,被volatile修饰的变量不会被拷贝到工作线程中,在主内存中被修改
4. synchronized可以解决可见性和有序性,保证共享变量的正确性
5. 线程消耗CPU:stackoverflow,对象消耗内存: outofmemory
6. threadlocal: 线程局部变量,即每个线程从主内存中拷贝的变量副本
JVM系列(三):JVM内存结构和参数说明的更多相关文章
- JVM系列三:JVM参数设置
JVM系列三:JVM参数设置.分析 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...
- JVM系列三:内存分配与回收策略
内存分配策略 1.对象优先分配在新生代Eden区 多数情况下,对象分配在新生代的Eden,若Eden区域内存不够,则引发一次Minor GC 2.大对象直接进入老年代 大对象直接分配在老年代,避免新生 ...
- JVM系列三:JVM参数设置、分析
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...
- JVM系列三:JVM参数设置、分析(转载)
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...
- 【转载】JVM系列三:JVM参数设置、分析
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...
- [转]JVM系列三:JVM参数设置、分析
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...
- 转:JVM系列三:JVM参数设置、分析
转自:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断 ...
- JVM学习01:内存结构
JVM学习01:内存结构 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. 内存结构知识要点Xmind梳理 案例分析 分析1 package com.h ...
- jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...
- jvm系列(八):jvm知识点总览-高级Java工程师面试必备
在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...
随机推荐
- go 语言 for循环的一个坑
1.案例1 package main import "fmt" type Card struct { id int } func main() { list := make([]* ...
- Ubuntu 安装 PHP
Ubuntu版本:20.04.1 LTS PHP版本:8.2.3 下载地址: https://www.php.net/downloads 官方文档:https://www.php.net/manual ...
- 【研究生学习】Turbo编码
卷积码编译码 Turbo码编译码 原始文献阅读 最早记录Turbo编码的论文是NEAR SHANNON LIMIT ERROR - CORRECTING CODING AND DECODING :TU ...
- 2022-04-27内部群每日三题-清辉PMP
1.对一个关键项目的要求是产品的持续可追溯性,质量团队建议在制造过程的每个步骤创建检查点.然而,这些检查点耗费了宝贵的时间和资源.项目经理应执行什么类型的分析来确定适当的检查点数量? A.备选方案分析 ...
- calendar.getActualMaximum(calendar.DAY_OF_MONTH)的陷阱,2月份最后一天成了3月3号
引用一下别人的链接: https://blog.csdn.net/dongyuxu342719/article/details/78131697
- java传递参数调用python完成剪切多个视频最终拼接成一个
需求如题,综合考虑之后我选择python去做视频处理,最终结果也让我非常满意. 我是windows 环境,安装的python3.8和moviepy模块 第一步:安装python3.8 第二步:修改py ...
- react lodash节流this找不到正确用法
if (!this.throttleLoadDicom) { this.throttleLoadDicom = throttle(this.loadDicomFun, 800, { leading: ...
- MacBook + 移动SSD实现三系统(Mac OS、windows、ubuntu)
Windows系统安装 1.我们先要在windows的电脑上下载好,你需要的windows镜像文件(下载地址:https://msdn.itellyou.cn/,个人建议用迅雷下载),下载好winto ...
- 备份docker mysql数据库
1.查看容器 docker ps 2.进入容器 docker exec -it 容器id /bin/bash 3.备份数据 mysqldump 数据库名称 -uroot -p >/root/** ...
- 【转】【善用佳软】文件复制软件评测:FastCopy、TeraCopy、ExtremeCopy、Supercopier
文件复制软件评测:FastCopy.TeraCopy.ExtremeCopy.Supercopier 原文:https://xbeta.info/fastcopy-teracopy-extremeco ...