java设置栈大小|jvm设置栈大小

java设置栈大小|jvm设置栈大小

java设置栈大小

栈(stack)是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈,程序员不能直接地设置栈。

堆栈是一种执行“后进先出”算法的数据结构

栈的特点是先进后出,队列的特点是先进先出.

栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共

享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要

在运行时动态分配内存,存取速度较慢。

堆栈就是这样一种数据结构.它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中.有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器.开始放入数据的单元叫做“栈底”.数据一个一个地存入,这个过程叫做“压栈”.在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1.读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减

1.这个过程叫做“弹出pop”.如此就实现了后进先出的原则.

jvm设置栈大小

在Java8及以后的版本中,我们可以使用以下命令设置元空间的初始大小和最大大小:-XX:MetaspaceSize=N-设置元空间的初始(和最小大小)。-XX: MaxMetaspaceSize=N-设置元空间的最大大小。

什么是元空间Metaspace Size大小?

从我们的角度来看,需要注意的是,Metaspace的默认最大大小是无限的。相反,java7及更早版本的PermGen在32位JVM上的默认最大大小为64mb,在64位JVM上为82mb。

Metaspace是否会进行收集垃圾?

一旦类元数据使用量达到“MaxMetaspaceSize”,就会触发死类和类加载器的垃圾收集。显然需要对元空间进行适当的监视和调优,以限制此类垃圾收集的频率或延迟。

什么是Java中的元空间内存?

简单地说,Metaspace是一个新的内存空间——从Java8版本开始;它取代了旧的PermGen内存空间。最大的区别在于它如何处理内存分配。因此,默认情况下,本机内存区域会自动增长。

Java8中PermGen空间的替代品是什么?

在Java8中,PermGen空间被元空间取代。PermSize和MaxPermSize JVM参数将被忽略,如果在启动时出现,则会发出警告。类元数据的大多数分配现在都是从本机内存中分配的。

PermGen是永久生成代的缩写,它是一个特殊的堆空间,它与主Java堆分开,JVM在主堆中跟踪已加载类的元数据。在Java8中,PermGen被重命名为Metaspace—有一些细微的区别。从我们的角度来看,需要注意的是Metaspace有一个无限制的默认最大大小。相反,java7及更早版本的PermGen在32位JVM上的默认最大大小为64mb,在64位版本上为82mb。当然,这些不同于初始尺寸。Java7和更早版本的初始PermGen空间大约为12-21MB。

值得一提的是,在Java7之前,内部字符串通常保存在PermGen上。

这会导致 java.lang.OutOfMemoryError:永久代内存溢出

无论何时需要调整PermGen/Metaspace的大小,JVM都会像对待标准堆一样进行调整。调整这些空间的大小需要一个完整的GC,这通常是一个昂贵的操作。它通常可以在启动时观察到,当许多类被加载时。尤其是当应用程序依赖于许多外部库时。如果在启动过程中有很多完整的gc,通常就是因为这个。在这种情况下,增加初始大小可以提高启动性能。

要增加PermGen,我们有以下命令:

-XX: PermSize=N-设置永久生成空间的初始(和最小大小)。

-XX: MaxPermSize=N-设置永久生成空间的最大大小。

在Java 8及更高版本中,我们可以使用以下命令设置元空间的初始大小和最大大小:

-XX: MetaspaceSize=N-设置元空间的初始(和最小大小)。

-XX: MaxMetaspaceSize=N-设置元空间的最大大小。

对于与Java进程在内存空间中使用的区域相关的大小调整,需要考虑以下几个方面。

Java堆:管理Java对象的空间

元空间:管理类信息的空间

其他空间:堆栈空间,以及java vm和本机方法使用的C堆空间

可以使用以下两种方法来调整上述空间的大小:

注意:

如果上面计算的元空间的最大大小小于64 MB,则该空间的最大大小将设置为64 MB。Java堆和其他空间的最大大小计算如下:将((MaxSizeFallSpaces-100MB)-64 MB)的结果分配给Java堆和其他空间,比例分别为75%和15%。

如果在Java操作环境变量中指定了设置最大大小的Java选项(无论是-Xmx还是-XX:MaxMetaspaceSize),则根据“使用Java\OPTS环境变量指定”中描述的方法确定每个空间的最大大小。

在具有高多重性的请求或具有深调用堆栈的方法的情况下,如果进程输出下面的消息并失败,则表示超出容器中的最大内存值,因此需要在“指定使用JAVA\OPTS环境变量”中描述的调优。

exit_description: out of memory, exit_status: 143

使用JAVA_OPTS环境变量指定Metaspace默认大小

指定一个Java选项,该选项设置Java_OPTS环境变量中每个空间的大小。

估计每个空间所需的最大大小,并使用Java选项进行设置,以使空间的总大小不超过(maxSizeOfAllSpaces(默认为1gb)-300mb的结果)(请参阅注1)。300 MB被分配给管理Java应用程序进程的空间。

用户应该验证并负责选择正确的Java选项,而不是Java选项中的-Xmx和-XX:MaxMetaspaceSize。

注意:

请参阅下表,并确保空间的最大大小总和不超过(maxSizeOfAllSpaces(默认为1 GB)-300 MB)的结果。不要省略表中的两个Java选项,因为如果省略了指定最大大小的Java选项,java VM会自动确定最大大小。

对于剩余的空间,从(maxSizeOfAllSpaces减去maxJavaHeapSize和maxMetaspaceSize的总和-300 MB)没有Java选项来配置其他空间。

字节大小可以用-Xmx和-XX:MaxMetaspaceSize指定。以下字符可以指定为单位:

对于KB(千字节):“k”或“k”

对于MB(兆字节):“m”或“m”

对于GB(GB):“g”或“g”

java栈大小怎么设置

方法如下:

1、虚拟机的启动入口位于share/tools/launcher/java.c的main。

2、配置JVM装载环境。

3、解析虚拟机参数。

4、设置线程栈大小。

5、执行Java main。

配置JVM装载环境的方法:

1、Java代码执行时需要一个JVM环境,JVM环境的创建包括两部分:JVM.dll文件的查找和装载,我们来看一段Jre通过环境的路径和系统版本寻找jvm.cfg文件的代码。

说明: 1)GetJREPath()查找当前JRE环境的所在路径。

2)ReadKnownVms()读取JRE路径\lib\ARCH(CPU构架)\JVM.cfg文件,其中ARCH(CPU构架)通过GetArch方法获取,在window下有三种情况:amd64、ia64和i386。

3)CheckJvmType确定当前JVM类型,先判断否通过-J、-XXaltjvm=或-J-XXaltjvm=参数指定,如果没有,则读取JVM.cfg文件中配置的第一个类型。

4)GetJVMPath根据上一步确定的JVM类型,找到对应的JVM.dll文件。

java一个线程默认的栈大小

在/etc/profile 的最后面添加ulimit -s unlimited 保存,source /etc/profile使修改文件生效

linux查看修改线程默认栈空间大小 :ulimit -s

1、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M

2、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s , 即修改为100M

3、可以在/etc/rc.local 内 加入 ulimit -s 则可以开机就设置栈空间大小

4、在/etc/security/limits.conf 中也可以改变栈空间大小:

#

* soft stack

重新登录,执行ulimit -s 即可看到改为 即100M

怎么设置栈的大小

递归时,递归层数比较多,递归函数里局部变量所占的空间也比较多,两种因素一结合,很容易导致默认大小的栈溢出

Java栈大小

各司其职

最主要的区别就是栈内存用来存储局部变量和方法调用。而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

独有还是共享

栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。

异常错误

如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。

空间大小

栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值。

这就是Java中堆和栈的区别。理解好这个问题的话,可以对你解决开发中的问题,分析堆内存和栈内存使用,甚至性能调优都有帮助。

具体可以访问我的翻译文章

Java中的堆和栈的区别

默认栈大小

计算机等级考试java二级重点内容 原创

设栈的存储空间为S(1:50),初始状态为top=51.经过一系列正常的入栈和退栈操作之后,top=20,则栈中的元素为31.

解析:top=0表示栈空,top=50表示栈满。入栈操作首先将top加1,然后将新元素插入到top指针指向的位置;退栈操作首先将top指针指向的元素赋给一个指定的变量,然后将top减1.栈顶指针top动态反映了栈中元素的变化情况。栈中的元素个数为50-20+1=31.所以答案是31.

循环队列中,font=出队,rear是入队,所以一般剩余的元素个数为m-font+rear(只出现在font=rear=m)

循环队列中初始值font=rear=50,经过一系列入队和退队操作后,font=rear=25,则该循环队列中元素个数为0或者50个。

循环队列是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间。如果循环队列的初始状态是空的。即rear=front=m,队列元素个数为rear=front。

在带链队列中,经过正常操作后,如果front=rear,则队列中的元素个数为0或1.

在带链中,经过正常操作之后,如果top=bottom,则栈中元素个数为0或1.

栈·······初始状态top为0,经过一系列的入栈和退栈之后, top=30,栈中元素为30.

栈的顺序存储空间为s(1:m),初始状态为top=0,栈中元素个数为top。

栈存储空间是1:50,初始状态top=0,经过入栈退栈后,top=51,栈中元素个数不可能。

算法要考虑时间复杂度和空间复杂度;时间复杂度是指算法所需要的计算工作量,空间复杂度是指执行这个算法所需要的内存空间。

算法的时间复杂度与运行算法时特定的输入法有关。

算法的时间复杂度与问题规模无关 ❌

对于各种特定的输入,算法的时间复杂度是固定不变的 ❌

算法是指阶梯方案的准确而完整的描述,有如下特征:可行性、确定性、有穷性(算法的有穷性是指算法必须在有限的时间内做完,即算法必须能在执行有限个步骤之后终止)。

平均情况与最坏情况下的时间复杂度相同的是在顺序存储的线性表中寻找最大(或小)项**(n-1)**。

在最坏情况下,冒泡排序的比较次数为n(n-1)/2

顺序表的长度为n,最坏情况下比较次数等于n(n-1)/2的是快速排序

设置栈空间大小

顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常的习惯做法以top=0表示空栈。一般来说,在初始化设空栈时不应限定栈的最大容量。

一个较合理的做法:先为栈分配一个基本容量,然后在应用过程中,当栈的空间不足在进行扩展。空栈时的表示为S.top == S.base。

java虚拟机栈默认大小

JVM(二) 栈内存结构

栈内存是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、返回出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、方法返回值和异常分派(Dispatch Exception)。栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束

java栈内存大小

栈是线程的,不是进程的 是一个进程一个堆,一个线程一个栈吗 堆≈虚拟内存大小-1GB 栈通常为4MB 下面是一些说明文件: Visual C++ 编译器选项 /F(设置堆栈大小) 请参见 发送反馈意见 设置程序堆栈大小(以字节为单位)。

/F[ ]number 参数 number 堆栈大小(以字节为单位)。备注 如果不使用此选项,堆栈大小默认为 1 MB。number 参数可以用十进制或 C 语言表示法表示。参数的范围可以在 1 到链接器接受的最大堆栈大小之间。链接器将指定值向上舍入为最接近的 4 个字节。/F 和 number 之间的空格可选的。

java栈默认大小

和c++没啥关系pthread的默认栈大小是1Mb堆是和其他线程公用进程的堆 堆可以增长到2Gb以上,大概2.6Gb, 但是具体多少我也不清楚

推荐阅读