Java入門・初心者質問スレ Part.9
■ このスレッドは過去ログ倉庫に格納されています
複数の変数を書き換えるのをアトミックにやりたい それはvolatileでは無理ですよって読み取ったのだけどあってるかな? >>469 まあまあ、こういうの頭の体操みたいで楽しいじゃん リンク先の本持ってるけど、日本語にするとこんな感じ 質問の条件は 1.は満たすが、2〜3を満たすかどうかは言われていない 2.の不変項は、 例にある、startTime < endTime が常に成り立つようなケースを言ってる ■ volatile 変数を使って良い条件 1.その変数への書き込みが変数の現在値に依存しない、または1つのスレッドだけが値を更新する 2.その変数が他のステート変数とともに不変項に関与していない 3.その変数がアクセスされるとき、ほかの理由でロックが必要とされない …自分の言葉で書き直そうと思ったが、全く同じこと繰り返してるだけなのに気づいてやめた まぁあれだね、スタート/エンドフラグ以外に volatile 使うのはやめたほうが良さげって話ね といいつつ、自分は、UI のコンフィグ的なやつを全部 volatile にしてぶっこんでるんだけどね… UIスレッド以外の、DBやらProperty ファイルから読み込みたいから同期化はしないといかん(でも、synchronized めんどい) あくまでアプリの設定値みたいなやつで、とりあえず自身の現在値に依存した書き込みや、他の変数と条件作るような値はなかったけど… あんまり良くはないんだろうね 独り言で荒らすなゴミ ブログにでも書いてろキチガイ MutexやReentrantLockを使っているところを、ReadWriteLock(Atomic***などを含む)で置き換えられるか? と考えることはあっても、volatileにするかどうかはまず考えないだろう。 長文のString を返すだけのメソッドが大量にあるクラスって、コードキャッシュ領域に大量のメモリ確保しますか? それとも、各メソッドが呼ばれた時に、DB からのロードのようにオンデマンドでメモリ確保しますか? 長文のString を返すだけのメソッドが大量にあるクラスって、(クラスがロードされた時点で)コードキャッシュ領域に大量のメモリ確保しますか? それとも、各メソッドが呼ばれた時に、DB からのロードのようにオンデマンドでメモリ確保しますか? 括弧内書き忘れました ググれカス コードキャッシュ領域ってなんだよ まずJVMのクラスローダーの仕組みから調べて出直せ 回答見てても基本的知識ない奴等しかおらんから間違った回答しまくってるし おまえらはもう全員回答するな 100万回ググれカス >>479 答える気がないなら黙ってろよ お前はクソの役にも立ってない クラスローダってバイトコード読んでクラスをロードするから、 その読まれたバイトコードの機械語に相当する部分がJVMヒープ外のコードキャッシュ領域に保持されるって認識だったんだけど違ってるんかな フィールド値の String は、ヒープの中の String Constant Pool って領域があってそこに確保されてる(String.intern() とかで確認できる) というのはとりあえず基本的なこととして メソッドの中のローカル変数の String は、メソッドがコールスタックに存在する時は当然JVMスタックに存在してるだろうけど、 メソッドがコールスタックにない時は、どうなってるのかなと 呼ばれた時に割り当てられるのか、クラスがロードされてれば呼ばれてないときもメモリが確保されてるのか あと、すまんが例の人はすぐNGにするからそっちにレスしても見えんかも コールスタックに存在するときも、ローカルだろうが文字列リテラルの中身は、JVMスタックじゃなく、多分JVMヒープか(String 内のプール) とりあえず、コールスタックにない時どうなってるのかという疑問はそのまままだあります コードキャッシュ領域なんて言葉はない あと知識が滅茶苦茶&ぐちゃぐちゃでクラスローダーの基本的な動作以前に メモリ領域の区別も理解できてない 調べた事を適当に解釈するんじゃなくて 一つ一つ整理することを覚えろ もう1回だけアドバイスしてやる グ グ レ 糞 ボ ケ カ ス ぐぐれかすで済まされてしまうと そもそもこのスレはいらないことになってしまう それな Java初心者のためのスレッドですと最初に宣言されてる イライラの撒き散らちしの方が多くなってるならこのスレを見ないのが賢明 >>482 ,483 大雑把に言うと、 (メソッド中に散らばっているようなものを含めて)ソースコード上でStringリテラルとして記述されている文字列は、 コンパイル時にclassファイルのコンスタントプールにまとめられて、 classロード時に(JVMヒープ上の)実行時コンスタントプールにロードされます。 この辺きちんと理解したいなら、ググるんじゃなくてJVMS読めばいいです。ちゃんと書いてあります。 (ところでこれ、入門・初心者の質問?) にわか知識からくる質問だから初心者レベルなのは間違いない あと説明不足な上に回答不十分 自分の中で咀嚼できないなら回答レスはしないほうがいい >>489 ありがとうございます ということは、ローカルのStringリテラルもクラスロードした時点でメモリにはずっと載ってるイメージですかね やっぱり長文はしっかり管理するなら外部ファイルから読んだ方が良さそうですね 全然説明になってないからこんな風に全く理解してないんだよね こうやって勝手に解釈して間違った知識を自分の脳に植え付けるってことを繰り返しちゃうんだよ にわかども逝ってよし 激しく自演臭いけど 自分では答えもせず回答者にケチをつけるだけのイライラ君 ごめんなさい、読み返してみたら>>489 はいい加減すぎますね。 > classロード時に(JVMヒープ上の)実行時コンスタントプールにロードされます。 は (classファイルのコンスタントプールの文字列は) > classロード時に(存在してなければ)Stringのインスタンスとして(ヒープ上に)ロードされ > そのStringインスタンスへの参照がクラスの実行時コンスタントプールに保持されます。 と書くべきでした。長いけど。 >>491 ソースコード上のStringリテラル由来の文字列(Stringのインスタンス)はクラスに紐付いているので、 クラスがアンロードされない限りヒープ上に確保され続けるのはその通りです。 ただ、「メモリを節約するために」文字列を外部化する、というのは一般的にはおすすめできません。 (もちろん、国際化対応などを考えると意味が無いわけではありませんが) 一応初心者スレなので、 他の方が「文字列って無駄にメモリを消費してるんだ」などと思い込んでほしくはないので、 念の為に書いておきます。 >>495 詳しくありがとうございます > ただ、「メモリを節約するために」文字列を外部化する、というのは一般的にはおすすめできません。 これは、UIやグラフィクスのメモリ消費に対して、文字列の消費するメモリが大した量でないという意味でしょうか? Java の String はヒープ中では UTF-16 ですから、基本的には1文字 2byte、100文字200byte くらい、 ヘルプメッセージとかエラーメッセージとか、100文字1000個くらいあったら、20MB くらいですか もちろん、クラスが使われなくなったらアンロードもされるかもしれないですが(アンロードの周期などの実装仕様は詳しく知らないです) --- ちなみに上記の文字数が294文字でした ググレカス 少しは質問する前に自分で試すかググったらどうだ?ん? 幼稚園児かお前は?ん? クラスローダーの超基本的な動作すらわかってない奴等同士でレスつけてるから 間違ったことを延々とレス合ってるのが滑稽すぎて楽しいねw なんだよクラスのアンロードってw ggrks SwingWorkerクラスを繰り返し使うと10個デーモンスレッドができるんですけど、なんで1個だけじゃないんですか? インスタンスを破棄するのを忘れているせいでしょうか?でも10回以上実行しても10個以上になりません。 >>503 内部的に ExecutorService 使ってるから、何個も同時にexecute すれば、スレッドは1個じゃないよん! System.out.println(Thread.currentThread().getName()); で通し番号的なの見れるから、確認したいならおすすめだよん!! new ThreadPoolExecutor(MAX_WORKER_THREADS, MAX_WORKER_THREADS, 10L, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>(), threadFactory); この部分が SwingWorker の ExecutorService 実装の部分だよ! スレッドプールを使ってて、10個のスレッドをプールして使うようになってるね!! すぐ終了する Worker 走らせても、スレッドプールは次のタスクに備えるために、スレッドを10個まで残しておくよ! クラスのアンロードとか言ってるアホは回答側にまわってはいけない 回答したくても自重するように と思ったら質問厨のアホか 君の回答は全部間違ってるので絶対に回答側にまわってはいけない 今後質問もしてはいけない ググって勉強 そもそもだな 初心者と初心者未満がマルチスレッドプログラミングをしてはいけない ハロワの求職者支援訓練に40代向けのJava講座あるんだけどプログラミングっておっさんでも始められるもんなん? プログラミングを始めるだけなら簡単 IT企業への就職の方がよっぽど難しい >>512 IT業務は人手不足って聞いたけどそれでも高齢だと就職難しい? >>514 そうですか、挑戦してみてもいいですかね。ありがとうございます >>515 挑戦した方がいいと思うよ 待遇とかは自分の価値観で評価するものだから >>516 なるほど。そうですよね。一度やってみます >>506 ありがとうございます。正常な動作なんですね。安心しました。 >>491 https://www.baeldung.com/java-string-pool#strings-allocated-using-the-constructor 回答間違いっぽくない? Java7 以前は、StringリテラルがGCされることはなかったけど、 それ以降は、String リテラルは参照がなくなったらGCされる あと、Java9 以降は、ヒープ上の文字コードもUTF-16だけじゃなくなってるね 一個適当な String リテラル使う Java のプログラム走らせて、参照消したあと System.gc() する 別のプログラムから、JNA経由とかで Kernel32の ReadProcessMemory で Java のメモリ読んで文字列の有無を確認 とかも面白そう チートエンジンとかでも出来るんかな あと、クラスのアンロードは、クラスローダの参照とインスタンスへの参照が全部なくならないとアンロードされない システムクラスローダとかからロードしてるクラスの場合、一度読んだクラスはアンロードされない >>521 クラスがロードされる時に(classファイルの)コンスタントプールから(既存でなければ)生成されるStringインスタンスは、 クラスがそのStringインスタンスへの参照を(実行時コンスタントプールに)保持しているので、 そのクラスが生存している(アンロードされない)限り、 GCで回収の対象にはなりません。 (回収されてしまったら大変) >>524 https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-3.html#jvms-3.4 > Data of types int, long, float, and double, as well as references to instances of class String, are managed using the ldc, ldc_w, and ldc2_w instructions. [references to instance of class String] って書いてあるし、実体はそこに無いんじゃないの? String pool の色んな説明見ても、String literal はGCされるって結論づけられてるのがほとんど Run-time Constant Pool の説明見ても、単なる Symbol Table で、メモリ上の実体がそこにあるわけじゃないように思うんだけど あぁごめん、参照で持ってるからこそプール上の String がGCされないって言ってるのか https://stackoverflow.com/a/2433076 このコード実行してみて、System.gc() をコメントアウトしたときと比べてみると、やっぱり String Literal って GC されてるんじゃない? new String してるんだけど、intern してるから、プール上の String が GC されてる証拠って言えるよねこれ なんどもすまん、でも、リテラルで持ってるわけじゃないのかこのプログラム new String のところを、new String("fkasdjf;lsdkjfasdljfdlkfjadsfjsad;kljfadjfkdas;") とかってすると、System.gc しても結局全部同じ値返したわ ということは、ソースコードにリテラル直接書き込むと、クラス自体がアンロードされない限りやっぱりプールにずっと残るんか うーん、もうちょっといろいろ試してみよう… >>526 そうです。 >>489 が雑すぎました、すみません。 StringリテラルがStringインスタンスとしてロードされるのは自明じゃろ、 からの雑な省略でいい加減過ぎました。 >>527 すみません、乗りかかった舟なので。 でもスレを見返してもらえばわかるようにこんな話題は典型的じゃないですよ。 基本がわかってないからゴミみたいな駄レスでスレを消費するアホども いまだにクラスのアンロードとか言ってるしw スレを荒らすなゴミども SNSでやれゴミ >>529 「Stringリテラル」ってのはその "fkasdjf;lsdkjfasdljfdlkfjadsfjsad;kljfadjfkdas;" の部分です。 >>528 はStringリテラルを持たずにStringインスタンスを生成してintern()して、 intern()されたStringインスタンス(Stringプール入り)でもガベコレされるねっていう例でしょう。 >>529 の様にStringリテラルをベースにStringインスタンスをnewすると、 同じ文字列のStringインスタンス(ロード時にintern()されてStringプールに確保されている)がすでに存在するので、 新しいStringインスタンスをintern()した結果はStringリテラルからのインスタンスが返されます。 Stringリテラルのインスタンスはクラスが参照を保持しているのでGCで回収されないので、 何回 new String("fkasdjf;lsdkjfasdljfdlkfjadsfjsad;kljfadjfkdas;").intern() しても同じインスタンスが得られます。 >>532 なるほどです すみません、同じことを言い直させてしまいましたね カスタムクラスローダ作って、参照を消してクラスをアンロードするってのが コード中の文字列リテラルをGCさせられる唯一の方法ってことになるんですかね ヒアドキュメントがJavaにもそのうち来ますし、 この辺ちょっと気になってたので詳しく調べられて良かったです ありがとうございました 3行で説明できることをよくまぁここまでゴミレスの長文合戦できるもんだな そして最後まで何も理解してないっていう こんな奴等に正解を教えてやったところで何も成長しないだろう ほんと酷いね >>537 ま、いいってことよ 今度から気をつけろよ 特に仕事を請けるときはこういう言葉の罠に気をつけな 何文字になっても良いから3行で説明してみろよ、おん? >>527 ここはプログラム板で素人がどうこう言うところではない。 >>527 40代から始めても資格を取ったり意欲的なことしないと誰も相手はしないよ。 あとは経歴の偽装を強要されてどこかの現場に押し込まれる。 メモリ領域の区別、classファイル、実態 クラスローダーがこれらをどういう風に割り当てるかっていう基本的なことを理解してれば 上のような意味不明で何も理解してない疑問は出てこないんだよね 何も理解してないのに理解したつもりになってわからないことを背伸びして知ろうとするから アホみたいな駄文の応酬を繰り広げる ググれカス 何回も言わせるな 未経験からの新人研修中で上司にいびられてストレス発散ってところか多分 自分が言われたことをそのままスレでリピートしてる クラスのアンロードも知らんようだし、基本的なことも理解してなさそう 自分の馬鹿を棚に上げて妄想に逃げるのは勝手だが 間違ったレスを延々と繰り返してスレを荒らすなゴミ あとクラスのアンロードなんていうものはないアホ どこでこんな間違った知識拾って来たのか知らんけど 完全に理解した人の説明が見てみたいです (どうせ無理だろうけど) それはGCがクラスを破棄する可能性を示唆することを説明しただけであって ブートストラップクラスローダーはアンロードしないことを説明してんだよ 自分で貼ったリンクも理解せずにドヤ顔で貼ってどんだけ馬鹿なんだお前 アホ 理解してないのに理解したつもり 英語読めないのに英語のドキュメントを貼る プログラムの勉強始めたばかりの中学生だろうけど ここはガキの遊び場じゃないからSNSでやれ アホ >>550 これは恥ずかしい >>500 ,507,545で概念自体が存在しないかのような口振りだったのにいざソースを出されると苦しすぎる言い訳だな 何言ってんだコイツ?ガチもんの池沼か? クラスのアンロードなんてねーからキチガイ こういう風に単語の断片だけ拾って クラスローダーがさもクラスをアンロードするかのように嘘の説明をして 初心者未満同士で駄文をまき散らしてスレを荒らす 君たちのような池沼用にツイッターとかあるんだからそっちでやろうな 仕様に思いっきりそのままの言葉で載ってるものを存在しないよばわり さすがに言い訳が見苦しすぎる 3連投とかどんだけ悔しかったんだよ お前が見苦しすぎてこっちがこっぱずかしいわキチガイ おまえが取り上げてるのは単語だけだアホ 今まで散々間違った説明したあげく自分で何も理解してないリンク貼って 今度は開き直ってるし ここはおまえのようなキチガイが居て良い場所ではない 何回でも言うが「クラスのアンロードなんてものはない」 即刻立ち去れゴミ どっちの言い分が正しいのか? http://www.nminoru.jp/ ~nminoru/java/class_unloading.html そもそも間違い指摘してやって開き直るとか どんだけキチガイなんだこいつ そんでゴミ同士で間違ったレスの応酬ずっとしてんのなw 逝って良し アホ 連続レスも、返信ないのに1時間、2時間と時間空いててどんだけイライラしてるか伝わってくるようだな その上批判的なレスがあったら即レス 他にすること無いんかお前、さすがにもう少し時間有意義に使った方がいいぞ イライラがどうとか言い訳とか話題逸らしして逃げるのは勝手だけど だらだらと負け犬の遠吠えのごとく駄文レスつけてないで 自分の頭の悪さがわかったらとっととSNSにでも帰れよキチガイ初心者未満は > GCがクラスを破棄する可能性 それがクラスのアンロードそのものでは 仕様にもそう書いてある それを存在しないって言っといてブートストラップクラスローダはアンロードしないとか無理筋すぎる 可能性の話だし永続領域に読込まれたクラスが破棄されるなんてことがあったら javaプログラム自体が破綻する つまりアンロードなんてない そんなことも理解してないのにさもクラスがアンロードされるみたいな風に書いてるから馬鹿にされるんだよ 何回同じレスさせるんだろうこのチンパン君は 間違いを指摘してやって〜とか言ってるけど、この人わめき散らすだけで何一つ技術的な指摘はしてないよね 唯一したのが、「クラスのアンロードなんていうものはない」という間違った指摘 技術的な話なしで煽ってるだけなのに知識の浅さ露呈するとか天才かよ っつーかおまえ自分で貼ったリンク読めないのに何言ってんの感じなんだけど モンスター初心者にもほどがあるわ アンロードしないっておもいっきり書いてんだよアホ 英語読めないのにカッコつけて「仕様に書いてる!(キリッ」 じゃねーよアホ 頭逝かれてすぎだろキチガイ 傍観してたけど、この人って前からずっとスレにいるの? ググれカスさんが居座るようならさすがに誰にとっても得がないので、ワッチョイかIPスレ建てるしかないのでは やんわりと間違い指摘してやっても逆ギレして噛みついてくるんだからどうしようもないやん さらには間違いを間違いと認めずこっちが間違ってるかのようなレスつけて 言い訳がーとかイライラガーとか言ってくるんだから手に負えない 自分で持ち出したリンクの中身すら読んでないまたは読めない もう病気だと思うけどねこの手の初心者は なんでこう基本すらわかってない奴が背伸びして 全く理解できないドキュメント読んだり引っ張ってくるかね 頭大丈夫? こういうプライドだけ異様に高くて、自分の間違いを絶対認めないやつって仕事でマジで使えない まともに仕事できてたら一日中スレにはりついて顔真っ赤にしてないだろうけど ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる