我是靠谱客的博主 感性墨镜,最近开发中收集的这篇文章主要介绍JAVA学习DAY-6一、内存垃圾二、JVM三、Minor GC和Major GC/Full GC的区别四、静态类型语言  vs  动态类型语言五、商品管理系统的设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一、内存垃圾

1.什么是内存垃圾

2.什么是垃圾回收  GC(garbage collection)

二、JVM

1.方法区Method Area(元空间)

2.栈区Stack Area

3.堆区 Heap  Area

三、Minor GC和Major GC/Full GC的区别

四、静态类型语言  vs  动态类型语言

五、商品管理系统的设计

1.创建商品类

 2.创建测试类Demo

3.测试结果


一、内存垃圾

1.什么是内存垃圾

JVM堆内存中,已经确认不再被使用的内存对象。

2.什么是垃圾回收  GC(garbage collection)

手动gc,JDK提供了一个gc函数,调用这个函数,就完成对JVM虚拟机内存进行一次gc。 

System.gc()

自动gc,当JVM虚拟机启动后,后台会自动运行一个gc程序,负责内存的gc操作。

这个后台的gc程序会定时做gc操作,或者是当JVM内存不够用的时候,会立刻出发gc。

主要管堆区

JDK自带的 jvisualvm 工具,安装Visual GC插件

同一个对象可以被多个指针同时指向
一个指针可以指向不同的对象,但是同一时刻只能指向一个对象

1. 指针是可以传递的
   从栈中传递到堆区
           例如: 领养宠物成功后, 将宠物对象的指针传递到宠物数组中进行存储
                 随机生成怪物对象后, 将怪物对象的指针传递到怪物数组中进行存储
   从栈中传递到另一个栈中
           例如: 宠物杀死怪物成功后, 调用宠物的killOk方法, 并把怪物的指针传递
           到killOk方法中, 这样可以在killOk方法中通过怪物的指针获取到被杀死的怪物对象中的信息
 

2. 禁止直接操作对象中的属性, 用成员方法封装操作对象属性的过程
   对象中的属性被private封装了
   所有操作都应该提供成员方法, 用指针去调用成员方法来操作
   例如: 当宠物攻击或被攻击, 怪物攻击或被攻击, 都应该提供对应的成员方法进行调用


测试:

当对象有指针指向的时候,对象不会被垃圾回收器回收
当对象没有指针指向的时候,对象会被垃圾回收器回收(不会被立即回收)

二、JVM

1.方法区Method Area(元空间)

方法区Method Area  ---> JDK1.8后改名为元空间Meta Space

   存储  字节码文件

2.栈区Stack Area

      没有GC垃圾回收,返回后或出异常则自动出栈。

3.堆区 Heap  Area

对象在堆区

   新生代(回收最频繁的区域)

   1.伊甸园区

   2.幸存者1区

   3.幸存者2区

   4. 老年区

      会溢出,溢出后报错

程序运行过程中很多对象都是朝生夕死

小对象出生在伊甸园区,gc回收后如果存活下来会被转移到幸存者区,对象的年龄计数器会+1,当对象经历16次回收后依然能够存活,会进入老年代

重对象/大对象  一出生就在老年代

三、Minor GC和Major GC/Full GC的区别

Minor GC发生在新生代的GC

Major GC/Full GC发生在老年代的GC,通常Major GC 发生的时候都伴随着Minor GC的发生,速度比较慢。

在执行GC的时候,所有的线程都会暂停运行,有一句话叫做“stop the wrold! ”

四、静态类型语言  vs  动态类型语言

静态(程序未运行时的状态)类型语言:

任何一个变量在定义的时候就必须指定其数据类型,并且数据类型不允许改变。

动态(程序运行的状态)类型语言:

变量的类型是程序运行的时候才知道。

五、商品管理系统的设计

1.创建商品类

public class Goods {
private String name;
private Integer price;
private String description;
private Long stock;
private String category;
private String state;
public Goods() {
}
public void show(){
System.out.println("*****" + this.name + "的信息" + "*****");
System.out.println("商品价格:" + this.price);
System.out.println("商品描述:" + this.description);
System.out.println("商品库存:" + this.stock);
System.out.println("商品分类:" + this.category);
System.out.println("商品状态:" + this.state );
System.out.println();
}
public Goods(String name, Integer price, String description, Long stock, String category, String state) {
this.name = name;
this.price = price;
this.description = description;
this.stock = stock;
this.category = category;
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Long getStock() {
return stock;
}
public void setStock(Long stock) {
this.stock = stock;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}

 2.创建测试类Demo

import java.util.Scanner;
public class Demo01 {
static Scanner sc = new Scanner(System.in);
static Goods[] goodsArr = new Goods[10]; //定义了一个商品类型的数组,初始长度为10
public static void main(String[] args) {
int choice = 0;
do{
System.out.println("*****欢迎来到坤坤商品管理系统*****");
System.out.println("1.添加商品1");
System.out.println("2.添加商品2");
System.out.println("3.查看商品");
System.out.println("4.商品数组扩容");
System.out.println("5.退出");
System.out.println("请选择:");
choice = sc.nextInt();
switch (choice){
case 1:
addGoods1();
break;
case 2:
addGoods2();
break;
case 3:
display();
break;
case 4:
dilatation();
break;
}
}while(choice != 5);
System.out.println("byebye~鸡你太美");
}
//添加商品方法1
private static void addGoods1() {
if(goodsArr[goodsArr.length-1] != null){
System.out.println("商品已登记满,请扩容!");
return;
}
System.out.println("请输入商品名称:");
String name = sc.next();
System.out.println("请输入商品价格:");
int price = sc.nextInt();
System.out.println("请输入商品的描述:");
String description = sc.next();
System.out.println("请输入商品库存:");
int stock = sc.nextInt();
System.out.println("请输入商品分类:");
String category = sc.next();
System.out.println("请输入商品状态:");
String state = sc.next();
Goods goods = new Goods(name,price,description, (long) stock,category,state);
for (int i = 0; i < goodsArr.length; i++) {
if(goodsArr[i] == null){
goodsArr[i] = goods;
break;
}
}
System.out.println("商品信息添加成功:");
}
//添加商品方法2
private static void addGoods2() {
Goods goods = new Goods();
System.out.println("请输入商品名称:");
String name = sc.next();
System.out.println("请输入商品价格:");
int price = sc.nextInt();
System.out.println("请输入商品的描述:");
String description = sc.next();
System.out.println("请输入商品库存:");
int stock = sc.nextInt();
System.out.println("请输入商品分类:");
String category = sc.next();
System.out.println("请输入商品状态:");
String state = sc.next();
goods.setName(name);
goods.setPrice(price);
goods.setDescription(description);
goods.setStock((long) stock);
goods.setCategory(category);
goods.setState(state);
for (int i = 0; i < goodsArr.length; i++) {
if(goodsArr[i] == null){
goodsArr[i] = goods;
break;
}
}
}
//商品数组扩容
private static void dilatation(){
System.out.println("扩容前商品栏位长度:" + goodsArr.length);
Goods[] newgoodsArr = new Goods[goodsArr.length * 2];
//每次扩容2倍
for (int i = 0; i < goodsArr.length; i++) {
newgoodsArr[i] = goodsArr[i];
}
goodsArr = newgoodsArr;
System.out.println("扩容后商品栏位长度:" + goodsArr.length);
}
//遍历商品
private static void display() {
for (int i = 0; i < goodsArr.length; i++) {
if(goodsArr[i] == null) {
System.out.println((i+1) + "号商品:未登记");
}else {
System.out.println((i+1) + "号商品:" + goodsArr[i].getName());
}
}
}
}

3.测试结果

 

 

最后

以上就是感性墨镜为你收集整理的JAVA学习DAY-6一、内存垃圾二、JVM三、Minor GC和Major GC/Full GC的区别四、静态类型语言  vs  动态类型语言五、商品管理系统的设计的全部内容,希望文章能够帮你解决JAVA学习DAY-6一、内存垃圾二、JVM三、Minor GC和Major GC/Full GC的区别四、静态类型语言  vs  动态类型语言五、商品管理系统的设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部