JVM笔记二:Java内存区域

Stella981
• 阅读 671

Java程序在虚拟机自动内存管理的机制的帮助下,不容易出现内存泄露和内存溢出问题,这也就要求程序员需要了解虚拟机处理内存的机制,以解决OOM问题。

运行时数据区域

JVM笔记二:Java内存区域

程序计数器

一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。 每个线程都需要一个独立的程序计数器,各线程间互不干扰,独立存储。 如果线程执行的是Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,值为空。 此内存区域是唯一一个在Java虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域

Java虚拟机栈

线程私有的,每一个线程都有一个独立的栈,与线程的生命周期相同。 每个方法在执行时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机中入栈到出栈的过程。 局部变量表存是一组变量存储空间,用于存放方法参数和方法内部定义的局部变量。在编译时即可确定大小,在运行期不改变。 两种异常:

  • StackOverflowError:单个栈的大小大于设定值时,配置-Xss,1.5后64位默认1M,32位默认512K,过大会影响线程的个数
  • OutOfMemoryError:无法为线程的栈分配内存空间时,减小单个栈的大小,会影响栈的深度(待验证,如何确定多线程总的栈空间大小)

Java堆

存放对象实例,是线程共享的,Java虚拟机管理的内存中最大的一块,也是GC管理的主要区域。 现在回收器基本采用分代回收算法,所以可以细分为新生代和老年代,进一步可以细分为Eden空间、From Survivor空间、To Survivor空间等。

  • OutOfMemoryError:堆中没有足够的内存完成实例分配,且堆也无法再扩展,将会抛出OOM

方法区

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是各个线程共享的。别名Non-Heap(非堆),用于与堆区分。 方法区可以选择不实现垃圾回收,但是常量池的数据却可以增长,容易导致OOM,所以HotSpot从1.7之后将常量池移出到本地内存。

  • OutOfMemoryError:方法区中没有足够的内存完成实例分配,将会抛出OOM,可以通过-XX:PermSize=128M -XX:MaxPermSize=512m配置来调大方法区

直接内存

不归虚拟机管理,但是可能引发OOM问题。 JDK1.4以后引入的NIO可以使用Native方法直接使用本地内存,如果使用内存大于宿主机内存,就会发生OOM。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
Java内存区域与内存溢出异常
Java的内存管理是一个老生常谈的问题,虽然Java号称可以自动管理自己的内存,使程序员从内存管理的围墙解放出来,但是一连串的内存泄漏和溢出方面的问题,使得我们不得不去深入了解Java的内存管理机制。本篇文章将从Java的内存区域开始剖析Jvm的内存机制,阐述内存溢出异常产生的原因。运行时数据区域众说周知,Java程序是运行在Java虚拟机
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这