java内存机制


前言

作为java工程师了解一下java内存机制是十分有必要的,一起来学习它吧。


一、jvm内存模型

在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存;因此,在Java中我们常常说到的内存管理就是针对这段空间进行的;
运行时数据区又分为五个部分:
1.程序计数器:
JVM中的程序计数器并不是物理概念上的CPU寄存器,但是逻辑作用上是等同的,在JVM中多线程也是通过线程轮流切换来获得CPU执行时间的,在任一具体时刻,一个内核只会执行一条线程中的指令,为使每个线程都在线程切换后能够恢复回之前的程序执行位置,每个线程都需要有自己独立的程序计数器,且不能互相被干扰,否则就会影响到程序的正常执行次序。因此程序计数器是每个线程私有的。
2.Java栈:
Java栈中存放的栈帧包括:局部变量表、操作数栈、运行时常量池的引用、方法返回地址和一些额外的附加信息。当线程执行一个Java方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈;因此Java栈也是线程私有的。
3.本地方法栈:
原理大体与Java栈相同,但Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法服务的。
4.方法区:
是被线程共享的区域,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
5.堆:
是被线程共享的区域,存储了对象本身以及数组.

二、 JAVA命令性能调优常用参数

-Xms 和 -Xmx (或: -XX:InitialHeapSize 和 -XX:MaxHeapSize):指定JVM的初始和最大堆内存大小,两值可以设置相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xss:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M。在相同物理内存下,减小这个值能生成更多的线程。
使用方式(例):
java -Xms3600m -Xmx3600m

三、实例说明

public class test1 {
    public static void main(String[] args) {
        type t=new type();
        Object obj=new Object();
        int n=obj.hashCode();
        int a[]={0,1,2,3};
        fun(t);
    }
    public static void fun(type t) {
    t.i=2;
    t.str="!";
    }
}
class type{
    int i=1;
    static int a=2;
    String str ="hello world";
}

使用javap -verbose 命令反编译class文件并输出详细信息可得:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行时堆栈内存开辟情况无法从编译产生的class文件获取。可以使用jmap和
jstack来监测堆内存和线程执行快照.

四、溢出

栈溢出
当线程请求栈的深度大于最大栈深,则会出现栈溢出;常出现在没有设置方法迭代结束条件,或设置了但实际上没有实现的情况下。如:

public void fun()
{
fun();
}

内存溢出
线程在申请内存时,没有足够的空间供其使用;
引起内存溢出的原因有很多种,常见的有以下几种:
  1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  3.代码中存在死循环或循环产生过多重复的对象实体;
  4.使用的第三方软件中的BUG;
  5.启动参数内存值设定的过小;

总结

以上就是今天要讲的内容,本文简单介绍了java内存机制以及一些java命令调优参数,并用一个例子说明了哪些数据会存放到哪个区域。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值