一、概述,内存结构图

二、堆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: 线程局部变量,即每个线程从主内存中拷贝的变量副本

最新文章

  1. jQuery源码分析系列(35) : Ajax - jsonp的实现与原理
  2. linear-gradient----渐变
  3. tcp/IP点对点通信程序
  4. ZOJ 1125 Floating Point Numbers
  5. width() innerwidth() outerwidth() css('width')
  6. Java中实例方法,实例变量,静态方法,静态变量,final方法重写的问题,覆盖
  7. jQuery效果-淡入淡出
  8. eclipse tomcat add时提示The Tomcat server configuration at \Servers\Tomcat v6.0 Server at localhost-
  9. 关于Unity中NGUI图片精灵响应鼠标的方法
  10. 阿里云OCR图片转换成文字识别调用
  11. [Swift]LeetCode247.对称数 II $ Strobogrammatic Number II
  12. tcp协议的简单理解
  13. _ZNote_Qt_QDialog_修改button名称
  14. 为SNP增加种族人群频率
  15. 腾讯云快速完成python3.6开发环境搭建与django应用部署
  16. Spring源码学习(总)
  17. [9] 圆环(Ring)图形的生成算法
  18. ios开发之 -- 自动轮播图创建
  19. Linux运维学习笔记-文件权限知识总结
  20. 开源一款强大的文件服务组件(QJ_FileCenter)(系列三 访问接口与项目集成)

热门文章

  1. Word 设置页眉、页脚、页码
  2. AOP中的一些重要术语简介
  3. LeetCode-540 有序数组中单一元素
  4. elasticsearch 索引数据手动复制注意事项
  5. Linux修改开机图形/etc/motd
  6. C# DevExpress GridControl下动态创建列的方法
  7. 在docker中,运行Jcmd命令,报错
  8. JavaWeb 之 Cookie
  9. Qt6.2 在Ubuntu20下提示 C++ 和 CMake 错误
  10. windows mongo 开启副本集 6.x版本 mongo : 无法将“mongo”项识别为 cmdlet、函数、脚