zoukankan      html  css  js  c++  java
  • java 内存分配

    Java程序对内存分配方式

    1. 从静态存储区域分配。内存在程序编译时就已经分配好,在整个运行期间都存在。如全局变量,static变量。
    2. 在栈上创建。在执行函数时,函数内部变量的存储在栈上创建,函数执行结束自动释放。
    3. 在堆上分配。在运行malloc或new的时候创建

    内存分区

    1. 程序计数器
    2. 虚拟机栈
    3. 本地方法栈
    4. Java堆
    5. 方法区

    又区分为线程共享和线程私有两大类。线程共享指的是可以允许被所有的线程共享访问的内存区,包括堆内存区、方法区、运行时常量池。

    虚拟机栈

    栈中的数据可以共享,虚拟机栈是线程私有的内存空间

    测试栈的深度

    public class TestJVMStack {
        private int count=0;
        public void recursion(){
            count++;
            recursion();
        }
        public void testStack(){
            try {
                recursion();
            }catch (Throwable e){
                System.out.println("deep of stack is "+count);
                e.printStackTrace();
            }
        }
        public static void main(String[] args){
            TestJVMStack ts=new TestJVMStack();
            ts.testStack();
        }
    }
    View Code

    增加参数

    public class TestJVMStack {
        private int count=0;
        public void recursion(long a,long b,long c){
            long d=0,e=0,f=0;
            count++;
            recursion(a,b,c);
        }
        public void testStack(){
            try {
                recursion(1l,2l,3l);
            }catch (Throwable e){
                System.out.println("deep of stack is "+count);
                e.printStackTrace();
            }
        }
        public static void main(String[] args){
            TestJVMStack ts=new TestJVMStack();
            ts.testStack();
        }
    }
    View Code

    可以在IDEA中设置VM Option

    再次运行

    可使用jclasslib查看class文件,下载地址:https://bintray.com/ingokegel/generic/jclasslib/view

    Java堆

    堆内垃圾回收

    public class TestHeapGC {
        public static void main(String[] args){
            byte[] b1=new byte[1024*1024/2];
            byte[] b2=new byte[1024*1024*8];
            b2=null;
            b2=new byte[1024*1024*8];
            System.gc();
        }
    }
    View Code

    设置JVM参数

    -XX:+PrintGCDetails
    -XX:SurvivorRatio=8
    -XX:MaxTenuringThreshold=15
    -Xms40M
    -Xmx40M
    -Xmn20M
    View Code

    观察输出

    方法区

    String.Intern()方法指如果常量池中已经存在当前String,则返回池中的对象,如果不存在,则先将String加入常量池,并返回池中的对象引用。

    虚拟机设置

    缓存

    缓冲区

    import java.io.*;
    
    public class TestCache {
        public static void main(String[] args) throws Exception {
            DataOutputStream out=new DataOutputStream(
                    new BufferedOutputStream(
                            new FileOutputStream("1.txt")
                    )
            );
            out.writeChars("hello");
            out.close();
            FileInputStream in=new FileInputStream("1.txt");
            int len=in.available();
            byte[] b=new byte[len];
            int actLen=in.read(b);
            String str=new String(b);
            System.out.println(str);
        }
    }
    View Code
    -XX:PermSize=2M
    -XX:MaxPermSize=4M
    -XX:+PrintGCDetails
    View Code

    测试代码

    public class PermGenGC {
        public static void main(String[] args){
            for(int i=0;i<Integer.MAX_VALUE;i++){
                String t=String.valueOf(i).intern();//加入常量池
            }
        }
    }
    View Code
  • 相关阅读:
    subprocess
    bytes(str_, encoding="utf8")
    按文件生成时间 排序 批量与生成同步上传文件
    async
    http trigger 事件源是事件的生产者,函数是事件的处理者
    分片上传
    使用 FFmpeg 处理高质量 GIF 图片
    兴趣 主题 字段 二值化 多值并列属性 拆分 二值化
    打开 回收站
    shell如何查看单个或多个文件的行数或总行数
  • 原文地址:https://www.cnblogs.com/uptothesky/p/8338137.html
Copyright © 2011-2022 走看看