文章目录

  • 一、java内存模型堆
    • 1、堆特点
    • 2、堆异常
    • 3、堆的性能调优参数
  • 二、本地方方法

一、java内存模型堆

1、堆特点

堆是用于存放对象的内存区域。因此,它是垃圾收集器(GC)管理的主要目标。

  • 堆在逻辑上划分为“新生代”和“老年代”,在细致一点可分为Eden空间、From Survivor空间、To Survivor。由于JAVA中的对象大部分是朝生夕灭,还有一小部分能够长期的驻留在内存中,为了对这两种对象进行最有效的回收,将堆划分为新生代和老年代,并且执行不同的回收策略。不同的垃圾收集器对这2个逻辑区域的回收机制不尽相同。这块以后会细讲。
  • 内存的分配角度看,线程共享的java堆可能划分出多个线程私有的分配缓冲区。
  • 堆一般实现成可扩展内存大小,使用“-Xms”与“-Xmx”控制堆的最小与最大内存,扩展动作交由虚拟机执行。但由于该行为比较消耗性能,因此一般将堆的最大最小内存设为相等。
  • 堆占用的内存并不要求物理连续,只需要逻辑连续即可。
  • 堆的生命周期是随着虚拟机的启动而创建。
  • 堆是所有线程共享的内存区域,因此每个线程都可以拿到堆上的同一个对象。

2、堆异常

当堆无法分配对象内存且无法再扩展时,会抛出OutOfMemoryError异常。

package com.sl.common;import java.util.ArrayList;
import java.util.List;/*** @author shuliangzhao* @Title: Test* @ProjectName spring-boot-learn* @Description: TODO* @date 2019/9/24 19:41*/
public class Test {public static void main(String[] args) {List<Object> list = new ArrayList<>();while (true) {list.add(new Test());}}
}

上述代码中对象不断的被创建而不进行引用释放,导致GC无法回收堆内存,最终OutOfMemoryError。

3、堆的性能调优参数

  • -Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize):指定JVM的初始和最大堆内存大小,两值可以设置相同,以避免每次垃圾回收完成后JVM重新分配内存。
  • Xmn:设置年轻代大小。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
  • -Xss:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
  • -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath:让JVM在发生内存溢出时自动的生成堆内存快照(堆内存快照文件有可能很庞大,推荐将堆内存快照生成路径指定到一个拥有足够磁盘空间的地方。)
  • -XX:PermSize and -XX:MaxPermSize:设置永久代大小的初始值和最大值(默认:最小值为物理内存的1/64,最大值为物理内存的1/16,永久代在堆内存中是一块独立的区域,这里设置的永久代大小并不会被包括在使用参数-XX:MaxHeapSize 设置的堆内存大小中)
  • -XX:PretenureSizeThreshold :令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制

二、本地方方法

本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,因此不同的虚拟机实可以进行自由实现,我们常用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈。

java 内存模型堆和本地方法相关推荐

  1. java内存 海子_Android 面试经验 - Java 内存模型 - Java 技术驿站-Java 技术驿站

    Java内存模型 目录 Java执行流程 Java文件被编译成字节码文件之后,由JVM中的类加载器进行加载,加载完毕之后,交由JVM的执行引擎执行.在程序执行的过程中,JVM会用一段空间来存储数据和相 ...

  2. Java内存模型 gc算法_JVM内存模型及GC回收算法

    该篇博客主要对JVM内存模型以及GC回收算法以自己的理解和认识做以记录. 内存模型 GC垃圾回收 1.内存模型 从上图可以看出,JVM分为 方法区,虚拟机栈,本地方法栈,堆,计数器 5个区域.其中最为 ...

  3. java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法

    文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...

  4. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

  5. 并发编程专题——第一章(深入理解java内存模型)

    说到并发编程,其实有时候觉得,开发中真遇到这些所谓的并发编程,场景多吗,这应该是很多互联网的在职人员,一直在考虑的事情,也一直很想问,但是又不敢问,想学习的同时,网上这些讲的又是乱七八糟,那么本章开始 ...

  6. Java内存模型(Java Memory Model,JMM)

    导读 本文通过对JSR133规范的解读,详细的介绍JMM的核心理论,并将开发中常用的关键字的实现原来做了详细的介绍.通过本文读者可以了解到并发的一些基本理论,并对一些同步原语有了更深层次的理解.希望读 ...

  7. Java内存模型终于能讲明白啦,建议收藏!

    作者:zhisheng http://www.54tianzhisheng.cn/2018/02/28/Java-Memory-Model/ 前提 <深入理解 Java 内存模型>程晓明著 ...

  8. Java内存模型深度剖析

    作者:Hollis,阿里资深攻城狮 来自:Hollis 为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事 ...

  9. 面试官:说说什么是Java内存模型?

    在面试中,面试官经常喜欢问:『说说什么是Java内存模型(JMM)?』 面试者内心狂喜,这题刚背过:『Java内存主要分为五大块:堆.方法区.虚拟机栈.本地方法栈.PC寄存器,balabala--』 ...

最新文章

  1. 数据库和服务器什么协议,数据库服务器协议
  2. GAN的基本原理与入门应用!
  3. 安顺计算机二级考试,安顺市2020年3月计算机二级报名时间|网上报名入口【12月18日9:00开通】...
  4. 《命犯桃花》离斯蒂芬·金还很遥远
  5. 财务管理c语言oj,九度OJ 1141:Financial Management (财务管理) (平均数)
  6. 冷启动阶段的多规则策略如何筛选?
  7. c++运动学正反解 ros_朔州智能【机器人关节臂】哪家强
  8. static_cast与dynamic_cast转换
  9. The CC version check failed下出现Failed CC version check. Bailing out! 解决方案
  10. 实际应用中installshield的事件处理
  11. USACO 2021-2022 December Contest Bronze 题解
  12. JavaFX+Kotlin游戏从入门到放弃:拯救蛇蛇大作战又名454行实现几何数独游戏
  13. 计算机表格要学些什么,刚学电脑,不知道在电脑上怎么制作各种表格, – 手机爱问...
  14. 一千万的股票能一天卖出吗
  15. 从程序员角度看心理学中的恐慌区、学习区和舒适区
  16. 亚马逊产品违反受限政策,亚马逊受限产品恢复在售
  17. 复旦大学管理学院2017年考博(高级微观经济学+管理理论综合)真题,高微老师上课资料
  18. Android使用VideoView播放网络视频
  19. 科学计算机如何开机,计算器上关机和开机键分别是什么?
  20. Hyperledger Fabric之MSP详解

热门文章

  1. c语言游戏菜单栏,C语言小游戏之打砖块
  2. kubectl 创建pvc_动态挂载云盘(PVC)
  3. 如何安装gnuplot
  4. linux内核杂记(6)-进程调度(1)
  5. rust(31)-枚举体
  6. 【Python】这10个Python性能调优的小技巧,你知道几个?
  7. 《机器学习》课程视频(数据处理、模型构建与优化)
  8. 【Python基础】利用 Python 搞定精美网络图!
  9. GitHub 热榜:这款开源神器可帮您将文本转换为手写文字,并下载为 PDF 格式文件!...
  10. LeetCode_链表类