JVM内存管理(一)
方法区:
方法区存放了要加载的类的信息(名称、修饰符等)、类的静态变量、类中定义为final类型的常量、类中的field信息、类中的方法信息。当开发人员在程序中通过Class对象的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域。
方法区域是全局共享的,在一定条件下,它也会被GC,当方法区域要使用的内存超过其允许的最大值时,就会抛出OutOfMemory的错误信息。
方法区又称为持久代,默认最小值为16M,最大值为64M,可通过-XX:PermSize及-XX:MaxPermSize来指定最小值和最大值
堆:
位操作系统上最大为2GB;在64位操作系统上则没有限制,其大小可通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于1GB。
为了避免在运行时频繁调整Heap的大小,通常将-Xms和-Xmx的值设成一样。
新生代:
大多数情况下,java程序中新建的对象都从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(From和To区)构成。
可通过-Xmn参数来指定新生代的大小,可通过-XX:SurvivorRatio来调整Eden Space及Survivor Space的大小。
旧生代:
用于存放新生代中经过多次垃圾回收仍然存活的对象。例如:缓存对象,新建的对象也有可能在旧生代上直接分配内存。主要有两种状况:1. 大对象,可通过参数设置当对象超过多大时,就直接在旧生代分配内存。2. 大的数组对象。
旧生代所占用的内存大小为-Xmx对应的值减去-Xmn对应的值。
PC寄存器和JVM方法栈:
每个线程均会创建PC寄存器和JVM方法栈,PC寄存器占用的可能为CPU寄存器或操作系统内存,JVM方法栈占用的为操作系统内存,JVM方法栈为线程私有,其在内存分配上非常高效。当方法运行完毕,其对应栈帧所占用的内存也会自动释放。
当JVM方法栈空间不足时,会抛出StackOverflowError的错误。
内存分配:
Java对象所占用的内存主要从堆上进行分配,堆是所有线程所共享的,因此在堆上分配内存时,需要进行加锁,这会导致创建对象开销比较大。当堆空间不足时,会触发Gc,如果GC后空间仍然不足,则抛出OutOfMemory错误信息。
JDK为了提升内存分配的效率,会为每个新创建的线程在新生代的Eden Space上分配一块独立的空间,这块空间称为TLAB,其大小由JVM根据运行情况计算而得。
在TLAB上分配内存时不需要加锁,因此JVM在给线程的对象分配内存时会尽量在TLAB上分配,如果对象过大或TLAB空间已用完,则仍然在堆上进行分配。因此,在编写java代码时,通常多个小的对象比大的对象分配起来更加高效。
JVM内存管理(一)的更多相关文章
- JVM内存管理------垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理(二)
JVM内存管理 JVM在执行java程序的过程中,会把内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖 ...
- JVM内存管理及垃圾回收
一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...
- 现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)
JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- Java的内存 -JVM 内存管理
一.综述 如果你学过C或者C++,那么你应该感受过它们对内存那种强大的掌控力.但是强大的能力往往需要更强大的控制力才能保证能力不被滥用,如果滥用C/C++的内存管理那么很容易出现指针满天飞的情况,不出 ...
- JVM内存管理及垃圾回收【转】
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- 你应该这样理解JVM内存管理
在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...
随机推荐
- 使用Mybatis Generator 生产 AS400中的数据表对象
第一次使用Mybatis,由于公司核心服务器是AS400,参考了网络各个大大的教程后,发现无法使用Mybatis Generator自动生成AS400中的表对象 参考URL: http://www.c ...
- Java常见知识问答
1.String.StringBuilder.StringBuffer (1).String是字符串常量,不允许改变 (2).StringBuffer先开辟了一块空间,可以允许改变,即向这个空间添加值 ...
- [DOM]有一种节点叫做文本节点
HTML可以看成是由节点(node)组成的树结构 我们一般都是在<p>节点里面写字符串. 在上图中,<p>节点和字符串之间有一个text, 这个text就是文本节点. 我们可以 ...
- Java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
如果你更新了ADT的新版本,而工程文件中使用了其他的jar包,也可能会出现"java.lang.RuntimeException: Unable to instantiate activit ...
- 搭建pptpd实现vpn
PPTP(Point to Point Tuneling Protocol,点对点隧道协议)是一种主要用于VPN的数据链路层网络协议. 环境:debian 7.0 在linux下安装pptpd服务实现 ...
- aix用命令查监听端口对应的进程
--aix$netstat -an|grep LISTEN|grep 7867tcp4 0 0 *.7867 *.* LISTEN$netstat -Aan|grep 7867f1000e00029f ...
- ics OverbyteIcsHttpProt
else begin { V7.05 begin } if (FRequestType = httpPOST) or (FRequestType = httpPUT) then begin {$IFD ...
- Delphi Variant oleVariant
The OleVariant type exists on both the Windows and Linux platforms. The main difference between Vari ...
- 解决java.io.IOException: Cannot run program "cygpath": CreateProcess error=2, 系统找不到指定的文件 的错误
一.外部环境: 系统环境:Windows 8 磁盘分区:只有C盘 开发环境:IntelliJ IDEA Community Edition 2016.1.3(64) 执行代码:rdd.saveAsTe ...
- Relay log read failure
root@localhost > show slave status\G*************************** 1. row ************************** ...