一、概述,内存结构图

二、堆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内存结构和参数说明的更多相关文章

  1. JVM系列三:JVM参数设置

    JVM系列三:JVM参数设置.分析   不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...

  2. JVM系列三:内存分配与回收策略

    内存分配策略 1.对象优先分配在新生代Eden区 多数情况下,对象分配在新生代的Eden,若Eden区域内存不够,则引发一次Minor GC 2.大对象直接进入老年代 大对象直接分配在老年代,避免新生 ...

  3. JVM系列三:JVM参数设置、分析

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  4. JVM系列三:JVM参数设置、分析(转载)

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  5. 【转载】JVM系列三:JVM参数设置、分析

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  6. [转]JVM系列三:JVM参数设置、分析

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  7. 转:JVM系列三:JVM参数设置、分析

    转自:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断 ...

  8. JVM学习01:内存结构

    JVM学习01:内存结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 内存结构知识要点Xmind梳理 案例分析 分析1 package com.h ...

  9. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  10. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

随机推荐

  1. python基础语法图

  2. Golang make和new的区别及实现原理详解

    在Go语言中,有两个比较雷同的内置函数,分别是new和make方法,二者都可以用来分配内存,那他们有什么区别呢?下面我们就从底层来分析一下二者的不同.感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助 ...

  3. getUserInfo和getUserProfile被废弃

    之前得知获取用户头像和昵称的两个接口getUserInfo和getUserProfile被废弃了,于是我就想深入探究一下. 一直抱有一个疑问,为啥有getUserInfo和getUserProfile ...

  4. video.js 注销上一个对象并重新初始化

    .dispose()没有用,不知道为什么. 后来我们为video绑定不同的id,还是随机数,每次初始化都用新video的id.并不建议这样做,但是我们也没有更好的办法了.

  5. 码云或github的"免费服务器"

    目录 一. 码云及工具介绍 二. 操作步骤 (1) 创建vue-cli项目 (2) 码云创建仓库 (3) 修改并提交项目到码云仓库 (4) 运行项目 (5) 注意点 三. 尾声 对于学生党来说,买个服 ...

  6. vue3 h函数

    1. 自定义指令(withDirectives 仅可在setup或render函数中使用)可以使用 withDirectives 将自定义指令应用于 VNode: const { h, resolve ...

  7. xxx.app 已损坏,无法打开,你应该将它移到废纸篓/打不开 xxx,因为它来自身份不明的开发者解决方法

    xxx已损坏,无法打开,你应该将它移到废纸篓解决办法 打不开 xxx,因为它来自身份不明的开发者 打不开xxxx,因为 Apple 无法检查其是否包含恶意软件 在安装的时候提示加载失败! 解决: 打开 ...

  8. log4net两分钟三步急速搭建日志框架教程(注意System.Configuration.ConfigurationErrorsException: 配置系统未能初始化 ---> System.Configuration.ConfigurationErrorsException: )

    最近接了个活,winform的帮人做几个页面,这里就以winform项目为例了,之前log4net都是项目中继承好了的,这次自己研究从0到1搭建了一个,发现其实也蛮简单的,主要分为以下三步和一个注意事 ...

  9. PLSQL DEVELOPER使用

    一.下载plsql developer.(oracle官网下载地址:https://www.oracle.com/technetwork/topics/winsoft-085727.html) 二.下 ...

  10. [CSAPP]第一章 计算机系统漫游 学习笔记

    CSAPP 第一章 计算机系统漫游 1.1 信息就是位+上下文 系统中所有信息-----包括磁盘文件.内存中的程序.内存中存放的用户数据以及网络上上传的数据,都是由一串比特表示的.同时区分不同数据对象 ...