首页 > 编程知识 正文

栈内存和堆内存的特点,hashset底层实现原理

时间:2023-05-04 17:58:17 阅读:25463 作者:4770

JVA堆栈内存堆栈内存

Java将内存分为堆栈内存和堆内存两种,具有不同的作用。 堆栈内存存储局部变量和方法调用。

堆栈内存属于单个线程,每个线程都有堆栈内存,存储的变量只能在所属线程中看到。 这意味着堆栈内存可以理解为线程的专用内存。

堆内存中的对象显示在所有线程上。 堆中的对象可以由所有线程访问。 堆内存用于存储Java中的对象。 无论是成员变量、局部变量还是类变量,它们指向的对象都存储在堆内存中。

参照变量是普通变量,定义时为堆栈分配内存,参照变量在程序运行时释放到范围外。 序列&; 对象本身被分配给堆,即使程序运行在包含使用new生成数组和对象的语句的代码块之外,也不会释放数组和对象本身占用的堆内存。 当引用变量不指向它时,数组和对象会变成垃圾,无法使用,但会占用内存,并在随后的不确定时间被垃圾收集器释放。 这也是java占用内存的主要原因。 实际上,堆栈中的变量指向堆内存中的变量。 这就是java中的指针。

javaGC和调谐

Java的垃圾回收机制在GC线程上运行,是Java虚拟机自身使用的守护程序线程。 负责打扫所谓“达不到”的对象。 程序创建对象后,GC将开始监视该对象的地址、大小和使用情况。 GC在判断部分对象为“不可到达”的情况下,负责回收这些存储器区域。

调整时可以参照的jvm的一般参数如下所示

参数名称

意思是

默认值

-Xms

初始堆大小

物理内存的1/64 ) 1GB

缺省值(可通过MinHeapFreeRatio参数调整)如果可用堆内存小于40%,JVM会将堆增加到-Xmx的最大限制。

-Xmx

最大堆大小

1/4物理内存) 1GB

默认(可通过MaxHeapFreeRatio参数调整)如果可用堆内存超过70%,JVM将减少堆的最小限制,直到-Xms

-Xmn

年轻一代的大小(1.4or lator )。

注意:此处的大小为“Eden 2服务空间”。 与jmap -heap中显示的New gen不同。

整个堆大小=年轻一代的大小;老一代的大小;持续一代的大小

增加年轻一代的话,老一代的尺寸会变小。 此值对系统性能有很大影响,Sun政府建议将其配置为整个堆的3/8

-XX:NewSize

设定年轻一代的大小(for 1.3/1.4 )

-XX:MaxNewSize

年轻一代的最大值(for 1.3/1.4 )。

-XX:PermSize

设定“永久”初始值

物理内存的64分之一

-XX:MaxPermSize

设置永久最大值

物理内存的四分之一

-Xss

每个线程的堆栈大小

从JDK5.0开始,每个线程的堆栈大小为1米,以前线程堆栈大小为256K。 调整更具应用性的线程所需的内存大小。 在同一物理内存下,减小该值可以生成更多的线程。 但是,操作系统对一个进程中的线程数有限制,不能无限生成。 经验值在3000~5000左右

对于一般较小的APP应用程序,如果堆栈不是很深,则128k应该足够大的APP应用程序建议使用256k。 此选项对性能有很大影响,需要进行严格的测试。 校长。

与“threadstacksize”选项的说明非常类似,但似乎未在官方文档中说明。 在论坛上,有这样一句话。 ”

- xssistranslatedinavmflagnamedthreadstacksize "

一般设定这个值就可以了。

- xx :热堆叠大小

热堆叠大小

(0meansusedefaultstacksize ([ SPARC :512; solarisx 863360320 (was 256 priorin 5.0 and earlier; SPARC 64位: 1024 Linux amd 6433601024 (was0in 5.0 and earlier ); all others 0.]

-XX:NewRatio

年轻一代(包括腐朽的鸟和两个Survivor区);与老年一代的比较);不包括永久一代) ) ) ) ) ) ) )。

-XX:NewRatio=4表示年轻一代与老一代的比率为1:4,年轻一代占整个堆栈的1/5

如果Xms=Xmx设置了Xmn,则无需设置此参数。

-XX:SurvivorRatio

腐朽飞鸟区和Survivor区大小之比

如果设置为8,则两个Survivor区和一个腐朽飞鸟区的比率为2:8,一个Survivor区占整个年轻一代的1/10

-XX:LargePageSizeInBytes

内存页面的大小不能太大。 影响Perm的大小

=128m

- xx :用户界面访问sorm

ethods

原始类型的快速优化

-XX:+DisableExplicitGC

关闭System.gc()

这个参数需要严格的测试

-XX:MaxTenuringThreshold

垃圾最大年龄

如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率

该参数只有在串行GC时才有效.

-XX:+AggressiveOpts

加快编译

-XX:+UseBiasedLocking

锁机制的性能改善

-Xnoclassgc

禁用垃圾回收

-XX:SoftRefLRUPolicyMSPerMB

每兆堆空闲空间中SoftReference的存活时间

1s

softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap

-XX:PretenureSizeThreshold

对象超过多大是直接在旧生代分配

0

单位字节 zrdyc代采用Parallel Scavenge GC时无效

另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象.

-XX:TLABWasteTargetPercent

TLAB占eden区的百分比

1%

-XX:+CollectGen0First

FullGC时是否先YGC

false

并行收集器相关参数

-XX:+UseParallelGC

Full GC采用parallel MSC

(此项待验证)

选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.(此项待验证)

-XX:+UseParNewGC

设置年轻代为并行收集

可与CMS收集同时使用

JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值

-XX:ParallelGCThreads

并行收集器的线程数

此值最好配置与处理器数目相等 同样适用于CMS

-XX:+UseParallelOldGC

年老代垃圾收集方式为并行收集(Parallel Compacting)

这个是JAVA 6出现的参数选项

-XX:MaxGCPauseMillis

每次年轻代垃圾回收的最长时间(最大暂停时间)

如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.

-XX:+UseAdaptiveSizePolicy

自动选择年轻代区大小和相应的Survivor区比例

设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开.

-XX:GCTimeRatio

设置垃圾回收时间占程序运行时间的百分比

公式为1/(1+n)

-XX:+ScavengeBeforeFullGC

Full GC前调用YGC

true

Do young generation GC prior to a full GC. (Introduced in 1.4.1.)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。