JVM手动分配内存(转载)

原文内容很详细,不利于快速浏览,所以只保留了重点

原文地址 http://blog.csdn.net/mr__fang/article/details/47723767

内存检测工具jvisualVM参考

https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

内存设置的主要参数:

Trace跟踪参数(打印日志):

1、打印GC的简要信息

-verbose:gc
-XX:+printGC

2、打印GC的详细信息:

-XX:+PrintGCDetails

3打印CG发生的时间戳

-XX:+PrintGCTimeStamps

4指定GC log的位置:

-Xloggc:log/gc.log

5每一次GC前和GC后,都打印堆信息。

-XX:+PrintHeapAtGC

6监控类的加载。

-XX:+TraceClassLoading

7按下Ctrl+Break后,打印类的信息(mac上没法用)

-XX:+PrintClassHistogram

二、堆的分配参数:

1.-Xmx –Xms:指定最大堆和最小堆

2.

  • -Xmn

    设置新生代大小

  • -XX:NewRatio

    新生代(eden+2*s)和老年代(不包含永久区)的比值

    例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5

  • -XX:SurvivorRatio(幸存代)

    -XX:SurvivorRatio=8

    设置两个Survivor区和eden的比值

    例如:8,表示两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10

3、-XX:+HeapDumpOnOutOfMemoryError、-XX:+HeapDumpPath

  • -XX:+HeapDumpOnOutOfMemoryError

    OOM时导出堆到文件

      根据这个文件,我们可以看到系统dump时发生了什么。

  • -XX:+HeapDumpPath(这个可以不设置,默认到处到当前项目根目录下,设置后会因为文件名相同无法导出第二次)

    导出OOM的路径

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump

4、-XX:OnOutOfMemoryError:

  • -XX:OnOutOfMemoryError

    在OOM时,执行一个脚本。

      可以在OOM时,发送邮件,甚至是重启程序。

-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是当前进程的pid 

5.

堆的分配参数总结:

  • 根据实际事情调整新生代和幸存代的大小
  • 官方推荐新生代占堆的3/8
  • 幸存代占新生代的1/10
  • 在OOM时,记得Dump出堆,确保可以排查现场问题

6、永久区(也就是常说的methodSpace)分配参数:

  • -XX:PermSize  -XX:MaxPermSize
  • 类多了就炸了

    设置永久区的初始空间和最大空间。也就是说,jvm启动时,永久区一开始就占用了PermSize大小的空间,如果空间还不够,可以继续扩展,但是不能超过MaxPermSize,否则会OOM。

    他们表示,一个系统可以容纳多少个类型

三、栈的分配参数:

1、Xss:

-Xss256K 

设置栈空间的大小。通常只有几百K

  决定了函数调用的深度

  每个线程都有独立的栈空间

  局部变量、参数 分配在栈上

注:栈空间是每个线程私有的区域。栈里面的主要内容是栈帧,而栈帧存放的是局部变量表,局部变量表的内容是:局部变量、参数。

用没有出口的递归调用可导致栈溢出

时间: 2024-09-29 04:26:18

JVM手动分配内存(转载)的相关文章

JVM并发分配内存解决方案

1:对进行分配内存的动作进行同步处理-实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性. 2:把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程预先在JAVA堆中预先分配一小块内存,称为本地线程分配缓存(TLAB). 哪个线程要分配内存,就在哪个线程的TLAB上进行分配.只有在TLAB用完并分配新的TLAB时,才需要加同步锁.虚拟机是否使用TLAB,可以通 过参数-XX:+/UseTLAB参数来设定. 3:直接在栈上分配,如果对象没有发生逃逸,那么对象将不会再堆上分配.对象

C&C++动态分配内存(手动分配内存)三种方式

1. malloc函数 函数原型:void *malloc(unsigned int size)函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址. 可以看到,函数返回值是一个void指针,请注意,void指针不是一个可以指向任何类型数据的指针,而是 说,不指向任何类型的数据,仅仅是提供了一个地址.因而,你想让这个指针指向int型数据,要进行显式的类型转换(强制类型转换),即在前面加(int *).一般来说,如果不加,是可以自动进行隐式类型转换的. 2.

JVM对象分配内存的工作流程图

备注: 1.超大对象是指对象大小大于Eden+S0 2.新生代采用复制算法进行垃圾回收 3.老年代采用标记整理算法进行垃圾回收 原文地址:https://www.cnblogs.com/gaopengpy/p/12180381.html

jvm对大对象分配内存的特殊处理(转)

前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事.以下给出具体代码来说明: 首先定义好jvm内存各个区域的大小.我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下: Shell代码   -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 紧接着,开始写程序.很简单,就是初

【深入理解JVM】:内存分配与回收策略

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置. 本文中的内存分配策略指的是Serial / Serial Old收集器下(ParNew /

JVM实例以及内存的分配机制

JVM:一台用来模拟计算机执行计算指令的虚拟计算机,拥有自己的指令,指令执行环境,虚拟内存等. 下面介绍虚拟机(JVM)--cpu,寄存器,内存,指令 ====================================================================================================== 1.创建JVM装载环境和配置(GetApplicationHome取得Java.exe进程的路径,chshi) 2.装载JVM.dll 3.初

JVM学习之内存分配一

转自:http://blog.csdn.net/mazhimazh/article/details/16879055,多谢博主分享 我们知道计算机的基本构成是:运算器.控制器.存储器.输入和输出设备,那这个JVM也是有这成套的元素,运算器是当然是交给硬件CPU还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM指令集,这与汇编的命令集有点类似,每一种汇编命令集针对一个系列的CPU,比如8086系列的汇编也是可以用在8088上的,但是就不能跑在8051上,而JV

各种数据类型在jvm里的内存分配

jvm运行时数据区的简单介绍 JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区. 其中本文涉及到的主要有:java虚拟机站(简称java栈),java堆和方法区. 这里简单地普及一下这三种数据区的知识,java栈的读取速度是最快的(紧次与CPU的寄存器,跨平台性比寄存器好,android使用的是寄存器),但是里面的数据内存大小是编译时就已经分配好的,在运行时都不会改变:java堆的速度没有java栈的速度那么快,但是java堆里面的数据内存

浅析Java的jvm上的内存位置的分配

浅析Java的jvm上的内存位置的分配 1.Java的内存区域简介 1>程序计数器: 一小块的内存空间,每个线程都有一个独立的计数器,线程私有;作用:作为当前线程代码行行号指示器,这个值可以选取下一条需要执行的字节码指令,例如分支,循环等,每创建一根线程会相应的产生一个程序计数器 2>栈 线程私有,用于存放局部变量,保存基本数据类型的值,操作数栈(保存着计算过程的中间结果),动态链接,方法入口和出口等信息:局部变量表中保存着函数的参数和局部变量,当调用结束以后,栈帧销毁,局部变量表也随之销毁