写这篇博客是为了自己能够再次复习一下JVM,《深入理解java虚拟机》这本书算我的是启蒙教科书了,
这次重读是要把以前模糊的、忘记的部分记录下来。
首先说清楚,内存区域不是内存模型,指的是大家常说的栈、堆、方法区(JDK8中已经改为Metaspace)
虚拟机栈:
每一条线程有一个属于自己的虚拟机栈,而在这条线程执行时,会创建一个个的栈帧,栈帧就是一个个方法,
这么一来,栈帧内部存储的内容也就简单明了了,栈帧内存储局部变量表、操作数栈、方法出口等信息。
每一个方法的开始与结束,便对应一次入栈与出栈的过程,(栈是一种后进先出的数据结构)
栈帧中最重要的应该就是局部变量表了,局部变量表内存储有8中基本类型与对象引用地址,
注意:这里不是存储对象,对象存在堆内存中!这里是仅存储引用地址
-Xss:可以设置每一个虚拟机栈的大小,如-Xss256k
无论是栈帧太大还是虚拟机栈容量太小,当内存无法分配时,都会抛出StackOverflowError的异常
比如说使用了递归方法调用而无法终止时,便会抛出上述异常
Java堆:
为最大的一块内存,所有线程共享,用于分配存放对象实例
堆又可以分为新生代和老年代;
新生代又划分为3个区域:Eden、From Survivor、To Survivor
关于上面细分出来的4个区域,都可以通过jvm启动参数进行设置:
-Xmx:堆最大大小,如-Xmx512m
-Xms:堆初始大小,-Xms256m
设置新生代与老年代的两种方法:
-Xmn:新生代大小,通常为-Xmx的1/3或1/4-XX:NewRatio:新生代与老年代的比例,-XX:NewRatio=2,代表新生代占总堆的1/3,老年代2/3
设置新生代中区域大小:
-XX:SurvivorRatio:新生代中Eden与任一Survivor的比例,-XX:SurvivorRatio=8为默认值,代表Eden占新生代的8/10
当为对象分配内存,而GC(垃圾回收)又无法清理出内存的情况下,会发生Heap Space OutOfMemory Error
使用参数-XX:+HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath=/xxx/xxx/xxx.hprof
可以在Heap OutOfMemory 的时候产生转储快照,然后进行分析,第二个参数可以指定dump文件位置
方法区:
所有线程共享,用于存储被虚拟机加载的类信息、常量、静态变量等数据,方法区也被称为永久代
但是被称为永久代缺不代表这部分内存不会被回收
-XX:PermSize:方法区的初始值,-XX:PermSize=64m
-XX:MaxPermSize:方法区的最大值,-XX:MaxPermSize=128m
方法区主要存放Class的相关信息,当运行时加载太多的类便会发生OutOfMemoryError: PermGen space
直接内存:
还有一种内存为直接内存,不属于虚拟机运行时数据区的一部分。
比如NI/O,可以通过Native方法直接分配内存,受到本机总内存的限制
可以通过-XX:MaxDirectMemorySize来指定大小,默认与-Xmx相同
Java中申请分配内存的方法为unsafe.allocateMemort()方法,unsafe为Unsafe的一个实例
Unsafe这个类并没有对我们开放,需要反射获取实例
内存溢出时抛出OutOfMemoryError,at sun.misc.Unsafe.allocateMemory(Native Method)
上述的内容也许不够详尽,不过由于个人表达能力欠缺,也只能写这么多了;
相信每个人都有自己独特的理解,以上可以作为参考来学习
相关推荐
虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放...
JAVA内存分区与CC++内存分区的总结
Java内存分配与管理是Java的核心技术之一,今天我们深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的...
Java内存中有5个内存区域的划分 1 栈(Stack): 存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。 2 堆(Heap): new出来的东西都在堆中。堆内存里都有一个16进制的地址值。 3 方法区(Method Area):保存....
1. 背景 内存管理----动态分区分配方式的模拟 初始内存空间为 640K,分别利用首次适应算法和最佳适应算法进行内存块的分配和回收 2. 开发和运行 使用 java 进行开发 运行 java -jar App.jar 即可
java内存区域和内存溢出.xmind
最近在看java虚拟相关知识,把每天看到的一些内容做一个归纳总结,下面这篇文章主要给大家介绍了关于Java中内存区域的划分与异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看...
这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...
JVM,虚拟机结构,java,内存结构
Java虚拟机Java内存区域及对象.doc
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到...
JAVA 内存管理总结 1. java是如何管理内存的 2. 什么叫java的内存泄露 3. JVM的内存区域组成 4.Java中数据在内存中是如何存储的 5. Java的内存管理实例
实现内存动态分区,运用Java语言,一共四个类,这是process类
JAVA内存区域与内存溢出异常归类.pdf
➢初始化(设置内存大小、可用分区表、内存分配表) ➢分配(输入一个进程名和所需内存大小,按某种分配算法进行分配,输出分配情况;如不能分配,说明原因)➢回收(输入一个进程名,回收其占用的存储空间) ➢输出内存...
Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作...
NULL 博文链接:https://xdjava.iteye.com/blog/2031254
java 入门、java内存区域和OOM、垃圾回收器和垃圾回收策略
JVM内存结构Java 代码是要运行在虚拟机上的,而虚拟机在执行 Java 程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。如果
Java有几种存储区域? java内存分配 Java内存模型 Java内存分配实例解析 String 常量池问题 堆(Heap)和非堆(Non-heap)内存 堆内存分配 非堆内存分配